From: Michal Sojka Date: Tue, 9 Dec 2008 17:06:47 +0000 (+0100) Subject: Further experiments with new rules X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/commitdiff_plain/ec9ee90406f9d93e2821f68231c4d4b8bba7f98e Further experiments with new rules prepare macro renamed to prepare_rule and simplified --- diff --git a/snippets/build b/snippets/build index a8e1c64..fe08e19 100644 --- a/snippets/build +++ b/snippets/build @@ -1,3 +1,12 @@ +#### +# kbuild: Generic definitions + +# Convenient variables +comma := , +squote := ' +#' +empty := +space := $(empty) $(empty) BUILD_DIR_NAME = _build COMPILED_DIR_NAME = _compiled @@ -23,26 +32,25 @@ repl_out = $(patsubst $(OUTPUT_DIR)/%,$$(OUTPUT_DIR)/%,$(1)) # Build pseudo-pass # ##################### -rule_targets = $($(1)_targets) -rule_deps = $($(1)_deps) -rule_quiet_cmd = $($(1)_quiet_cmd) -rule_cmd = $($(1)_cmd) +rule_targets = $($(1)_targets) +rule_deps = $($(1)_deps) +rule_msg = $($(1)_msg) +rule_cmd = $($(1)_cmd) # Usage: $(call build_rule,) define build_rule -$(rule_target): $(rule_deps) # TODO: dep on .cmd file - @$(QUIET_CMD_ECHO) " "$(rule_quiet_cmd) "$$(call strip_out,$$(@))" +$(rule_target): $(rule_deps) $(omk_inc_file) + @$(QUIET_CMD_ECHO) " "$(rule_msg) "$$(call strip_out,$$(@))" $(Q)$(rule_cmd) endef # TODO: Include target.omk only in the subtree --include $(shell true; find $(USER_BUILD_DIR) -name '*.target.omk') # `true' is a hack for MinGW --include $(shell true; find $(USER_BUILD_DIR) -name '*.var.omk') # `true' is a hack for MinGW +-include $(shell true; find $(USER_BUILD_DIR) -name '*omk.inc') # `true' is a hack for MinGW -$(foreach target,$(minor_targets),$(eval $(call build_rule,$(target)))) +$(foreach rule,$(prepared_rules),$(eval $(call build_rule,$(rule)))) .PHONY: build-pseudo-pass -build-pseudo-pass: $(foreach target,$(major_targets),$(target)) +build-pseudo-pass: $(foreach target,$(default_build_targets),$(target)) ################ # Prepare pass # @@ -50,49 +58,54 @@ build-pseudo-pass: $(foreach target,$(major_targets),$(target)) $(eval $(call omk_pass_template,prepare-pass,$(USER_OBJS_DIR),,always)) -var_omk_file = $(OMK_WORK_DIR)/$(notdir $(1)).var.omk -var_omk_target = $(1:$(OUTPUT_DIR)/%=%) +### +# Name of the prepared rule. This name is used as prefix of variable +# names in .omk.inc and is based on the first target +omk_inc_rule = $(firstword $(1:$(OUTPUT_DIR)/%=%)) + +# The name of .omk.inc file is derived from $(omk_inc_rule) and +# depends whether the target is under _build or elsewhere. +omk_inc_file = $(if $(filter $(BUILD_DIR_NAME)%,$(omk_inc_rule)),\ + $(OMK_WORK_DIR)/$(notdir $(omk_inc_rule)).omk.inc,\ + $(OMK_WORK_DIR)/$(subst /,_,$(omk_inc_rule)).omk.inc) target_omk_file = $(OMK_WORK_DIR)/$(notdir $(1)).target.omk ### -# prepare is used to generate .var.omk files during prepare-pass. +# prepare_rule is used to generate .omk.inc files during prepare-pass. # All paths in this file should be relative to $(OUTPUT_DIR) -# Usage: $(call prepare,,,,,) -define prepare -prepare-pass-local: $(var_omk_file) - -$(var_omk_file): FORCE - $(Q)echo 'minor_targets += $(var_omk_target)' > $$@.tmp; \ - echo '$(var_omk_target)_targets = $$(call strip_out,$(2))' >> $$@.tmp; \ - echo '$(var_omk_target)_deps += $$(call strip_out,$(3))' >> $$@.tmp; \ - echo '$(var_omk_target)_quiet_cmd = $(4)' >> $$@.tmp; \ - echo '$(var_omk_target)_cmd = $$(call repl_out,$(5))' >> $$@.tmp; \ +# Usage: $(call prepare_rule,,,,) +define prepare_rule +prepare-pass-local: $(omk_inc_file) + +$(omk_inc_file): FORCE + $(Q)echo 'prepared_rules += $(omk_inc_rule)' > $$@.tmp; \ + echo '$(omk_inc_rule)_targets = $$(call strip_out,$(1))' >> $$@.tmp; \ + echo '$(omk_inc_rule)_deps += $$(call strip_out,$(2))' >> $$@.tmp; \ + echo '$(omk_inc_rule)_msg = $(3)' >> $$@.tmp; \ + echo '$(omk_inc_rule)_cmd = $$(call repl_out,$(4))' >> $$@.tmp; \ if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi endef -define target -prepare-pass-local: $(var_omk_file) -$(target_omk_file): FORCE - $(Q)echo 'major_targets += $(var_omk_target)' > $$@ +### +# prepare_rule_default - same as prepare rules but the target is put +# as dependency to the default build rule, which causes it to be built +# upon calling make +define prepare_rule_default +$(call prepare_rule,$(1),$(2),$(3),$(4)) +prepared_default_build_targets += $(call strip_out,$(1)) endef +prepare-pass-local: $(OMK_WORK_DIR)/omk.inc +$(OMK_WORK_DIR)/omk.inc: FORCE + $(Q)echo 'default_build_targets += $(prepared_default_build_targets)' > $@.tmp; \ + if cmp -s $@.tmp $@; then rm $@.tmp; else mv $@.tmp $@; fi + + ############ # Programs # ############ -# Syntax: $(call compile_c_o_template,,,) -define compile_c_o_template - -$(2): $(1) $$(GEN_HEADERS) - @$(QUIET_CMD_ECHO) " CC $$@" - $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \ - then mv -f "$$@.d.tmp" "$$@.d" ; \ - else rm -f "$$@.d.tmp" ; exit 1; \ - fi -endef - - # Usage: $(call program_template,,) define program_template $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES))) @@ -102,16 +115,14 @@ USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) -program_targets = $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX) -program_deps = $$($(1)_OBJS) $$($(1)_LIBS) + program_cmd = $$(if $$(filter %.cc,$$($(1)_SOURCES)),$$(CXX),$$(CC)) \ $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-rpath-link,$(USER_LIB_DIR) \ -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$$$@ -$(call prepare,\ - $(2)_PROGRAMS_$(1),\ - $$(program_targets),\ - $$(program_deps),\ +$(call prepare_rule_default,\ + $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ + $$($(1)_OBJS) $$($(1)_LIBS),\ "LINK ",\ $$(program_cmd)) endef @@ -124,12 +135,12 @@ c_o_cmd := set -e; cd $$(dir $$@); \ $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin))) -$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call prepare,\ - $(USER_OBJS_DIR)/$(src:%.c=%.o),\ +$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call prepare_rule,\ $(USER_OBJS_DIR)/$(src:%.c=%.o),\ $(SOURCES_DIR)/$(src),\ "CC ",\ $(c_o_cmd)))) default: prepare-pass - + $(MAKE) -qp build-pseudo-pass > make.dp.build-pseudo-pass + $(MAKE) build-pseudo-pass