Skip to content

Commit 0f57c1b

Browse files
committed
~~~WIP~~~ 0.6
Signed-off-by: Omer Caspi <[email protected]>
1 parent 473d325 commit 0f57c1b

File tree

1 file changed

+81
-66
lines changed

1 file changed

+81
-66
lines changed

module.inc.mk

Lines changed: 81 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ SHELL := /usr/bin/bash
66
ECHO := /usr/bin/echo
77
MAKEFLAGS := --no-print-directory
88
SBS_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
1316
SBS_MODULE_NAME := $(MODULE_NAME)
@@ -16,11 +19,9 @@ SBS_MODULE_NAME := $(notdir $(SBS_MODULE_PATH))
1619
endif
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 #########################
2627
ifneq ($(MODULE_SRCS),)
@@ -188,7 +189,9 @@ SBS_INC_DIRS := $(MODULE_INCLUDE_DIRS)
188189
SBS_INC_DIRS += $(addprefix $(SBS_PROJ_ROOT)/,$(MODULE_PROJECT_INCLUDE_DIRS))
189190

190191
ifeq ($(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))
192195
else
193196
SBS_CFLAGS := $(MODULE_CFLAGS_OVERRIDE)
194197
endif
@@ -219,10 +222,7 @@ ifneq ($(filter 1,$(MODULE_VERBOSE)),1)
219222
SBS_Q := @
220223
endif
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)
226226
ifneq ($(SBS_BIN_TYPE), $(SBS_NONE_BIN_TYPE))
227227
@mkdir -p $(SBS_ARTIFACT_DIR)
228228
$(if $(SBS_Q),@$(ECHO) -e "$(SBS_LD_STR)\t$(notdir $@)")
@@ -231,6 +231,8 @@ else
231231
.PHONY: $(SBS_ARTIFACT)
232232
endif
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)
257259
endif
258260

259-
SBS_CLEAN_FILES := $(SBS_OBJS) $(SBS_OBJS_DEPS)
261+
SBS_CLN_FILES := $(SBS_OBJS) $(SBS_OBJS_DEPS)
260262
ifneq ($(SBS_BIN_TYPE), $(SBS_NONE_BIN_TYPE))
261-
SBS_CLEAN_FILES += $(SBS_ARTIFACT)
263+
SBS_CLN_FILES += $(SBS_ARTIFACT)
262264
endif
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

269270
endif # 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
280292
endif
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)
291315
endif
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)
297323
endif
324+
325+
ifneq ($(MODULE_POST_CLN),)
326+
$(MODULE_POST_CLN): $(MODULE_PRE_CLN) $(SBS_CLN_TGT) $(SBS_SUB_MODULES_CLN_TGTS)
298327
endif
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
321337
sbs_version:
322-
@echo SBS version $(SBS_VERSION)
338+
@$(ECHO) SBS version $(SBS_VERSION)
323339

324340
define 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
333349
endef
334350

@@ -349,7 +365,7 @@ define SbsDbgVar
349365
endef
350366

351367
sbs_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

385401
sbs_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

393409
sbs_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

Comments
 (0)