]> rtime.felk.cvut.cz Git - omk.git/commitdiff
Some tests
authorMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 14 Dec 2008 22:33:15 +0000 (23:33 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 14 Dec 2008 22:33:15 +0000 (23:33 +0100)
TODO: Fix use of $@ and $< in c_o_cmd

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

index 8b868d66e529fc42b42eb160071f22392fa667f9..0dd1b1f60b39357278210a0b2cf30c7cb1881919 100644 (file)
@@ -13,7 +13,7 @@ rule_cmd     = $($(1)_cmd)
 # Usage: $(call build_rule,<target>)
 define build_rule
 $(rule_targets): $(rule_deps) $(omk_inc_file)
-       @$(QUIET_CMD_ECHO) "  "$(rule_msg) "$$(call strip_out,$$@)"
+       @$(QUIET_CMD_ECHO) "  "$(rule_msg) "$$@" #"$$(call strip_out,$$@)"
        $(Q)$(rule_cmd)
 endef
 
@@ -23,5 +23,5 @@ endef
 $(foreach rule,$(prepared_rules),$(eval $(call build_rule,$(rule))))
 
 .PHONY: build-pseudo-pass
-build-pseudo-pass: $(foreach target,$(default_build_targets),$(target))
+build-pseudo-pass: $(foreach target,$(omk_goals),$(target))
 
index 7fd3affcd98846caac3a5926bb61af88032d889f..6cb107cfa851561da4d190d8ec513327b23fdbf2 100644 (file)
@@ -293,6 +293,10 @@ squote  := '
 empty   :=
 space   := $(empty) $(empty)
 
+###
+# Escape single quote for use in echo statements
+escsq = $(subst $(squote),'\$(squote)',$1)
+
 BUILD_DIR_NAME = _build
 COMPILED_DIR_NAME = _compiled
 
@@ -304,8 +308,9 @@ USER_BIN_DIR     := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin
 USER_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/user
 LINK_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link
 
-USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
-KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR)
+# Avoid double slash at the end in the top-level directory
+USER_OBJS_DIR = $(USER_BUILD_DIR)$(RELATIVE_DIR:%=/%)
+KERN_OBJS_DIR = $(KERN_BUILD_DIR)$(RELATIVE_DIR:%=/%)
 OMK_WORK_DIR  = $(USER_OBJS_DIR)
 
 strip_out = $(patsubst $(OUTPUT_DIR)/%,%,$(1))
@@ -332,6 +337,10 @@ omk_inc_file = $(if $(filter $(BUILD_DIR_NAME)%,$(omk_inc_rule)),\
 
 target_omk_file = $(OMK_WORK_DIR)/$(notdir $(1)).target.omk
 
+# >'< substitution is for echo to work,
+# >$< substitution to preserve $ when reloading .omk.inc file
+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)
@@ -344,22 +353,22 @@ $(omk_inc_file): FORCE
            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; \
+           echo '$(omk_inc_rule)_cmd = $$(call subst-cmd,$$(call repl_out,$(4)))' >> $$@.tmp; \
        if cmp -s $$@.tmp $$@; then rm $$@.tmp; else mv $$@.tmp $$@; fi
 endef
 
 ###
-# 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
+# prepare_rule_goal - same as prepare rules but the target is put
+# as dependency to the default goal, which causes it to be built
 # upon calling make
-define prepare_rule_default
+define prepare_rule_goal
 $(call prepare_rule,$(1),$(2),$(3),$(4))
-prepared_default_build_targets += $(call strip_out,$(1))
+prepared_goals += $(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; \
+       $(Q)echo 'omk_goals += $(prepared_goals)' > $@.tmp; \
            if cmp -s $@.tmp $@; then rm $@.tmp; else mv $@.tmp $@; fi
 
 
@@ -367,10 +376,31 @@ $(OMK_WORK_DIR)/omk.inc: FORCE
 # Programs #
 ############
 
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+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"
+else
+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" ; \
+       fi
+
+
 # Usage: $(call program_template,<executable-name>,<bin|utils|test>)
 define program_template
 $(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
-$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR),$$(sort $$($(1)_OBJS:%/=%)))
+$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%)))
 
 USER_OBJS  += $$($(1)_OBJS)
 USER_SOURCES += $$($(1)_SOURCES)
@@ -381,20 +411,13 @@ 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_default,\
+$(call prepare_rule_goal,\
        $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
        $$($(1)_OBJS) $$($(1)_LIBS),\
        "LINK    ",\
        $$(program_cmd))
 endef
 
-c_o_cmd := set -e; cd $$(dir $$@); \
-       if $$(c_o_COMPILE) $$(CC_DEPFLAGS) -o $$@ -c $$< ; \
-       then mv -f "$$@.d.tmp" "$$@.d" ; \
-       else rm -f "$$@.d.tmp" ; \
-       fi
-
-
 $(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),\
@@ -402,9 +425,12 @@ $(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call prepare_rule,\
        "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 > make.db.build-pseudo-pass; \
-       $(MAKE) -f Makefile.build
+       -$(MAKE) -qp -f Makefile.build OUTPUT_DIR=$(OUTPUT_DIR) > make.db.build-pseudo-pass;
+       $(MAKE) -f Makefile.build OUTPUT_DIR=$(OUTPUT_DIR)
 
 check-dir:
        @$(call mkdir_def,$(USER_BUILD_DIR))
@@ -413,3 +439,8 @@ check-dir:
        @$(call mkdir_def,$(USER_BIN_DIR))
        @$(call mkdir_def,$(USER_UTILS_DIR))
        @$(call mkdir_def,$(USER_TESTS_DIR))
+
+# Local Variables:
+# mode: makefile-gmake
+# compile-command:"make -qp V=2 > make.db; make V=2"
+# End: