@@ -6,8 +6,11 @@ SHELL := /usr/bin/bash
66ECHO := /usr/bin/echo
77MAKEFLAGS := --no-print-directory
88SBS_MODULE_PATH := $(shell pwd)
9- SBS_BASE_MAKEFILE := $(firstword $(MAKEFILE_LIST ) )
10- SBS_VERSION := 0.5.0
9+ SBS_VERSION := 0.6.0
10+
11+ # Set the default target to 'all'. Make just picks up the first non empty
12+ # target (or such). Here we make sure we control the make behavior.
13+ .DEFAULT_GOAL := all
1114
1215# If no module name is defined use the directory as the name
1316SBS_MODULE_NAME := $(MODULE_NAME )
@@ -16,11 +19,9 @@ SBS_MODULE_NAME := $(notdir $(SBS_MODULE_PATH))
1619endif
1720
1821# Start with empty targets, lets see what the module's Makefile has for us
19- SBS_EMPTY_TARGET := sbs_empty_target
20- $(SBS_EMPTY_TARGET ) :
22+ SBS_EMPTY_TGT := sbs_empty_target
23+ $(SBS_EMPTY_TGT ) :
2124 @true
22- SBS_CLEAN_TARGET := $(SBS_EMPTY_TARGET )
23- SBS_MAIN_TARGET := $(SBS_EMPTY_TARGET )
2425
2526# ######################## Binary build start #########################
2627ifneq ($(MODULE_SRCS ) ,)
@@ -188,7 +189,9 @@ SBS_INC_DIRS := $(MODULE_INCLUDE_DIRS)
188189SBS_INC_DIRS += $(addprefix $(SBS_PROJ_ROOT ) /,$(MODULE_PROJECT_INCLUDE_DIRS ) )
189190
190191ifeq ($(MODULE_CFLAGS_OVERRIDE ) ,)
191- SBS_CFLAGS += $(addprefix -W,$(SBS_CWARNS ) ) $(addprefix -D,$(SBS_CDEFS ) ) $(addprefix -I,$(SBS_INC_DIRS ) )
192+ SBS_CFLAGS += $(addprefix -W,$(SBS_CWARNS ) )
193+ SBS_CFLAGS += $(addprefix -D,$(SBS_CDEFS ) )
194+ SBS_CFLAGS += $(addprefix -I,$(SBS_INC_DIRS ) )
192195else
193196SBS_CFLAGS := $(MODULE_CFLAGS_OVERRIDE )
194197endif
@@ -219,10 +222,7 @@ ifneq ($(filter 1,$(MODULE_VERBOSE)),1)
219222SBS_Q := @
220223endif
221224
222- # The empty target is added as an ordered dependency so the binary rule
223- # will always require *something* to do. This way we can suppress the 'up to date'
224- # messages without silencing the entire build output.
225- $(SBS_ARTIFACT ) : $(SBS_OBJS ) $(MODULE_EXTERN_OBJS ) $(MAKEFILE_LIST ) $(MODULE_BIN_DEPS ) | $(SBS_EMPTY_TARGET )
225+ $(SBS_ARTIFACT ) : $(SBS_OBJS ) $(MODULE_EXTERN_OBJS ) $(MAKEFILE_LIST ) $(MODULE_BIN_DEPS )
226226ifneq ($(SBS_BIN_TYPE ) , $(SBS_NONE_BIN_TYPE ) )
227227 @mkdir -p $(SBS_ARTIFACT_DIR)
228228 $(if $(SBS_Q),@$(ECHO) -e "$(SBS_LD_STR)\t$(notdir $@)")
231231.PHONY : $(SBS_ARTIFACT )
232232endif
233233
234+ SBS_MAIN_TGT := $(SBS_ARTIFACT )
235+
234236# $1 - source suffix
235237# $2 - compiler print string (SBS_CC or CXX)
236238# $3 - compiler binary (gcc or g++)
@@ -256,79 +258,93 @@ ifneq ($(MAKECMDGOALS),clean)
256258-include $(SBS_OBJS_DEPS )
257259endif
258260
259- SBS_CLEAN_FILES := $(SBS_OBJS ) $(SBS_OBJS_DEPS )
261+ SBS_CLN_FILES := $(SBS_OBJS ) $(SBS_OBJS_DEPS )
260262ifneq ($(SBS_BIN_TYPE ) , $(SBS_NONE_BIN_TYPE ) )
261- SBS_CLEAN_FILES += $(SBS_ARTIFACT )
263+ SBS_CLN_FILES += $(SBS_ARTIFACT )
262264endif
263- $(SBS_ARTIFACT ) _clean :
264- $(SBS_Q ) rm -f $(SBS_CLEAN_FILES )
265265
266- SBS_MAIN_TARGET := $(SBS_ARTIFACT )
267- SBS_CLEAN_TARGET := $(SBS_ARTIFACT ) _clean
266+ SBS_ARTIFACT_CLN_TGT := $(SBS_ARTIFACT ) _clean
267+ $(SBS_ARTIFACT_CLN_TGT ) :
268+ $(SBS_Q ) rm -f $(SBS_CLN_FILES )
268269
269270endif # None empty target
270271# ######################## Binary build end #########################
272+ SBS_ALL_SUB_MODULES := $(MODULE_SUB_MODULES ) $(MODULE_PRE_SUB_MODULES ) $(MODULE_POST_SUB_MODULES )
271273
272- ifneq ($(MODULE_SUB_MODULES ) ,)
273- $(MODULE_SUB_MODULES ) :
274- @$(MAKE ) -C $@
274+ SBS_BUILD_DEPS := $(MODULE_EXT_DEPS )
275275
276- SBS_CLEAN_SUFFIX := __clean
277- SBS_SUBMODULES_CLEAN := $(addsuffix $(SBS_CLEAN_SUFFIX ) ,$(MODULE_SUB_MODULES ) )
278- $(SBS_SUBMODULES_CLEAN ) :
279- @$(MAKE ) -C $(@:$(SBS_CLEAN_SUFFIX ) = ) clean
276+ # Build dependencies rules
277+ BUILD_TITLE_TGT := SBS_BUILD_TITLE
278+ SBS_BUILD_TITLE :
279+ @$(ECHO ) " Building $( SBS_MODULE_NAME) "
280+
281+ .PHONY : all $(SBS_ALL_SUB_MODULES ) $(BUILD_TITLE_TGT )
282+ # $1 - modules list
283+ # $2 - 1 if it's a SBS target 0 if external pre/post build target
284+ # Add the moudules to the dependencies list after rule is set, so following rules depend on them
285+ define GenSubModuleRule
286+ ifneq ($1,)
287+ $1 : $$(SBS_BUILD_DEPS ) $$(MAKEFILE_LIST )
288+ ifeq ($2,1)
289+ @$(MAKE) -C $$@
290+ endif
291+ SBS_BUILD_DEPS += $1
280292endif
293+ endef
281294
282- # Set the default target to 'all'. Make just picks up the first non empty
283- # target (or such). Here we make sure we control the make behavior.
284- .DEFAULT_GOAL := all
285- .PHONY : all clean $(SBS_CLEAN_TARGET )
286- .PHONY : $(MODULE_PRE_SUB_MODULES ) $(MODULE_SUB_MODULES ) $(MODULE_POST_SUB_MODULES ) $(SBS_SUBMODULES_CLEAN )
295+ $(eval $(call GenSubModuleRule,$(MODULE_PRE_BUILD),0))
296+ $(eval $(call GenSubModuleRule,$(MODULE_PRE_SUB_MODULES),1))
297+ $(SBS_MAIN_TGT ) : $(SBS_BUILD_DEPS )
298+ $(eval $(call GenSubModuleRule,$(MODULE_SUB_MODULES),1))
299+ SBS_BUILD_DEPS += $(SBS_MAIN_TGT )
300+ $(eval $(call GenSubModuleRule,$(MODULE_POST_SUB_MODULES),1))
301+ $(eval $(call GenSubModuleRule,$(MODULE_POST_BUILD),0))
302+
303+ all : $(SBS_BUILD_DEPS )
304+ @true
305+ $(SBS_BUILD_DEPS ) all : $(BUILD_TITLE_TGT )
306+
307+ # Clean dependencies rules
308+ CLN_TITLE_TGT := SBS_CLEAN_TITLE
309+ $(CLN_TITLE_TGT ) :
310+ @$(ECHO ) " Cleaning $( SBS_MODULE_NAME) "
287311
288- SBS_BUILD_ORDER := $( strip $( MODULE_PRE_BUILD ) $( MODULE_PRE_SUB_MODULES ) )
289- ifneq ($(SBS_ARTIFACT ) ,)
290- SBS_BUILD_ORDER := $( strip $( SBS_BUILD_ORDER ) $(strip $( SBS_MODULE_NAME ) ) )
312+ SBS_CLN_TGT := clean
313+ ifneq ($(MODULE_PRE_CLN ) ,)
314+ $( SBS_CLN_TGT ) : $(MODULE_PRE_CLN )
291315endif
292- SBS_BUILD_ORDER := $(strip $(SBS_BUILD_ORDER ) $(strip $(MODULE_SUB_MODULES ) ) )
293- SBS_BUILD_ORDER := $(strip $(SBS_BUILD_ORDER ) $(strip $(MODULE_POST_BUILD ) $(MODULE_POST_SUB_MODULES ) ) )
294- ifneq ($(SBS_BUILD_ORDER ) ,$(SBS_MODULE_NAME ) )
295- ifneq ($(SBS_BUILD_ORDER ) ,)
296- SBS_ORDER_STR := " order=[$(SBS_BUILD_ORDER ) ]"
316+
317+ SBS_CLN_SUFFIX := __clean
318+ SBS_SUB_MODULES_CLN_TGTS := $(addsuffix $(SBS_CLN_SUFFIX ) ,$(SBS_ALL_SUB_MODULES ) )
319+ .PHONY : $(SBS_SUB_MODULES_CLN_TGTS ) $(SBS_CLN_TGT ) $(CLN_TITLE_TGT )
320+ ifneq ($(SBS_ALL_SUB_MODULES ) ,)
321+ $(SBS_SUB_MODULES_CLN_TGTS ) :
322+ @$(MAKE ) -C $(@:$(SBS_CLN_SUFFIX ) = ) $(SBS_CLN_TGT )
297323endif
324+
325+ ifneq ($(MODULE_POST_CLN ) ,)
326+ $(MODULE_POST_CLN ) : $(MODULE_PRE_CLN ) $(SBS_CLN_TGT ) $(SBS_SUB_MODULES_CLN_TGTS )
298327endif
299328
329+ SBS_ALL_CLN_TGTS := $(MODULE_PRE_CLN ) $(SBS_ARTIFACT_CLN_TGT ) $(SBS_SUB_MODULES_CLN_TGTS ) $(MODULE_POST_CLN )
300330
301- define SbsForEach
302- for t in $(1 ) ; do $(2 ) $$t $(3 ) || exit $$? ; done
303- endef
331+ $(SBS_CLN_TGT ) : $(SBS_ALL_CLN_TGTS )
332+ @true
304333
305- all :
306- @echo " Building '$( SBS_MODULE_NAME) '$( SBS_ORDER_STR) "
307- @$(call SbsForEach,$(MODULE_PRE_BUILD ) ,$(MAKE ) -f $(SBS_BASE_MAKEFILE ) )
308- @$(call SbsForEach,$(MODULE_PRE_SUB_MODULES ) ,$(MAKE ) -C)
309- @$(MAKE ) -f $(SBS_BASE_MAKEFILE ) $(SBS_MAIN_TARGET ) $(MODULE_SUB_MODULES )
310- @$(call SbsForEach,$(MODULE_POST_SUB_MODULES ) ,$(MAKE ) -C)
311- @$(call SbsForEach,$(MODULE_POST_BUILD ) ,$(MAKE ) -f $(SBS_BASE_MAKEFILE ) )
312-
313- clean :
314- @echo " Cleaning '$( SBS_MODULE_NAME) '$( SBS_ORDER_STR) "
315- @$(call SbsForEach,$(MODULE_PRE_CLEAN ) ,$(MAKE ) -f $(SBS_BASE_MAKEFILE ) )
316- @$(call SbsForEach,$(MODULE_PRE_SUB_MODULES ) ,$(MAKE ) -C, clean)
317- @$(MAKE ) -f $(SBS_BASE_MAKEFILE ) $(SBS_CLEAN_TARGET ) $(SBS_SUBMODULES_CLEAN )
318- @$(call SbsForEach,$(MODULE_POST_SUB_MODULES ) ,$(MAKE ) -C, clean)
319- @$(call SbsForEach,$(MODULE_POST_CLEAN ) ,$(MAKE ) -f $(SBS_BASE_MAKEFILE ) )
334+ $(SBS_ALL_CLN_TGTS ) : $(CLN_TITLE_TGT )
320335
336+ # Debug targets
321337sbs_version :
322- @echo SBS version $(SBS_VERSION )
338+ @$( ECHO ) SBS version $(SBS_VERSION )
323339
324340define SbsDbgTitle
325341 TITLE="$(1 ) "; \
326342 COND_VALUE="$(2 ) "; \
327343 COND_VALUE="$${COND_VALUE# "$${COND_VALUE%%[![:space:]]*}"}"; \
328344 if [[ -z $${SBS_DBG_TERMS} && -n $${COND_VALUE} ]]; then \
329- echo ; \
330- echo $${TITLE} ;\
331- echo $${TITLE//?/=} ;\
345+ $(ECHO) ; \
346+ $(ECHO) $${TITLE} ;\
347+ $(ECHO) $${TITLE//?/=} ;\
332348 fi
333349endef
334350
@@ -349,7 +365,7 @@ define SbsDbgVar
349365endef
350366
351367sbs_dump_module_vars :
352- @echo $(SBS_FORCE_DBG )
368+ @$( ECHO ) $(SBS_FORCE_DBG )
353369 @$(call SbsDbgTitle,Base Module Settings,Always)
354370 @$(call SbsDbgVar,MODULE_NAME)
355371 @$(call SbsDbgVar,MODULE_SRCS)
@@ -384,11 +400,11 @@ sbs_dump_module_submodules:
384400
385401sbs_dump_module_build_steps :
386402 @$(call SbsDbgTitle,Build Steps,\
387- $(MODULE_PRE_BUILD ) $(MODULE_POST_BUILD ) $(MODULE_PRE_CLEAN ) $(MODULE_POST_CLEAN ) )
403+ $(MODULE_PRE_BUILD ) $(MODULE_POST_BUILD ) $(MODULE_PRE_CLN ) $(MODULE_POST_CLN ) )
388404 @$(call SbsDbgVar,MODULE_PRE_BUILD)
389405 @$(call SbsDbgVar,MODULE_POST_BUILD)
390- @$(call SbsDbgVar,MODULE_PRE_CLEAN )
391- @$(call SbsDbgVar,MODULE_POST_CLEAN )
406+ @$(call SbsDbgVar,MODULE_PRE_CLN )
407+ @$(call SbsDbgVar,MODULE_POST_CLN )
392408
393409sbs_dump_module : sbs_dump_module_vars sbs_dump_module_submodules sbs_dump_module_build_steps
394410
@@ -397,13 +413,12 @@ sbs_dump_internals:
397413 @$(call SbsDbgVar,SBS_MODULE_NAME)
398414 @$(call SbsDbgVar,SBS_MODULE_PATH)
399415 @$(call SbsDbgVar,SBS_PROJ_ROOT)
400- @$(call SbsDbgVar,SBS_BASE_MAKEFILE)
401416 @$(call SbsDbgVar,SBS_VERSION)
402417 @$(call SbsDbgTitle,Build Settings,Always)
403418 @$(call SbsDbgVar,SBS_BIN_TYPE)
404419 @$(call SbsDbgVar,SBS_FLAV)
405- @$(call SbsDbgVar,SBS_MAIN_TARGET )
406- @$(call SbsDbgVar,SBS_CLEAN_TARGET )
420+ @$(call SbsDbgVar,SBS_MAIN_TGT )
421+ @$(call SbsDbgVar,SBS_CLN_TGT )
407422 @$(call SbsDbgVar,SBS_SRCS)
408423 @$(call SbsDbgVar,SBS_CDEFS)
409424 @$(call SbsDbgVar,SBS_CWARNS)
0 commit comments