From ad8c2a8486af48b20985a079f2e4624c9209f34e Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 16 Dec 2008 00:36:04 +0100 Subject: [PATCH] Almost working - simplified passes (easier debugging) - Makefile.build merged to Makefile.rules - Fixed escaping of _cmd in .omk.inc --- devel-test/Makefile.build | 4 +- devel-test/Makefile.rules | 127 ++++++++++++++++++++++---------------- 2 files changed, 76 insertions(+), 55 deletions(-) diff --git a/devel-test/Makefile.build b/devel-test/Makefile.build index 0dd1b1f..f616dd2 100644 --- a/devel-test/Makefile.build +++ b/devel-test/Makefile.build @@ -12,9 +12,9 @@ rule_cmd = $($(1)_cmd) # Usage: $(call build_rule,) define build_rule -$(rule_targets): $(rule_deps) $(omk_inc_file) +$(value rule_targets): $(value rule_deps) $(omk_inc_file) @$(QUIET_CMD_ECHO) " "$(rule_msg) "$$@" #"$$(call strip_out,$$@)" - $(Q)$(rule_cmd) + $(Q)$(value rule_cmd) endef # TODO: Include target.omk only in the subtree diff --git a/devel-test/Makefile.rules b/devel-test/Makefile.rules index 6cb107c..f2e9ecf 100644 --- a/devel-test/Makefile.rules +++ b/devel-test/Makefile.rules @@ -201,20 +201,14 @@ pass = $(strip $(1)) # Usage: $(call omk_pass_subdir_template,,,) define omk_pass_subdir_template .PHONY: $(pass)-$(3)-subdir -$(pass)-submakes: $(pass)-$(3)-subdir +$(pass)-subdirs: $(pass)-$(3)-subdir $(pass)-$(3)-subdir: @$(call mkdir_def,$(2)/$(3)) +@$(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(3) $(NO_PRINT_DIRECTORY) \ RELATIVE_DIR=$(RELATIVE_PREFIX)$(3) -C $(2)/$(3) \ - -f $(SUBDIR_MAKEFILE) $(pass)-submakes -# In subdirectories we can call submakes directly since passes are -# already searialized on the toplevel make. + -f $(SUBDIR_MAKEFILE) $(pass) endef -ifdef OMK_TESTSROOT -check-target = $(1:%=%-check) -endif - # Call a pass in a subdirectory # Usage: $(call extra_rules_subdir_template,) define extra_rules_subdir_template @@ -231,26 +225,13 @@ $(foreach subdir,$(EXTRA_RULES_SUBDIRS),$(eval $(call extra_rules_subdir_templat # Usage: $(call omk_pass_template,,,[],[]) define omk_pass_template -.PHONY: $(pass) $(pass)-local $(pass)-check $(pass)-submakes -$(foreach subdir,$(SUBDIRS),$(eval $(call omk_pass_subdir_template,$(pass),$(2),$(subdir)))) -$(pass): -# Submakes have to be called this way and not as dependecies for pass -# serialization to work - +@$(MAKE) SOURCES_DIR=$(SOURCES_DIR) $(NO_PRINT_DIRECTORY) \ - RELATIVE_DIR=$(RELATIVE_DIR) \ - -f $(SOURCESDIR_MAKEFILE) $(pass)-submakes -$(pass)-submakes: - @true # Do not emit "nothing to be done" messages - -ifneq ($(4)$($(pass)_HOOKS),) -$(pass)-submakes: $(pass)-this-dir -$(pass)-this-dir: $(foreach subdir,$(SUBDIRS),$(pass)-$(subdir)-subdir) +.PHONY: $(pass) $(pass)-local $(pass)-msg $(pass)-subdirs +$(pass): $(pass)-local +$(pass)-local: $(pass)-subdirs $(pass)-msg +$(foreach subdir,$(SUBDIRS),$(call omk_pass_subdir_template,$(pass),$(2),$(subdir))) + +$(pass)-msg: $(pass)-subdirs +@echo "make[omk]: $(pass) in $(RELATIVE_DIR)" - @$(call mkdir_def,$(2)) - +@$(MAKE) $(NO_PRINT_DIRECTORY) SOURCES_DIR=$(SOURCES_DIR) RELATIVE_DIR=$(RELATIVE_DIR) -C $(2) \ - -f $(SOURCESDIR_MAKEFILE) $(3) $(check-target) $(1:%=%-local) -$(pass)-local: $($(pass)_HOOKS) -endif endef # ======================= @@ -261,7 +242,7 @@ default-config: @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default" @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default" @echo >> "$(CONFIG_FILE)-default" - @$(MAKE) $(NO_PRINT_DIRECTORY) -C $(OUTPUT_DIR) \ + @$(MAKE) $(NO_PRINT_DIRECTORY) -C $(MAKERULES_DIR) \ RELATIVE_DIR="" SOURCES_DIR=$(OUTPUT_DIR) \ -f $(OUTPUT_DIR)/Makefile default-config-pass @@ -344,16 +325,18 @@ subst-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(1)))) ### # 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_rule,,,,) +# Usage: $(eval $(call prepare_rule,,,,)) define prepare_rule prepare-pass-local: $(omk_inc_file) $(omk_inc_file): FORCE - $(Q)echo 'prepared_rules += $(omk_inc_rule)' > $$@.tmp; \ +#TODO remove the next line + @echo " PREP "$$(call strip_out,$$@); \ + 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 subst-cmd,$$(call repl_out,$(4)))' >> $$@.tmp; \ + echo '$(omk_inc_rule)_cmd = $(call subst-cmd,$(4))' >> $$@.tmp; \ if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi endef @@ -366,8 +349,8 @@ $(call prepare_rule,$(1),$(2),$(3),$(4)) prepared_goals += $(call strip_out,$(1)) endef -prepare-pass-local: $(OMK_WORK_DIR)/omk.inc -$(OMK_WORK_DIR)/omk.inc: FORCE +prepare-pass-local: $(OMK_WORK_DIR)/__goals.omk.inc +$(OMK_WORK_DIR)/__goals.omk.inc: FORCE $(Q)echo 'omk_goals += $(prepared_goals)' > $@.tmp; \ if cmp -s $@.tmp $@; then rm $@.tmp; else mv $@.tmp $@; fi @@ -382,18 +365,18 @@ CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/') endif # Prepare suitable define for dependency building ifeq ($(CC_MAJOR_VERSION),2) -CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp" +CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp" else -CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp" +CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp" endif c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER -c_o_cmd = set -e; \ - if $$(c_o_COMPILE) $$(CC_DEPFLAGS) -o $$$$@ -c $$$$< ; \ - then mv -f "$$@.d.tmp" "$$@.d" ; \ - else rm -f "$$@.d.tmp" ; \ +c_o_cmd = \ + if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d"; \ + else rm -f "$$@.d.tmp"; exit 1; \ fi @@ -405,32 +388,39 @@ $(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%))) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) - - -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_rule_goal,\ $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ $$($(1)_OBJS) $$($(1)_LIBS),\ "LINK ",\ - $$(program_cmd)) + $(program_cmd)) endef +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 $$@ + $(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin))) -$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call prepare_rule,\ - $(USER_OBJS_DIR)/$(src:%.c=%.o),\ - $(SOURCES_DIR)/$(src),\ - "CC ",\ - $(c_o_cmd)))) +#$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<)) +$(foreach src,$(filter %.c,$(USER_SOURCES)),\ + $(eval $(call prepare_rule,\ + $(USER_OBJS_DIR)/$(src:%.c=%.o),\ + $(SOURCES_DIR)/$(src),\ + "CC ",\ + $(c_o_cmd)))) + +$(eval $(call prepare_rule_goal,\ + $(USER_OBJS_DIR)/test.X.o,\ + $(SOURCES_DIR)/test.c,\ + "CC ",\ + $(c_o_cmd))) # OUTPUT_DIR is not defined in Makefile.build so we has to pass it on # command-line. After this file will be merged with Makefile.rules, it # will not be necessary to pass it. default: check-dir prepare-pass - -$(MAKE) -qp -f Makefile.build OUTPUT_DIR=$(OUTPUT_DIR) > make.db.build-pseudo-pass; - $(MAKE) -f Makefile.build OUTPUT_DIR=$(OUTPUT_DIR) + -$(MAKE) -qp -f $(MAKERULES_DIR)/Makefile.rules build > make.db.build-pseudo-pass; + +@echo "make[omk]: build" + @$(MAKE) $(NO_PRINT_DIRECTORY) -f $(MAKERULES_DIR)/Makefile.rules build check-dir: @$(call mkdir_def,$(USER_BUILD_DIR)) @@ -440,6 +430,37 @@ check-dir: @$(call mkdir_def,$(USER_UTILS_DIR)) @$(call mkdir_def,$(USER_TESTS_DIR)) + + +##################### +# Build pseudo-pass # +##################### +ifneq (,$(filter build,$(MAKECMDGOALS))) +all: build-pseudo-pass + +rule_targets = $(value $(1)_targets) +rule_deps = $(value $(1)_deps) +rule_msg = $(value $(1)_msg) +rule_cmd = $(value $(1)_cmd) + +# Usage: $(eval $(call build_rule,)) +define build_rule +$(rule_targets): $(rule_deps) #$(omk_inc_file) + @$(QUIET_CMD_ECHO) " "$(rule_msg)"$$@" #"$$(call strip_out,$$@)" + $(Q)$(rule_cmd) +endef + +# TODO: Include __goals.omk.inc only in the subtree +-include $(shell true; find $(USER_BUILD_DIR) -name '*.omk.inc') # `true' is a hack for MinGW +# FIXME: Disable automatic remake of included files + +$(foreach rule,$(prepared_rules),$(eval $(call build_rule,$(rule)))) + +.PHONY: build +build: $(foreach target,$(omk_goals),$(target)) +endif # (,$(filter build,$(MAKECMDGOALS))) + + # Local Variables: # mode: makefile-gmake # compile-command:"make -qp V=2 > make.db; make V=2" -- 2.39.2