Commit | Line | Data |
---|---|---|
970ed795 EL |
1 | ############################################################################### |
2 | # Copyright (c) 2000-2014 Ericsson Telecom AB | |
3 | # All rights reserved. This program and the accompanying materials | |
4 | # are made available under the terms of the Eclipse Public License v1.0 | |
5 | # which accompanies this distribution, and is available at | |
6 | # http://www.eclipse.org/legal/epl-v10.html | |
7 | ############################################################################### | |
8 | # Makefile for the Base Library of TTCN-3 Test Executor | |
9 | TOP := .. | |
10 | include $(TOP)/Makefile.cfg | |
11 | ||
12 | SCHEMAS := TitanLoggerApi.xsd | |
13 | # Generated from `TitanLoggerApi.xsd'. | |
14 | GENERATED_MODULES := TitanLoggerApi.ttcn | |
15 | ||
16 | GENERATED_LOGGERAPI_SOURCES := $(GENERATED_MODULES:.ttcn=.cc) | |
17 | GENERATED_LOGGERCONTROL_SOURCES := TitanLoggerControl.cc | |
18 | ||
19 | ORIGINATORS := TitanLoggerApi.xsd TitanLoggerApi.ttcn TitanLoggerControl.ttcn gccversion.c \ | |
20 | config_process.l config_process.y | |
21 | ||
22 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
23 | APIDIR := RT1 | |
24 | else | |
25 | APIDIR := RT2 | |
26 | endif | |
27 | ||
28 | # RT1 (load test) generates cc/hh files into the RT1/ directory, | |
29 | # RT2 (function test) into the RT2/ directory. This has two purposes: | |
30 | # * To prevent the vpath directive in core2/Makefile from finding files in RT1. | |
31 | # This way, RT2 has to generate these files for itself (with RT2 settings). | |
32 | # * To allow TTCN3.hh to include the right kind of TitanLoggerApi.hh | |
33 | # These directories (RT1/RT2) are replicated inside $(INCDIR) | |
34 | GENERATED_LOGGERAPI_SOURCES := $(addprefix $(APIDIR)/,$(GENERATED_LOGGERAPI_SOURCES)) | |
35 | GENERATED_LOGGERCONTROL_SOURCES := $(addprefix $(APIDIR)/,$(GENERATED_LOGGERCONTROL_SOURCES)) | |
36 | ||
37 | GENERATED_SOURCES := $(GENERATED_LOGGERAPI_SOURCES) $(GENERATED_LOGGERCONTROL_SOURCES) config_process.lex.cc config_process.tab.cc | |
38 | GENERATED_HEADERS := $(GENERATED_LOGGERAPI_SOURCES:.cc=.hh) $(GENERATED_LOGGERCONTROL_SOURCES:.cc=.hh) config_process.tab.hh config_process.lex.hh | |
39 | GENERATED_HEADERS += $(GENERATED_LOGGERAPI_SOURCES:.cc=Simple.hh) | |
40 | GENERATED_OTHERS := $(GENERATED_LOGGERAPI_SOURCES).compiled $(GENERATED_LOGGERCONTROL_SOURCES).compiled | |
41 | GENERATED_OTHERS += config_process.output lex.backup | |
42 | ||
43 | TTCN_COMPILER_FLAGS := | |
44 | ifeq ($(FUNCTION_TEST_RUNTIME), yes) | |
45 | TTCN_COMPILER_FLAGS += -R | |
46 | endif | |
47 | ||
48 | TTCN_COMPILER_FLAGS += -o $(APIDIR) | |
49 | ||
50 | # -I. is needed because TitanLoggerApi.hh (generated) does #include <TTCN3.hh> | |
51 | CPPFLAGS += -I. -I$(APIDIR) | |
52 | ||
53 | SOLARIS_LIBS := -lsocket -lnsl -lxml2 | |
54 | SOLARIS8_LIBS := -lsocket -lnsl -lxml2 | |
55 | LINUX_LIBS := -lxml2 | |
56 | FREEBSD_LIBS := -lxml2 | |
57 | WIN32_LIBS := -lxml2 | |
58 | INTERIX_LIBS := -lxml2 | |
59 | ||
60 | ifeq ($(USAGE_STATS), yes) | |
61 | SOLARIS_LIBS += -lresolv | |
62 | SOLARIS8_LIBS += -lresolv | |
63 | LINUX_LIBS += -lpthread -lrt | |
64 | endif | |
65 | ||
66 | # No need for `-Wl,-export-dynamic' until we're using shared objects. All | |
67 | # `dl*()' related stuff is disabled for now. | |
68 | ifeq ($(DYNAMIC_LOGGER_PLUGINS), yes) | |
69 | $(PLATFORM)_LIBS += -ldl | |
70 | endif | |
71 | ||
72 | # Note: RT2_SOURCES is set in core2/Makefile | |
73 | STATIC_SOURCES := Addfunc.cc Array.cc ASN_Any.cc ASN_CharacterString.cc \ | |
74 | ASN_EmbeddedPDV.cc ASN_External.cc ASN_Null.cc Basetype.cc BER.cc Bitstring.cc \ | |
75 | Boolean.cc Charstring.cc Communication.cc Component.cc Default.cc Encdec.cc \ | |
76 | Error.cc Float.cc Hexstring.cc RInt.cc Integer.cc Logger.cc LoggerPlugin.cc \ | |
77 | LoggerPluginManager.cc LegacyLogger.cc LoggingBits.cc \ | |
78 | Module_list.cc Objid.cc Octetstring.cc Parallel_main.cc Port.cc RAW.cc \ | |
79 | Runtime.cc Single_main.cc Snapshot.cc Struct_of.cc Template.cc TEXT.cc \ | |
80 | Textbuf.cc Timer.cc Param_Types.cc Universal_charstring.cc \ | |
81 | Verdicttype.cc XER.cc XmlReader.cc TitanLoggerControlImpl.cc TCov.cc JSON.cc $(RT2_SOURCES) | |
82 | ||
83 | # Keep GENERATED_SOURCES at the beginning. This may speed up parallel builds | |
84 | # by starting early the compilation of the largest files. | |
85 | SOURCES := $(GENERATED_SOURCES) $(STATIC_SOURCES) | |
86 | ||
87 | ||
88 | ifeq ($(FUNCTION_TEST_RUNTIME), yes) | |
89 | RT2_SUFFIX := -rt2 | |
90 | CPPFLAGS += -DTITAN_RUNTIME_2 | |
91 | endif | |
92 | ||
93 | ifdef XMLDIR | |
94 | ifeq ($(XMLDIR), default) | |
95 | # Do not change XMLDIR ! | |
96 | ACTUAL_XMLDIR := /usr | |
97 | # do not add -L/usr/lib to LDFLAGS, it's redundant | |
98 | else | |
99 | ACTUAL_XMLDIR := $(XMLDIR) | |
100 | LDFLAGS += -L$(ACTUAL_XMLDIR)/lib | |
101 | endif | |
102 | # This addition to CPPFLAGS is always needed | |
103 | CPPFLAGS += -I$(ACTUAL_XMLDIR)/include/libxml2 | |
104 | endif | |
105 | ||
106 | ifdef OPENSSL_DIR | |
107 | ifneq ($(OPENSSL_DIR), default) | |
108 | CPPFLAGS += -I$(OPENSSL_DIR)/include | |
109 | LDFLAGS += -L$(OPENSSL_DIR)/lib | |
110 | endif | |
111 | endif | |
112 | ||
113 | ifeq ($(PLATFORM),INTERIX) | |
114 | # to get the "right" iconv, used by libxml2 | |
115 | CPPFLAGS += -I/usr/local/include | |
116 | endif | |
117 | ||
118 | ||
119 | OBJECTS := $(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(SOURCES))) | |
120 | ||
121 | COMMON_OBJECTS := $(addprefix ../common/, memory.o pattern_la.o pattern_p.o \ | |
122 | config_preproc.o config_preproc_la.o config_preproc_p.tab.o \ | |
123 | path.o pattern_uni.o Quadruple.o NetworkHandler.o Path2.o \ | |
124 | ModuleVersion.o JSON_Tokenizer.o) | |
125 | ||
126 | ifeq ($(DEBUG), yes) | |
127 | COMMON_OBJECTS += ../common/new.o | |
128 | endif | |
129 | ||
130 | ifeq ($(LICENSING), yes) | |
131 | COMMON_OBJECTS += ../common/license.o | |
132 | endif | |
133 | ||
134 | ifdef REGEX_DIR | |
135 | COMMON_OBJECTS += $(REGEX_DIR)/lib/regex.o | |
136 | endif | |
137 | ||
138 | ifeq ($(USAGE_STATS), yes) | |
139 | COMMON_OBJECTS += ../common/usage_stats.o | |
140 | endif | |
141 | ||
142 | LIBRARY_OBJECTS_NOMAIN := $(filter-out Single_main.o Parallel_main.o, \ | |
143 | $(OBJECTS)) $(COMMON_OBJECTS) | |
144 | ||
145 | TOBECLEANED := LoggerPlugin_static.o LoggerPlugin_dynamic.o | |
146 | ||
147 | DEPFILES := $(patsubst %.cc,%.d,$(patsubst %.c,%.d,$(SOURCES))) | |
148 | ||
149 | SUBDIRS := | |
150 | ||
151 | HEADERS := TTCN3.hh Types.h Param_Types.hh Basetype.hh Template.hh RInt.hh \ | |
152 | Integer.hh Float.hh Boolean.hh Objid.hh Verdicttype.hh Bitstring.hh \ | |
153 | Hexstring.hh Octetstring.hh Charstring.hh Universal_charstring.hh Component.hh \ | |
154 | Logger.hh ILoggerPlugin.hh Error.hh Timer.hh Runtime.hh Snapshot.hh Default.hh \ | |
155 | Port.hh Event_Handler.hh Struct_of.hh Array.hh Optional.hh Textbuf.hh Encdec.hh \ | |
156 | Module_list.hh Parameters.h Addfunc.hh RAW.hh BER.hh TEXT.hh ASN_Null.hh \ | |
157 | ASN_Any.hh ASN_External.hh ASN_EmbeddedPDV.hh ASN_CharacterString.hh XER.hh \ | |
158 | XmlReader.hh cversion.h TitanLoggerControl.ttcn TitanLoggerApi.xsd Vector.hh \ | |
159 | JSON.hh | |
160 | # Copied during "make install" | |
161 | ||
162 | ifdef REGEX_DIR | |
163 | HEADERS += $(REGEX_DIR)/include/regex.h | |
164 | endif | |
165 | ||
166 | # # # # Library and shared lib names | |
167 | LIBRARY := libttcn3$(RT2_SUFFIX).a | |
168 | PARALLEL_LIBRARY := libttcn3$(RT2_SUFFIX)-parallel.a | |
169 | SHAREDLIB := libttcn3$(RT2_SUFFIX)-dynamic.so | |
170 | PARALLEL_SHAREDLIB := libttcn3$(RT2_SUFFIX)-parallel-dynamic.so | |
171 | ||
172 | TARGETS := $(LIBRARY) $(PARALLEL_LIBRARY) | |
173 | ||
174 | # Determine whether to build shared libraries: | |
175 | DYNAMIC_LINKING := yes | |
176 | ifeq ($(PLATFORM), WIN32) | |
177 | LDFLAGS += -Xlinker --out-implib -Xlinker $(basename $@).a | |
178 | endif | |
179 | ifeq ($(PLATFORM), INTERIX) | |
180 | DYNAMIC_LINKING := no | |
181 | endif | |
182 | ||
183 | ifeq ($(DYNAMIC_LINKING), yes) | |
184 | TARGETS += $(SHAREDLIB) $(PARALLEL_SHAREDLIB) | |
185 | ifeq ($(PLATFORM), WIN32) | |
186 | # import libraries are generated as a side-effect; need to be cleaned | |
187 | TOBECLEANED += $(SHAREDLIB:.so=.a) $(PARALLEL_SHAREDLIB:.so=.a) | |
188 | endif | |
189 | endif | |
190 | ||
191 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
192 | TARGETS += cversion.h | |
193 | endif | |
194 | ||
195 | # Only for testing the consistency of libraries: | |
196 | #PROGRAMS := | |
197 | ||
198 | PROGRAMS := single$(RT2_SUFFIX)$(EXESUFFIX) parallel$(RT2_SUFFIX)$(EXESUFFIX) | |
199 | ifeq ($(DYNAMIC_LINKING), yes) | |
200 | PROGRAMS += single$(RT2_SUFFIX)-dynamic$(EXESUFFIX) parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX) | |
201 | endif | |
202 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
203 | PROGRAMS += gccversion$(EXESUFFIX) | |
204 | endif | |
205 | ||
206 | ||
207 | TOBECLEANED += $(PROGRAMS) cversion.h $(GENERATED_MODULES) | |
208 | ||
209 | ifdef REGEX_DIR | |
210 | CPPFLAGS += -I$(REGEX_DIR)/include | |
211 | endif | |
212 | ||
213 | ||
214 | ifdef SRCDIR | |
215 | COMMON_DIR := $(SRCDIR)/common | |
216 | else | |
217 | COMMON_DIR := ../common | |
218 | endif | |
219 | ||
220 | CPPFLAGS += -I$(COMMON_DIR) | |
221 | ||
222 | # # # # # # # # # targets | |
223 | all: $(TARGETS) $(PROGRAMS) | |
224 | ||
225 | run: all | |
226 | # Verify that the executables are runnable. | |
227 | for p in $(filter-out gccversion%,$(PROGRAMS)); do echo $$p; LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./$$p -l; if [ $$? -ne 0 ] ; then exit $$?; fi done | |
228 | ||
229 | # xsd -> ttcn | |
230 | $(GENERATED_MODULES): $(SCHEMAS) ../xsdconvert/xsd2ttcn$(EXESUFFIX) | |
231 | ../xsdconvert/xsd2ttcn$(EXESUFFIX) -p $< | |
232 | sed -e 's/XSD.String/charstring/g;s/XSD.AnySimpleType/charstring/g;s/XSD.Integer/integer/g;s/XSD.Float/float/g;s/XSD.Double/float/g;s/XSD.Boolean/boolean/g;s/import from XSD all;//g' TitanLoggerApi.ttcn >TitanLoggerApi.ttcn_ | |
233 | mv TitanLoggerApi.ttcn_ TitanLoggerApi.ttcn | |
234 | ||
235 | install: $(TARGETS) | |
236 | ifeq ($(DYNAMIC_LINKING), yes) | |
237 | ifeq ($(DEBUG), no) | |
238 | $(STRIP) $(SHAREDLIB) $(PARALLEL_SHAREDLIB) | |
239 | endif | |
240 | endif | |
241 | mkdir -p $(LIBDIR) | |
242 | cp $(TARGETS) $(LIBDIR) | |
243 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
244 | mkdir -p $(INCDIR) | |
245 | cp $(HEADERS) $(INCDIR) | |
246 | ifeq ($(DYNAMIC_LINKING), yes) | |
247 | ifneq ($(OPENSSL_DIR), default) | |
248 | (cd $(OPENSSL_DIR)/lib && tar -cf - libcrypto.so*) |\ | |
249 | (cd $(LIBDIR) && tar -xf -) | |
250 | endif | |
251 | ifneq ($(XMLDIR), default) | |
252 | (cd $(XMLDIR)/lib && tar -cf - libxml2.so*) |\ | |
253 | (cd $(LIBDIR) && tar -xf -) | |
254 | endif | |
255 | endif | |
256 | endif | |
257 | mkdir -p $(INCDIR)/$(APIDIR) | |
258 | cp $(APIDIR)/TitanLoggerApi*.hh $(INCDIR)/$(APIDIR) | |
259 | ||
260 | # # # # executables | |
261 | single$(RT2_SUFFIX)$(EXESUFFIX): $(LIBRARY) | |
262 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
263 | ||
264 | single$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Single_main.o $(SHAREDLIB) | |
265 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
266 | ||
267 | parallel$(RT2_SUFFIX)$(EXESUFFIX): $(PARALLEL_LIBRARY) | |
268 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
269 | ||
270 | parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Parallel_main.o $(PARALLEL_SHAREDLIB) | |
271 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
272 | ||
273 | # # # # static link libraries | |
274 | $(LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Single_main.o | |
275 | $(AR) -r $@ $? | |
276 | ||
277 | $(PARALLEL_LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Parallel_main.o | |
278 | $(AR) -r $@ $? | |
279 | ||
280 | # # # # dynamic link libraries | |
281 | ||
282 | $(SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Single_main.o | |
283 | $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) | |
284 | ||
285 | $(PARALLEL_SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Parallel_main.o | |
286 | $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) | |
287 | ||
288 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
289 | # core2 -> core dependency, core2 does not run flex and bison | |
290 | # core must be made before core2 | |
291 | ||
292 | %.lex.cc %.lex.hh: %.l | |
293 | $(FLEX) $(FLEXFLAGS) -P$(subst .l,_,$<) --header-file=$(subst .l,.lex.hh,$<) \ | |
294 | -o$(subst .l,.lex.cc,$<) $< | |
295 | ||
296 | %.tab.cc %.tab.hh: %.y %.lex.hh | |
297 | $(BISON) $(BISONFLAGS) -o $(subst .y,.tab.cc,$<) -p $(subst .y,_,$<) $< | |
298 | ||
299 | cversion.h: gccversion$(EXESUFFIX) | |
300 | ./$< > $@.tmp | |
301 | if [ -f $@ ] ; then \ | |
302 | if diff $@.tmp $@ >/dev/null ; then \ | |
303 | rm $@.tmp ; \ | |
304 | else \ | |
305 | mv $@.tmp $@ ; \ | |
306 | fi \ | |
307 | else \ | |
308 | mv $@.tmp $@ ; \ | |
309 | fi | |
310 | ||
311 | gccversion$(EXESUFFIX): gccversion.c ../Makefile.cfg | |
312 | # The line before the backslash is $(LINK.c), except it uses CCFLAGS | |
313 | # instead of CFLAGS. TARGET_ARCH is not used by Titan. | |
314 | $(CC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) \ | |
315 | $< $(LOADLIBES) $(LDLIBS) -o $@ | |
316 | endif | |
317 | ||
318 | #LegacyLogger.d: cversion.h | |
319 | $(DEPFILES): cversion.h | |
320 | ||
321 | #TitanLoggerControlImpl.d Single_main.d Runtime.d Port.d LegacyLogger.d \ | |
322 | #LoggerPlugin.d LoggerPluginManager.d Error.d Default.d Communication.d \ | |
323 | #Addfunc.d: $(GENERATED_LOGGERAPI_SOURCES:.cc=.cc) | |
324 | ||
325 | TitanLoggerControlImpl.d: $(GENERATED_LOGGERCONTROL_SOURCES) | |
326 | ||
327 | ||
328 | $(GENERATED_LOGGERAPI_SOURCES): $(GENERATED_LOGGERAPI_SOURCES).compiled | |
329 | @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi | |
330 | ||
331 | $(GENERATED_LOGGERAPI_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX) | |
332 | @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi | |
333 | ||
334 | $(GENERATED_LOGGERAPI_SOURCES).compiled:: $(GENERATED_MODULES) | |
335 | mkdir -p $(APIDIR) | |
336 | # The input (TitanLoggerApi.ttcn) is a generated file and might get corrupted | |
337 | # by parallel execution of xsd2ttcn. Get it out of the way but save it for later. | |
338 | if ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $?; then :; else mv $? $?.$$$$.bad; exit 1; fi | |
339 | perl $(ABS_SRC)/../core/simplify.pl $(GENERATED_LOGGERAPI_SOURCES:.cc=.hh) > $(GENERATED_LOGGERAPI_SOURCES:.cc=Simple.hh) | |
340 | touch $@ | |
341 | ||
342 | $(GENERATED_LOGGERCONTROL_SOURCES): $(GENERATED_LOGGERCONTROL_SOURCES).compiled | |
343 | @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi | |
344 | ||
345 | $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX) | |
346 | @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi | |
347 | ||
348 | $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: TitanLoggerControl.ttcn | |
349 | mkdir -p $(APIDIR) | |
350 | ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $? | |
351 | touch $@ | |
352 | ||
353 | include ../Makefile.genrules | |
354 | ||
355 | # These are not in STATIC_SOURCES, so vpath is not created for them | |
356 | vpath LoggerPlugin_dynamic.cc $(ABS_SRC) | |
357 | vpath LoggerPlugin_static.cc $(ABS_SRC) |