]> rtime.felk.cvut.cz Git - omk.git/commitdiff
Further experiments with new rules
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 9 Dec 2008 17:06:47 +0000 (18:06 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 9 Dec 2008 17:06:47 +0000 (18:06 +0100)
prepare macro renamed to prepare_rule and simplified

snippets/build

index a8e1c645f31b9a71b6a49f0b6cd6817c425d4750..fe08e194582c9913a700397c2be7d8c5a27040a5 100644 (file)
@@ -1,3 +1,12 @@
+####
+# kbuild: Generic definitions
+
+# Convenient variables
+comma   := ,
+squote  := '
+#'
+empty   :=
+space   := $(empty) $(empty)
 
 BUILD_DIR_NAME = _build
 COMPILED_DIR_NAME = _compiled
 
 BUILD_DIR_NAME = _build
 COMPILED_DIR_NAME = _compiled
@@ -23,26 +32,25 @@ repl_out  = $(patsubst $(OUTPUT_DIR)/%,$$(OUTPUT_DIR)/%,$(1))
 # Build pseudo-pass #
 #####################
 
 # 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,<target>)
 define build_rule
 
 # Usage: $(call build_rule,<target>)
 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
        $(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
 
 .PHONY: build-pseudo-pass
-build-pseudo-pass: $(foreach target,$(major_targets),$(target))
+build-pseudo-pass: $(foreach target,$(default_build_targets),$(target))
 
 ################
 # Prepare pass #
 
 ################
 # 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))
 
 
 $(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
 
 ###
 
 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)
 # All paths in this file should be relative to $(OUTPUT_DIR)
-# Usage: $(call prepare,<target-name>,<targets>,<deps>,<quiet_cmd>,<cmd>)
-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,<targets>,<deps>,<msg>,<cmd>)
+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
 
        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
 
 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 #
 ############
 
 ############
 # Programs #
 ############
 
-# Syntax: $(call compile_c_o_template,<source>,<target>,<additional c-flags>)
-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,<executable-name>,<bin|utils|test>)
 define program_template
 $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
 # Usage: $(call program_template,<executable-name>,<bin|utils|test>)
 define program_template
 $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
@@ -102,16 +115,14 @@ USER_OBJS  += $$($(1)_OBJS)
 USER_SOURCES += $$($(1)_SOURCES)
 
 
 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 $$$$@
 
 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
        "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 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
        $(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