From b795f7c1bd7dc607c4fc9aefa5629b4ed1239519 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 30 Dec 2008 10:00:21 +0100 Subject: [PATCH] Test and base snippets converted to non-flat structure By non-flat I mean that "include XXX #omkbuild" is used not only in the top-level snippet --- snippets/Makefile.rules.test | 92 ++++++++++++++++++++++++++++++++++-- snippets/base | 4 ++ snippets/test | 87 ---------------------------------- 3 files changed, 93 insertions(+), 90 deletions(-) delete mode 100644 snippets/test diff --git a/snippets/Makefile.rules.test b/snippets/Makefile.rules.test index 6e92dc9..d8d708e 100644 --- a/snippets/Makefile.rules.test +++ b/snippets/Makefile.rules.test @@ -1,4 +1,90 @@ include base #omkbuild -include prepare #omkbuild -include test #omkbuild -include build #omkbuild + +USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include +USER_LIB_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib +USER_UTILS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils +USER_TESTS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests +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 + +# 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) + +############ +# 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 = \ + if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d"; \ + else rm -f "$$@.d.tmp"; exit 1; \ + fi + + +# Usage: $(call program_template,,) +define program_template +$(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES))) +$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%))) + +USER_OBJS += $$($(1)_OBJS) +USER_SOURCES += $$($(1)_SOURCES) + +$(call prepare_rule_goal,\ + $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ + $$($(1)_OBJS) $$($(1)_LIBS),\ + "LINK ",\ + $(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 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 $(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)) + @$(call mkdir_def,$(USER_INCLUDE_DIR)) + @$(call mkdir_def,$(USER_LIB_DIR)) + @$(call mkdir_def,$(USER_BIN_DIR)) + @$(call mkdir_def,$(USER_UTILS_DIR)) + @$(call mkdir_def,$(USER_TESTS_DIR)) + diff --git a/snippets/base b/snippets/base index 937ee17..d39f493 100644 --- a/snippets/base +++ b/snippets/base @@ -297,6 +297,10 @@ omkize: cp -v Makefile "$${d}/Makefile"; \ fi \ done + +include prepare #omkbuild +include build #omkbuild + # Local Variables: # mode:makefile-gmake # End: diff --git a/snippets/test b/snippets/test deleted file mode 100644 index b004e9d..0000000 --- a/snippets/test +++ /dev/null @@ -1,87 +0,0 @@ -USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include -USER_LIB_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib -USER_UTILS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils -USER_TESTS_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests -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 - -# 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) - -############ -# 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 = \ - if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \ - then mv -f "$$@.d.tmp" "$$@.d"; \ - else rm -f "$$@.d.tmp"; exit 1; \ - fi - - -# Usage: $(call program_template,,) -define program_template -$(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES))) -$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%))) - -USER_OBJS += $$($(1)_OBJS) -USER_SOURCES += $$($(1)_SOURCES) - -$(call prepare_rule_goal,\ - $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ - $$($(1)_OBJS) $$($(1)_LIBS),\ - "LINK ",\ - $(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 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 $(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)) - @$(call mkdir_def,$(USER_INCLUDE_DIR)) - @$(call mkdir_def,$(USER_LIB_DIR)) - @$(call mkdir_def,$(USER_BIN_DIR)) - @$(call mkdir_def,$(USER_UTILS_DIR)) - @$(call mkdir_def,$(USER_TESTS_DIR)) -- 2.39.2