]> rtime.felk.cvut.cz Git - omk.git/blob - snippets/vxworks.omk
Ensure that OBJ_EXT, LIB_EXT, LIB_PREF and ASM_EXT is defined for all targets.
[omk.git] / snippets / vxworks.omk
1 #                   Version for vxWorks builds.
2 #
3 #
4 # input variables
5 # lib_LIBRARIES    .. list of the user-space libraries
6 # include_HEADERS  .. list of the user-space public header files
7 # nobase_include_HEADERS .. public headers copied even with directory part
8 # renamed_include_HEADERS .. public headers copied to the different target name
9 # bin_PROGRAMS     .. list of the require binary programs
10 # test_PROGRAMS    .. list of the test programs
11 # utils_PROGRAMS   .. list of the development utility programs
12 # xxx_SOURCES      .. list of specific target sources
13 # xxx_LIBS         .. list of specific target libraries
14 # INCLUDES         .. additional include directories and defines for user-space
15
16 # Output variables:
17 # OBJ_EXT - extension of object files
18 # LIB_EXT - extension of library files
19 # LIB_PREF - prefix for library files
20 # ASM_EXT - extension of assembler sources
21
22 ifndef WRENV
23 $(error WRENV is not defined in config.target)
24 endif
25 ifndef WRPACKAGE
26 $(error WRPACKAGE is not defined in config.target)
27 endif
28 ifndef CPU
29 $(error CPU is not defined in config.target)
30 endif
31 ifndef TOOL
32 $(error TOOL is not defined in config.target)
33 endif
34
35 BUILD_DIR_NAME = _build/$(CPU)$(TOOL)
36 COMPILED_DIR_NAME = _compiled/$(CPU)$(TOOL)
37 GROUP_DIR_NAME =
38
39
40 USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
41 USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
42 USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
43 USER_TESTS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-tests
44 USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
45 USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/rtp
46
47 # Note the use of "recursive" =. That's because RELATIVE_DIR is
48 # sometimes defined later in 'base'.
49 USER_OBJS_DIR    = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
50 LOCAL_BUILD_DIR  = $(USER_OBJS_DIR)
51
52 .PHONY: check-dir
53
54 # Some support to serialize some targets for parallel make
55 ifneq ($(OMK_SERIALIZE_INCLUDED),y)
56 include-pass: check-dir
57 library-pass: include-pass
58 binary-pass: library-pass
59 kernel-lib-pass: include-pass
60 kernel-mod-pass: kernel-lib-pass
61 kernel-modpost-pass: kernel-mod-pass
62 kernel-pass: kernel-mod-pass kernel-modpost-pass
63
64 override OMK_SERIALIZE_INCLUDED = y
65 MAKEOVERRIDES := $(filter-out OMK_SERIALIZE_INCLUDED=n,$(MAKEOVERRIDES))
66 endif
67
68 # Export some variables to VxWorks makefiles
69 CPPFLAGS  += -I $(USER_INCLUDE_DIR)
70
71 ADDED_CFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(OMK_CPPFLAGS) \
72         $(CPPFLAGS) $(OMK_CFLAGS) $(CFLAGS) -DOMK_FOR_VXWORKS -DOMK_FOR_USER
73
74 ADDED_C++FLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(OMK_CPPFLAGS) \
75         $(CPPFLAGS) $(OMK_CFLAGS) $(CFLAGS) -DOMK_FOR_VXWORKS -DOMK_FOR_USER
76
77 export ADDED_CFLAGS ADDED_C++FLAGS
78
79 OBJ_EXT = .o
80 LIB_EXT = .a
81 LIB_PREF = lib
82 ASM_EXT = .S
83
84 USER_SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.o
85
86 # Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<link-variant>)
87 define PROGRAM_template
88
89 USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
90 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
91 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
92 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
93 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
94 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
95 USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
96
97 $(foreach x, $(USER_SOURCES2OBJS),
98 $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
99                 $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
100 )
101 $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
102
103 USER_OBJS  += $$($(1)_OBJS)
104 USER_SOURCES += $$($(1)_SOURCES)
105
106 # I hope dependedcies are solved in vxWorks makefiles
107 .PHONY: $(2)/$(1).vxe
108 $(2)/$(1).vxe:
109         @$(QUIET_CMD_ECHO) "  LINK    $$@"
110 # In rules.rtp (on line 265), dep generation depends on Makefile so we must create one
111 #       @[ ! -f Makefile ] && touch Makefile 
112         @touch Makefile
113         @echo 'EXE = $(1).vxe' > Makefile.vxe.$(1); \
114         echo 'OBJS = $$($(1)_OBJS)' >> Makefile.vxe.$(1); \
115         echo 'VXE_DIR = $(2)' >> Makefile.vxe.$(1); \
116         echo 'OBJ_DIR = $(USER_OBJS_DIR)' >> Makefile.vxe.$(1); \
117         echo 'LIB_ROOT = $(USER_LIB_DIR)' >> Makefile.vxe.$(1); \
118         echo 'OMK_LIB_PATH = $$$$(LIB_ROOT)/$$$$(VX_CPU_FAMILY)/$$$$(CPU)/$$$$(TOOL_COMMON_DIR)$$$$(LIB_DIR_TAG)/' >> Makefile.vxe.$(1); \
119         echo 'ADDED_LIBS = -L$$$$(OMK_LIB_PATH) $(lib_LOADLIBES:%=-l%) $$($(1)_LIBS:%=-l%)' >> Makefile.vxe.$(1); \
120         echo 'VPATH = $(SOURCES_DIR)' >> Makefile.vxe.$(1); \
121         echo 'include $$$$(WIND_USR)/make/rules.rtp' >> Makefile.vxe.$(1); \
122         $(WRENV) -p $(WRPACKAGE) $(MAKE)  CPU=$(CPU) TOOL=$(TOOL) -f Makefile.vxe.$(1)
123 #       echo 'ADDED_C++FLAGS += -L$(USER_LIB_DIR)' >> Makefile.vxe.$(1); \
124 #       echo 'ADDED_CFLAGS += -L$(USER_LIB_DIR)' >> Makefile.vxe.$(1); \
125 #       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc))" ] ; then echo $$(CC) ; else echo $$(CXX) ; fi) \
126 #         $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $(2)/$(1)
127 #       @echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
128 #       @$(SED4OMK) -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(USER_OBJS_DIR)/$(1).exe.map  >>$(USER_OBJS_DIR)/$(1).exe.d
129 #       @echo >>$(USER_OBJS_DIR)/$(1).exe.d
130 endef
131
132
133 # Syntax: $(call LIBRARY_template,<library-name>)
134 define LIBRARY_template
135
136 USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
137 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
138 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
139 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
140 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
141 $(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
142 USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
143
144 $(foreach x, $(USER_SOURCES2OBJS),
145 $(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
146                 $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
147 )
148 $(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
149 USER_OBJS  += $$($(1)_OBJS)
150 USER_SOURCES += $$($(1)_SOURCES)
151
152 # I hope dependedcies are solved in vxWorks makefiles
153 .PHONY: $(USER_LIB_DIR)/lib$(1).a
154 $(USER_LIB_DIR)/lib$(1).a: #$$($(1)_OBJS)
155         @$(QUIET_CMD_ECHO) "  LIB     $$@"
156         @echo 'LIB_BASE_NAME = $(1)' > Makefile.lib.$(1); \
157         echo 'OBJS = $$($(1)_OBJS)' >> Makefile.lib.$(1); \
158         echo 'OBJ_DIR = $(USER_OBJS_DIR)' >> Makefile.lib.$(1); \
159         echo 'LIB_ROOT = $(USER_LIB_DIR)' >> Makefile.lib.$(1); \
160         echo 'VPATH = $(SOURCES_DIR)' >> Makefile.lib.$(1); \
161 #       echo 'LIBDIRBASE = ' >> Makefile.lib.$(1); \
162         echo 'include $$$$(WIND_USR)/make/rules.library' >> Makefile.lib.$(1); 
163         $(WRENV) -p $(WRPACKAGE) $(MAKE) CPU=$(CPU) TOOL=$(TOOL) -f Makefile.lib.$(1)
164 endef
165
166
167
168
169 # Generate rules for compilation of programs and libraries
170
171 $(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR))))
172
173 $(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR))))
174
175 $(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR))))
176
177 $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
178
179 $(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
180
181 $(eval $(call omk_pass_template,clean,$(USER_OBJS_DIR),,always))
182 $(eval $(call omk_pass_template,install,$(USER_OBJS_DIR),,always))
183 $(eval $(call omk_pass_template,include-pass,$(USER_OBJS_DIR),,always))
184
185 $(eval $(call include-pass-template,$(USER_INCLUDE_DIR),include))
186
187 library-pass-local: $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT))
188
189 binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.vxe) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%.vxe) $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%.vxe)
190
191 clean-local::
192         @echo Cleaning in $(USER_OBJS_DIR)
193         @rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
194                $(USER_OBJS_DIR)/*.d \
195                $(USER_OBJS_DIR)/*.map \
196                $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)
197
198 $(eval $(call omk_pass_template, library-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES)))
199 $(eval $(call omk_pass_template, binary-pass, $(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS)))
200
201 check-dir::
202         @$(call mkdir_def,$(USER_BUILD_DIR))
203         @$(call mkdir_def,$(USER_INCLUDE_DIR))
204         @$(call mkdir_def,$(USER_LIB_DIR))
205         @$(call mkdir_def,$(USER_BIN_DIR))
206         @$(call mkdir_def,$(USER_UTILS_DIR))
207         @$(call mkdir_def,$(USER_TESTS_DIR))
208
209
210 default: include-pass library-pass binary-pass