@@ -7,7 +7,7 @@ ECHO := /usr/bin/echo
77MAKEFLAGS := --no-print-directory
88SBS_MODULE_PATH := $(shell pwd)
99SBS_BASE_MAKEFILE := $(firstword $(MAKEFILE_LIST ) )
10- SBS_VERSION := 0.5 .0
10+ SBS_VERSION := 0.6 .0
1111
1212# If no module name is defined use the directory as the name
1313SBS_MODULE_NAME := $(MODULE_NAME )
@@ -16,11 +16,9 @@ SBS_MODULE_NAME := $(notdir $(SBS_MODULE_PATH))
1616endif
1717
1818# 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 ) :
19+ SBS_EMPTY_TGT := sbs_empty_target
20+ $(SBS_EMPTY_TGT ) :
2121 @true
22- SBS_CLEAN_TARGET := $(SBS_EMPTY_TARGET )
23- SBS_MAIN_TARGET := $(SBS_EMPTY_TARGET )
2422
2523# ######################## Binary build start #########################
2624ifneq ($(MODULE_SRCS ) ,)
@@ -219,10 +217,7 @@ ifneq ($(filter 1,$(MODULE_VERBOSE)),1)
219217SBS_Q := @
220218endif
221219
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 )
220+ $(SBS_ARTIFACT ) : $(SBS_OBJS ) $(MODULE_EXTERN_OBJS ) $(MAKEFILE_LIST ) $(MODULE_BIN_DEPS )
226221ifneq ($(SBS_BIN_TYPE ) , $(SBS_NONE_BIN_TYPE ) )
227222 @mkdir -p $(SBS_ARTIFACT_DIR)
228223 $(if $(SBS_Q),@$(ECHO) -e "$(SBS_LD_STR)\t$(notdir $@)")
231226.PHONY : $(SBS_ARTIFACT )
232227endif
233228
229+ SBS_MAIN_TGT := $(SBS_ARTIFACT )
230+
234231# $1 - source suffix
235232# $2 - compiler print string (SBS_CC or CXX)
236233# $3 - compiler binary (gcc or g++)
@@ -256,68 +253,84 @@ ifneq ($(MAKECMDGOALS),clean)
256253-include $(SBS_OBJS_DEPS )
257254endif
258255
259- SBS_CLEAN_FILES := $(SBS_OBJS ) $(SBS_OBJS_DEPS )
256+ SBS_CLN_FILES := $(SBS_OBJS ) $(SBS_OBJS_DEPS )
260257ifneq ($(SBS_BIN_TYPE ) , $(SBS_NONE_BIN_TYPE ) )
261- SBS_CLEAN_FILES += $(SBS_ARTIFACT )
258+ SBS_CLN_FILES += $(SBS_ARTIFACT )
262259endif
263- $(SBS_ARTIFACT ) _clean :
264- $(SBS_Q ) rm -f $(SBS_CLEAN_FILES )
265260
266- SBS_MAIN_TARGET := $(SBS_ARTIFACT )
267- SBS_CLEAN_TARGET := $(SBS_ARTIFACT ) _clean
261+ SBS_CLN_TGT := $(SBS_ARTIFACT ) _clean
262+ $(SBS_CLN_TGT ) :
263+ $(SBS_Q ) rm -f $(SBS_CLN_FILES )
268264
269265endif # None empty target
270266# ######################## Binary build end #########################
271-
272- ifneq ($(MODULE_SUB_MODULES ) ,)
273- $(MODULE_SUB_MODULES ) :
274- @$(MAKE ) -C $@
275-
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
280- endif
281-
282267# Set the default target to 'all'. Make just picks up the first non empty
283268# target (or such). Here we make sure we control the make behavior.
284269.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 )
270+ SBS_ALL_SUB_MODULES := $(MODULE_SUB_MODULES ) $(MODULE_PRE_SUB_MODULES ) $(MODULE_POST_SUB_MODULES )
287271
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 ) ) )
272+ SBS_BUILD_DEPS := $(strip $(SBS_BASE_MAKEFILE ) $(MODULE_EXT_DEPS ) )
273+
274+ # Build dependencies rules
275+ BUILD_TITLE_TGT := SBS_BUILD_TITLE
276+ $(BUILD_TITLE_TGT ) :
277+ @$(ECHO ) " Building $( SBS_MODULE_NAME) "
278+
279+ .PHONY : all $(SBS_ALL_SUB_MODULES ) $(BUILD_TITLE_TGT )
280+ # $1 - modules list
281+ # $2 - 1 if it's a SBS target 0 if external pre/post build target
282+ # Add the moudules to the dependencies list after rule is set, so following rules depend on them
283+ define GenSubModuleRule
284+ ifneq ($1,)
285+ $1 : $$(SBS_BUILD_DEPS )
286+ ifeq ($2,1)
287+ @$(MAKE) -C $$@
291288endif
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 ) ]"
289+ SBS_BUILD_DEPS += $1
290+ endif
291+ endef
292+
293+ $(eval $(call GenSubModuleRule,$(MODULE_PRE_BUILD),0))
294+ $(eval $(call GenSubModuleRule,$(MODULE_PRE_SUB_MODULES),1))
295+ $(SBS_MAIN_TGT ) : $(SBS_BUILD_DEPS )
296+ $(eval $(call GenSubModuleRule,$(MODULE_SUB_MODULES),1))
297+ SBS_BUILD_DEPS += $(SBS_MAIN_TGT )
298+ $(eval $(call GenSubModuleRule,$(MODULE_POST_SUB_MODULES),1))
299+ $(eval $(call GenSubModuleRule,$(MODULE_POST_BUILD),0))
300+
301+ all : $(SBS_BUILD_DEPS )
302+ @true
303+ $(SBS_BUILD_DEPS ) all : $(BUILD_TITLE_TGT )
304+
305+ # Clean dependencies rules
306+ CLN_TITLE_TGT := SBS_CLEAN_TITLE
307+ $(CLN_TITLE_TGT ) :
308+ @$(ECHO ) " Cleaning $( SBS_MODULE_NAME) "
309+
310+ ifneq ($(MODULE_PRE_CLN ) ,)
311+ clean : $(MODULE_PRE_CLN )
297312endif
313+
314+ SBS_CLN_TGT := clean
315+ SBS_CLN_SUFFIX := __clean
316+ SBS_SUB_MODULES_CLN_TGTS := $(addsuffix $(SBS_CLN_SUFFIX ) ,$(SBS_ALL_SUB_MODULES ) )
317+ .PHONY : $(SBS_SUB_MODULES_CLN_TGTS ) $(SBS_CLN_TGT ) $(CLN_TITLE_TGT )
318+ ifneq ($(SBS_ALL_SUB_MODULES ) ,)
319+ $(SBS_SUB_MODULES_CLN_TGTS ) :
320+ @$(MAKE ) -C $(@:$(SBS_CLN_SUFFIX ) = ) $(SBS_CLN_TGT )
298321endif
299322
323+ ifneq ($(MODULE_POST_CLN ) ,)
324+ $(MODULE_POST_CLN ) : $(MODULE_PRE_CLN ) $(SBS_CLN_TGT ) $(SBS_SUB_MODULES_CLN_TGTS )
325+ endif
300326
301- define SbsForEach
302- for t in $(1 ) ; do $(2 ) $$t $(3 ) || exit $$? ; done
303- endef
327+ SBS_ALL_CLN_TGTS := $(MODULE_PRE_CLN ) $(SBS_CLN_TGT ) $(SBS_SUB_MODULES_CLN_TGTS ) $(MODULE_POST_CLN )
304328
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 ) )
329+ clean : $(SBS_ALL_CLN_TGTS )
330+ @true
331+ $(SBS_ALL_CLN_TGTS ) : $(CLN_TITLE_TGT )
320332
333+ # Debug targets
321334sbs_version :
322335 @echo SBS version $(SBS_VERSION )
323336
@@ -384,11 +397,11 @@ sbs_dump_module_submodules:
384397
385398sbs_dump_module_build_steps :
386399 @$(call SbsDbgTitle,Build Steps,\
387- $(MODULE_PRE_BUILD ) $(MODULE_POST_BUILD ) $(MODULE_PRE_CLEAN ) $(MODULE_POST_CLEAN ) )
400+ $(MODULE_PRE_BUILD ) $(MODULE_POST_BUILD ) $(MODULE_PRE_CLN ) $(MODULE_POST_CLN ) )
388401 @$(call SbsDbgVar,MODULE_PRE_BUILD)
389402 @$(call SbsDbgVar,MODULE_POST_BUILD)
390- @$(call SbsDbgVar,MODULE_PRE_CLEAN )
391- @$(call SbsDbgVar,MODULE_POST_CLEAN )
403+ @$(call SbsDbgVar,MODULE_PRE_CLN )
404+ @$(call SbsDbgVar,MODULE_POST_CLN )
392405
393406sbs_dump_module : sbs_dump_module_vars sbs_dump_module_submodules sbs_dump_module_build_steps
394407
@@ -402,8 +415,8 @@ sbs_dump_internals:
402415 @$(call SbsDbgTitle,Build Settings,Always)
403416 @$(call SbsDbgVar,SBS_BIN_TYPE)
404417 @$(call SbsDbgVar,SBS_FLAV)
405- @$(call SbsDbgVar,SBS_MAIN_TARGET )
406- @$(call SbsDbgVar,SBS_CLEAN_TARGET )
418+ @$(call SbsDbgVar,SBS_MAIN_TGT )
419+ @$(call SbsDbgVar,SBS_CLN_TGT )
407420 @$(call SbsDbgVar,SBS_SRCS)
408421 @$(call SbsDbgVar,SBS_CDEFS)
409422 @$(call SbsDbgVar,SBS_CWARNS)
0 commit comments