]> rtime.felk.cvut.cz Git - omk.git/commitdiff
Almost working
authorMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 15 Dec 2008 23:36:04 +0000 (00:36 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 15 Dec 2008 23:36:04 +0000 (00:36 +0100)
- simplified passes (easier debugging)
- Makefile.build merged to Makefile.rules
- Fixed escaping of _cmd in .omk.inc

devel-test/Makefile.build
devel-test/Makefile.rules

index 0dd1b1f60b39357278210a0b2cf30c7cb1881919..f616dd2f87ba171c78e179f9468fa9b0aba75b64 100644 (file)
@@ -12,9 +12,9 @@ rule_cmd     = $($(1)_cmd)
 
 # Usage: $(call build_rule,<target>)
 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
index 6cb107cfa851561da4d190d8ec513327b23fdbf2..f2e9ecfa862c4ae1714832b93a8319c5c0bb4773 100644 (file)
@@ -201,20 +201,14 @@ pass = $(strip $(1))
 # Usage: $(call omk_pass_subdir_template,<pass name>,<build dir>,<subdir>)
 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,<subdir>)
 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,<pass name>,<build dir>,[<local make flags>],[<local enable condition>])
 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,<targets>,<deps>,<msg>,<cmd>)
+# Usage: $(eval $(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; \
+#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,<target>))
+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"