From: Michal Sojka Date: Tue, 30 Dec 2008 22:39:14 +0000 (+0100) Subject: Ported some functionality from the old OMK to test rules X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/commitdiff_plain/75e93e1456ba356e60ca254ec0a1e26b76a13475 Ported some functionality from the old OMK to test rules It is not tested and handling of include files is missing --- diff --git a/snippets/Makefile.rules.test b/snippets/Makefile.rules.test index d16e073..6cdb062 100644 --- a/snippets/Makefile.rules.test +++ b/snippets/Makefile.rules.test @@ -7,7 +7,15 @@ 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 +#LINK_BUILD_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link + +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)) # Avoid double slash at the end in the top-level directory USER_OBJS_DIR = $(USER_BUILD_DIR)$(RELATIVE_DIR:%=/%) @@ -20,6 +28,8 @@ KERN_OBJS_DIR = $(KERN_BUILD_DIR)$(RELATIVE_DIR:%=/%) # Check GCC version for user build ifndef CC_MAJOR_VERSION CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/') +# TODO: export CC_MAJOR_VERSION to save the above shell invocation in +# submakes. This will work only if CC is not changed in Makefile.omk. endif # Prepare suitable define for dependency building ifeq ($(CC_MAJOR_VERSION),2) @@ -31,61 +41,60 @@ endif c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER +cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER + +S_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(ASFLAGS) -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 +cc_o_cmd = \ + if $(cc_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) - -$$(eval $$(call prepare_rule_goal,\ - $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ - $$($(1)_OBJS),\ - "LINK ",\ - $$(call program_cmd,$(1)))) -endef - -program_cmd = set -e; $(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 $$@; \ - echo "$$@: \\" >$(USER_OBJS_DIR)/$(1).exe.d; \ - sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(USER_OBJS_DIR)/$(1).exe.map|tr '&' '\134' >>$(USER_OBJS_DIR)/$(1).exe.d; \ - echo >>$(USER_OBJS_DIR)/$(1).exe.d - -prepare-pass: create-build-dirs -create-build-dirs:: -ifneq ($(bin_PROGRAMS),) -create-build-dirs:: - @$(call mkdir_def,$(USER_OBJS_DIR)) -endif -$(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))) +S_o_cmd = \ + if $(S_o_COMPILE) -D__ASSEMBLY__ $(CC_DEPFLAGS) $($(1)_CFLAGS) -o $$@ -c $$< ; \ + then mv -f "$$@.d.tmp" "$$@.d" ; \ + else rm -f "$$@.d.tmp" ; exit 1; \ + fi +# TODO: Implement $($(1)_CFLAGS) + +# Default values for IDL_* variable are suitable for ORBit-like IDL compilers +IDL_CLIENT_SOURCES ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-common.c) +IDL_SERVER_SOURCES ?= $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c) +IDL_TARGETS ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c) $(1:%.idl=%.h) + +idl_src_cmd = $(IDL_COMPILER) $(IDL_FLAGS) $($(1)_IDLFLAGS) $(1) + +# TODO: Implement CMETRIC + +_linker = $(if $(call c++sources,$($(1)_SOURCES)),$(CXX),$(CC)) +_map_file = $(USER_OBJS_DIR)/$(1).exe.map +_dep_file = $(USER_OBJS_DIR)/$(1).exe.d +program_cmd = set -e; \ + $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \ + -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \ + echo "$$@: \\" >$(_dep_file); \ + sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(_map_file)\ + |tr '&' '\134' >>$(_dep_file); \ + echo >>$(_dep_file) + +library_cmd = $(AR) rcs $$@ $$^ + +solib_cmd = set -e; \ + $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \ + -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \ + echo "$$@: \\" >$(_dep_file); \ + sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(_map_file)\ + |tr '&' '\134' >>$(_dep_file); \ + echo >>$(_dep_file) -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)) +include cprog #omkbuild diff --git a/snippets/cprog b/snippets/cprog new file mode 100644 index 0000000..dfc1be0 --- /dev/null +++ b/snippets/cprog @@ -0,0 +1,85 @@ +c++ext = cc C cxx cpp +c++sources = $(foreach ext,$(c++ext),$(filter %.$(ext),$(1))) + +### +# template_variables - variables common to program, libraries, ... +# +define template_variables +USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) +$(1)_GEN_SOURCES += $$(call IDL_SERVER_SOURCES,$$($(1)_SERVER_IDL)) +$(1)_GEN_SOURCES += $$(call IDL_CLIENT_SOURCES,$$($(1)_CLIENT_IDL)) +$(1)_GEN_SOURCES += $$(sort $$(call IDL_SERVER_SOURCES,$$($(1)_IDL)) \ + $$(call IDL_CLIENT_SOURCES,$$($(1)_IDL))) +USER_GEN_SOURCES += $$($(1)_GEN_SOURCES) +$(1)_OBJS += $(foreach ext,c $(c++ext),$$(patsubst %.$(ext),%.o,$$(filter %.$(ext),$$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))) +$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) # Why is here the backslash substitution??? +$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%))) + +USER_OBJS += $$($(1)_OBJS) +USER_SOURCES += $$($(1)_SOURCES) +endef + +### +# program_template +# +# Usage: $(call program_template,,) +define program_template +$(template_variables) +$$(eval $$(call prepare_rule_goal,\ + $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\ + $$($(1)_OBJS),\ + "LINK ",\ + $$(call program_cmd,$(1)))) +endef + +### +# library_template +# +# Usage: $(call library_template,) +define library_template +$(template_variables) +$$(eval $$(call prepare_rule_goal,\ + $(USER_LIB_DIR)/lib$(1).a,\ + $$($(1)_OBJS),\ + "AR ",\ + $$(call library_cmd,$(1)))) +endef + +### +# solib_template +# +# Usage: $(call solib_template,) +define solib_template +$(template_variables) # FIXME: OBJSLO, etc. +# TODO: Add dependencies on other shared libraries ala: +# $(1)_libs += $$($(1)_LIBS) $$(lib_LOADLIBES) +# $(1)_shared_libs = $$(patsubst %,$(USER_LIB_DIR)/lib%.$(SOLIB_EXT),$$(filter $$(shared_libs),$$($(1)_libs))) + +$$(eval $$(call prepare_rule_goal,\ + $(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT),\ + $$($(1)_OBJS),\ + "LINK ",\ + $$(call solib_cmd,$(1)))) +endef + +prepare-pass: create-build-dirs +create-build-dirs:: +ifneq ($(bin_PROGRAMS)$(test_PROGRAMS)$(utils_PROGRAMS)$(lib_LIBRARIES)$(shared_LIBRARIES),) +create-build-dirs:: + @$(call mkdir_def,$(USER_OBJS_DIR)) +endif + +# TODO: $(foreach cmetrh,...) + +$(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin))) +$(foreach prog,$(utils_PROGRAMS),$(eval $(call program_template,$(prog),utils))) +$(foreach prog,$(test_PROGRAMS),$(eval $(call program_template,$(prog),test))) +$(foreach lib,$(lib_LIBRARIES),$(eval $(call library_template,$(lib)))) +$(foreach lib,$(shared_LIBRARIES),$(eval $(call solib_template,$(lib)))) + +$(foreach src,$(filter %.c,$(USER_SOURCES)),\ + $(eval $(call prepare_rule,\ + $(USER_OBJS_DIR)/$(src:%.c=%.o),\ + $(SOURCES_DIR)/$(src),\ + "CC ",\ + $(c_o_cmd))))