# Version for vxWorks builds. # # # input variables # lib_LIBRARIES .. list of the user-space libraries # include_HEADERS .. list of the user-space public header files # nobase_include_HEADERS .. public headers copied even with directory part # renamed_include_HEADERS .. public headers copied to the different target name # bin_PROGRAMS .. list of the require binary programs # test_PROGRAMS .. list of the test programs # utils_PROGRAMS .. list of the development utility programs # xxx_SOURCES .. list of specific target sources # xxx_LIBS .. list of specific target libraries # INCLUDES .. additional include directories and defines for user-space ifndef WRENV $(error $(shell $(call canttest,WRENV is not defined in config.target))) endif ifndef WRPACKAGE $(error $(shell $(call canttest,WRPACKAGE is not defined in config.target))) endif ifndef CPU $(error $(shell $(call canttest,CPU is not defined in config.target))) endif ifndef TOOL $(error $(shell $(call canttest,TOOL is not defined in config.target))) endif BUILD_DIR_NAME = _build/$(CPU)$(TOOL) COMPILED_DIR_NAME = _compiled/$(CPU)$(TOOL) GROUP_DIR_NAME = USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include USER_LIB_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib USER_UTILS_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils USER_TESTS_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-tests USER_BIN_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin USER_BUILD_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/rtp # Note the use of "recursive" =. That's because RELATIVE_DIR is # sometimes defined later in 'base'. USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR) LOCAL_BUILD_DIR = $(USER_OBJS_DIR) .PHONY: check-dir # Some support to serialize some targets for parallel make ifneq ($(OMK_SERIALIZE_INCLUDED),y) include-pass: check-dir library-pass: include-pass binary-pass: library-pass kernel-lib-pass: include-pass kernel-mod-pass: kernel-lib-pass kernel-modpost-pass: kernel-mod-pass kernel-pass: kernel-mod-pass kernel-modpost-pass override OMK_SERIALIZE_INCLUDED = y MAKEOVERRIDES := $(filter-out OMK_SERIALIZE_INCLUDED=n,$(MAKEOVERRIDES)) endif # Checks for OMK tester ifdef OMK_TESTSROOT default-config-pass-check include-pass-check: library-pass-check binary-pass-check: @[ -x "$(shell which $(CC))" ] || $(call canttest,Cannot find compiler: $(CC)) @[ -x "$(WRENV)" ] || $(call canttest,Cannot execute wrenv script) endif # Export some variables to VxWorks makefiles CPPFLAGS += -I $(USER_INCLUDE_DIR) ADDED_CFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_VXWORKS -DOMK_FOR_USER ADDED_C++FLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_VXWORKS -DOMK_FOR_USER export ADDED_CFLAGS ADDED_C++FLAGS USER_SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.o # Syntax: $(call PROGRAM_template,,,) define PROGRAM_template USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c)) USER_GEN_SOURCES += $$($(1)_GEN_SOURCES) $(foreach x, $(USER_SOURCES2OBJS), $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) ) $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) # I hope dependedcies are solved in vxWorks makefiles .PHONY: $(2)/$(1).vxe $(2)/$(1).vxe: @$(QUIET_CMD_ECHO) " LINK $$@" # In rules.rtp (on line 265), dep generation depends on Makefile so we must create one # @[ ! -f Makefile ] && touch Makefile @touch Makefile @echo 'EXE = $(1).vxe' > Makefile.vxe.$(1); \ echo 'OBJS = $$($(1)_OBJS)' >> Makefile.vxe.$(1); \ echo 'VXE_DIR = $(2)' >> Makefile.vxe.$(1); \ echo 'OBJ_DIR = $(USER_OBJS_DIR)' >> Makefile.vxe.$(1); \ echo 'LIB_ROOT = $(USER_LIB_DIR)' >> Makefile.vxe.$(1); \ echo 'OMK_LIB_PATH = $$$$(LIB_ROOT)/$$$$(VX_CPU_FAMILY)/$$$$(CPU)/$$$$(TOOL_COMMON_DIR)$$$$(LIB_DIR_TAG)/' >> Makefile.vxe.$(1); \ echo 'ADDED_LIBS = -L$$$$(OMK_LIB_PATH) $(lib_LOADLIBES:%=-l%) $$($(1)_LIBS:%=-l%)' >> Makefile.vxe.$(1); \ echo 'VPATH = $(SOURCES_DIR)' >> Makefile.vxe.$(1); \ echo 'include $$$$(WIND_USR)/make/rules.rtp' >> Makefile.vxe.$(1); \ $(WRENV) -p $(WRPACKAGE) $(MAKE) CPU=$(CPU) TOOL=$(TOOL) -f Makefile.vxe.$(1) # echo 'ADDED_C++FLAGS += -L$(USER_LIB_DIR)' >> Makefile.vxe.$(1); \ # echo 'ADDED_CFLAGS += -L$(USER_LIB_DIR)' >> Makefile.vxe.$(1); \ # $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc))" ] ; then echo $$(CC) ; else echo $$(CXX) ; fi) \ # $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $(2)/$(1) # @echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d # @sed -n -e 's/^LOAD \(.*\)$$$$/ \1 \\/p' $(USER_OBJS_DIR)/$(1).exe.map >>$(USER_OBJS_DIR)/$(1).exe.d # @echo >>$(USER_OBJS_DIR)/$(1).exe.d endef # Syntax: $(call LIBRARY_template,) define LIBRARY_template USER_IDLS += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c)) $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c)) USER_GEN_SOURCES += $$($(1)_GEN_SOURCES) $(foreach x, $(USER_SOURCES2OBJS), $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\ $$($(1)_SOURCES) $$($(1)_GEN_SOURCES))) ) $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%)) USER_OBJS += $$($(1)_OBJS) USER_SOURCES += $$($(1)_SOURCES) # I hope dependedcies are solved in vxWorks makefiles .PHONY: $(USER_LIB_DIR)/lib$(1).a $(USER_LIB_DIR)/lib$(1).a: #$$($(1)_OBJS) @$(QUIET_CMD_ECHO) " LIB $$@" @echo 'LIB_BASE_NAME = $(1)' > Makefile.lib.$(1); \ echo 'OBJS = $$($(1)_OBJS)' >> Makefile.lib.$(1); \ echo 'OBJ_DIR = $(USER_OBJS_DIR)' >> Makefile.lib.$(1); \ echo 'LIB_ROOT = $(USER_LIB_DIR)' >> Makefile.lib.$(1); \ echo 'VPATH = $(SOURCES_DIR)' >> Makefile.lib.$(1); \ # echo 'LIBDIRBASE = ' >> Makefile.lib.$(1); \ echo 'include $$$$(WIND_USR)/make/rules.library' >> Makefile.lib.$(1); $(WRENV) -p $(WRPACKAGE) $(MAKE) CPU=$(CPU) TOOL=$(TOOL) -f Makefile.lib.$(1) endef # Generate rules for compilation of programs and libraries $(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR)))) $(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR)))) $(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR)))) $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib)))) $(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib)))) $(eval $(call omk_pass_template,clean,$(USER_OBJS_DIR),,always)) $(eval $(call omk_pass_template,install,$(USER_OBJS_DIR),,always)) $(eval $(call omk_pass_template,include-pass,$(USER_OBJS_DIR),,always)) $(eval $(call include-pass-template,$(USER_INCLUDE_DIR),include)) library-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \ $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT)) binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.vxe) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%.vxe) $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%.vxe) clean-local: @echo Cleaning in $(USER_OBJS_DIR) @rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \ $(USER_OBJS_DIR)/*.d \ $(USER_OBJS_DIR)/*.map \ $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%) $(eval $(call omk_pass_template, library-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES))) $(eval $(call omk_pass_template, binary-pass, $(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS))) 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)) default: include-pass library-pass binary-pass # Local Variables: # mode:makefile # End: