]> rtime.felk.cvut.cz Git - omk.git/commitdiff
Ported some functionality from the old OMK to test rules
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 30 Dec 2008 22:39:14 +0000 (23:39 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 30 Dec 2008 23:36:35 +0000 (00:36 +0100)
It is not tested and handling of include files is missing

snippets/Makefile.rules.test
snippets/cprog [new file with mode: 0644]

index d16e073a20df1315c97099ff60d07b06cdd62b8e..6cdb062d2466eae1758e76bafaa1d685b41b1562 100644 (file)
@@ -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,<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:%/=%)))
-
-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 (file)
index 0000000..dfc1be0
--- /dev/null
@@ -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,<executable-name>,<bin|utils|test>)
+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,<library-name>)
+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,<library-name>)
+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))))