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 \ | |
af710487 | 81 | Verdicttype.cc XER.cc XmlReader.cc TitanLoggerControlImpl.cc TCov.cc JSON.cc \ |
82 | Profiler.cc $(RT2_SOURCES) | |
970ed795 EL |
83 | |
84 | # Keep GENERATED_SOURCES at the beginning. This may speed up parallel builds | |
85 | # by starting early the compilation of the largest files. | |
86 | SOURCES := $(GENERATED_SOURCES) $(STATIC_SOURCES) | |
87 | ||
88 | ||
89 | ifeq ($(FUNCTION_TEST_RUNTIME), yes) | |
90 | RT2_SUFFIX := -rt2 | |
91 | CPPFLAGS += -DTITAN_RUNTIME_2 | |
92 | endif | |
93 | ||
94 | ifdef XMLDIR | |
95 | ifeq ($(XMLDIR), default) | |
96 | # Do not change XMLDIR ! | |
97 | ACTUAL_XMLDIR := /usr | |
98 | # do not add -L/usr/lib to LDFLAGS, it's redundant | |
99 | else | |
100 | ACTUAL_XMLDIR := $(XMLDIR) | |
101 | LDFLAGS += -L$(ACTUAL_XMLDIR)/lib | |
102 | endif | |
103 | # This addition to CPPFLAGS is always needed | |
104 | CPPFLAGS += -I$(ACTUAL_XMLDIR)/include/libxml2 | |
105 | endif | |
106 | ||
107 | ifdef OPENSSL_DIR | |
108 | ifneq ($(OPENSSL_DIR), default) | |
109 | CPPFLAGS += -I$(OPENSSL_DIR)/include | |
110 | LDFLAGS += -L$(OPENSSL_DIR)/lib | |
111 | endif | |
112 | endif | |
113 | ||
114 | ifeq ($(PLATFORM),INTERIX) | |
115 | # to get the "right" iconv, used by libxml2 | |
116 | CPPFLAGS += -I/usr/local/include | |
117 | endif | |
118 | ||
119 | ||
120 | OBJECTS := $(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(SOURCES))) | |
121 | ||
122 | COMMON_OBJECTS := $(addprefix ../common/, memory.o pattern_la.o pattern_p.o \ | |
123 | config_preproc.o config_preproc_la.o config_preproc_p.tab.o \ | |
124 | path.o pattern_uni.o Quadruple.o NetworkHandler.o Path2.o \ | |
125 | ModuleVersion.o JSON_Tokenizer.o) | |
126 | ||
127 | ifeq ($(DEBUG), yes) | |
128 | COMMON_OBJECTS += ../common/new.o | |
129 | endif | |
130 | ||
131 | ifeq ($(LICENSING), yes) | |
132 | COMMON_OBJECTS += ../common/license.o | |
133 | endif | |
134 | ||
135 | ifdef REGEX_DIR | |
136 | COMMON_OBJECTS += $(REGEX_DIR)/lib/regex.o | |
137 | endif | |
138 | ||
139 | ifeq ($(USAGE_STATS), yes) | |
140 | COMMON_OBJECTS += ../common/usage_stats.o | |
141 | endif | |
142 | ||
143 | LIBRARY_OBJECTS_NOMAIN := $(filter-out Single_main.o Parallel_main.o, \ | |
144 | $(OBJECTS)) $(COMMON_OBJECTS) | |
145 | ||
146 | TOBECLEANED := LoggerPlugin_static.o LoggerPlugin_dynamic.o | |
147 | ||
148 | DEPFILES := $(patsubst %.cc,%.d,$(patsubst %.c,%.d,$(SOURCES))) | |
149 | ||
150 | SUBDIRS := | |
151 | ||
152 | HEADERS := TTCN3.hh Types.h Param_Types.hh Basetype.hh Template.hh RInt.hh \ | |
153 | Integer.hh Float.hh Boolean.hh Objid.hh Verdicttype.hh Bitstring.hh \ | |
154 | Hexstring.hh Octetstring.hh Charstring.hh Universal_charstring.hh Component.hh \ | |
155 | Logger.hh ILoggerPlugin.hh Error.hh Timer.hh Runtime.hh Snapshot.hh Default.hh \ | |
156 | Port.hh Event_Handler.hh Struct_of.hh Array.hh Optional.hh Textbuf.hh Encdec.hh \ | |
157 | Module_list.hh Parameters.h Addfunc.hh RAW.hh BER.hh TEXT.hh ASN_Null.hh \ | |
158 | ASN_Any.hh ASN_External.hh ASN_EmbeddedPDV.hh ASN_CharacterString.hh XER.hh \ | |
159 | XmlReader.hh cversion.h TitanLoggerControl.ttcn TitanLoggerApi.xsd Vector.hh \ | |
af710487 | 160 | JSON.hh Profiler.hh |
970ed795 EL |
161 | # Copied during "make install" |
162 | ||
163 | ifdef REGEX_DIR | |
164 | HEADERS += $(REGEX_DIR)/include/regex.h | |
165 | endif | |
166 | ||
167 | # # # # Library and shared lib names | |
168 | LIBRARY := libttcn3$(RT2_SUFFIX).a | |
169 | PARALLEL_LIBRARY := libttcn3$(RT2_SUFFIX)-parallel.a | |
170 | SHAREDLIB := libttcn3$(RT2_SUFFIX)-dynamic.so | |
171 | PARALLEL_SHAREDLIB := libttcn3$(RT2_SUFFIX)-parallel-dynamic.so | |
172 | ||
173 | TARGETS := $(LIBRARY) $(PARALLEL_LIBRARY) | |
174 | ||
175 | # Determine whether to build shared libraries: | |
176 | DYNAMIC_LINKING := yes | |
177 | ifeq ($(PLATFORM), WIN32) | |
178 | LDFLAGS += -Xlinker --out-implib -Xlinker $(basename $@).a | |
179 | endif | |
180 | ifeq ($(PLATFORM), INTERIX) | |
181 | DYNAMIC_LINKING := no | |
182 | endif | |
183 | ||
184 | ifeq ($(DYNAMIC_LINKING), yes) | |
185 | TARGETS += $(SHAREDLIB) $(PARALLEL_SHAREDLIB) | |
186 | ifeq ($(PLATFORM), WIN32) | |
187 | # import libraries are generated as a side-effect; need to be cleaned | |
188 | TOBECLEANED += $(SHAREDLIB:.so=.a) $(PARALLEL_SHAREDLIB:.so=.a) | |
189 | endif | |
190 | endif | |
191 | ||
192 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
193 | TARGETS += cversion.h | |
194 | endif | |
195 | ||
196 | # Only for testing the consistency of libraries: | |
197 | #PROGRAMS := | |
198 | ||
199 | PROGRAMS := single$(RT2_SUFFIX)$(EXESUFFIX) parallel$(RT2_SUFFIX)$(EXESUFFIX) | |
200 | ifeq ($(DYNAMIC_LINKING), yes) | |
201 | PROGRAMS += single$(RT2_SUFFIX)-dynamic$(EXESUFFIX) parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX) | |
202 | endif | |
203 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
204 | PROGRAMS += gccversion$(EXESUFFIX) | |
205 | endif | |
206 | ||
207 | ||
208 | TOBECLEANED += $(PROGRAMS) cversion.h $(GENERATED_MODULES) | |
209 | ||
210 | ifdef REGEX_DIR | |
211 | CPPFLAGS += -I$(REGEX_DIR)/include | |
212 | endif | |
213 | ||
214 | ||
215 | ifdef SRCDIR | |
216 | COMMON_DIR := $(SRCDIR)/common | |
217 | else | |
218 | COMMON_DIR := ../common | |
219 | endif | |
220 | ||
221 | CPPFLAGS += -I$(COMMON_DIR) | |
222 | ||
223 | # # # # # # # # # targets | |
224 | all: $(TARGETS) $(PROGRAMS) | |
225 | ||
226 | run: all | |
227 | # Verify that the executables are runnable. | |
228 | 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 | |
229 | ||
230 | # xsd -> ttcn | |
231 | $(GENERATED_MODULES): $(SCHEMAS) ../xsdconvert/xsd2ttcn$(EXESUFFIX) | |
232 | ../xsdconvert/xsd2ttcn$(EXESUFFIX) -p $< | |
233 | 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_ | |
234 | mv TitanLoggerApi.ttcn_ TitanLoggerApi.ttcn | |
235 | ||
236 | install: $(TARGETS) | |
237 | ifeq ($(DYNAMIC_LINKING), yes) | |
238 | ifeq ($(DEBUG), no) | |
239 | $(STRIP) $(SHAREDLIB) $(PARALLEL_SHAREDLIB) | |
240 | endif | |
241 | endif | |
242 | mkdir -p $(LIBDIR) | |
243 | cp $(TARGETS) $(LIBDIR) | |
244 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
245 | mkdir -p $(INCDIR) | |
246 | cp $(HEADERS) $(INCDIR) | |
247 | ifeq ($(DYNAMIC_LINKING), yes) | |
248 | ifneq ($(OPENSSL_DIR), default) | |
249 | (cd $(OPENSSL_DIR)/lib && tar -cf - libcrypto.so*) |\ | |
250 | (cd $(LIBDIR) && tar -xf -) | |
251 | endif | |
252 | ifneq ($(XMLDIR), default) | |
253 | (cd $(XMLDIR)/lib && tar -cf - libxml2.so*) |\ | |
254 | (cd $(LIBDIR) && tar -xf -) | |
255 | endif | |
256 | endif | |
257 | endif | |
258 | mkdir -p $(INCDIR)/$(APIDIR) | |
259 | cp $(APIDIR)/TitanLoggerApi*.hh $(INCDIR)/$(APIDIR) | |
260 | ||
261 | # # # # executables | |
262 | single$(RT2_SUFFIX)$(EXESUFFIX): $(LIBRARY) | |
263 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
264 | ||
265 | single$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Single_main.o $(SHAREDLIB) | |
266 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
267 | ||
268 | parallel$(RT2_SUFFIX)$(EXESUFFIX): $(PARALLEL_LIBRARY) | |
269 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
270 | ||
271 | parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Parallel_main.o $(PARALLEL_SHAREDLIB) | |
272 | $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS) | |
273 | ||
274 | # # # # static link libraries | |
275 | $(LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Single_main.o | |
276 | $(AR) -r $@ $? | |
277 | ||
278 | $(PARALLEL_LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Parallel_main.o | |
279 | $(AR) -r $@ $? | |
280 | ||
281 | # # # # dynamic link libraries | |
282 | ||
283 | $(SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Single_main.o | |
284 | $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) | |
285 | ||
286 | $(PARALLEL_SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Parallel_main.o | |
287 | $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) | |
288 | ||
289 | ifneq ($(FUNCTION_TEST_RUNTIME), yes) | |
290 | # core2 -> core dependency, core2 does not run flex and bison | |
291 | # core must be made before core2 | |
292 | ||
293 | %.lex.cc %.lex.hh: %.l | |
294 | $(FLEX) $(FLEXFLAGS) -P$(subst .l,_,$<) --header-file=$(subst .l,.lex.hh,$<) \ | |
295 | -o$(subst .l,.lex.cc,$<) $< | |
296 | ||
297 | %.tab.cc %.tab.hh: %.y %.lex.hh | |
298 | $(BISON) $(BISONFLAGS) -o $(subst .y,.tab.cc,$<) -p $(subst .y,_,$<) $< | |
299 | ||
300 | cversion.h: gccversion$(EXESUFFIX) | |
301 | ./$< > $@.tmp | |
302 | if [ -f $@ ] ; then \ | |
303 | if diff $@.tmp $@ >/dev/null ; then \ | |
304 | rm $@.tmp ; \ | |
305 | else \ | |
306 | mv $@.tmp $@ ; \ | |
307 | fi \ | |
308 | else \ | |
309 | mv $@.tmp $@ ; \ | |
310 | fi | |
311 | ||
312 | gccversion$(EXESUFFIX): gccversion.c ../Makefile.cfg | |
313 | # The line before the backslash is $(LINK.c), except it uses CCFLAGS | |
314 | # instead of CFLAGS. TARGET_ARCH is not used by Titan. | |
315 | $(CC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) \ | |
316 | $< $(LOADLIBES) $(LDLIBS) -o $@ | |
317 | endif | |
318 | ||
319 | #LegacyLogger.d: cversion.h | |
320 | $(DEPFILES): cversion.h | |
321 | ||
322 | #TitanLoggerControlImpl.d Single_main.d Runtime.d Port.d LegacyLogger.d \ | |
323 | #LoggerPlugin.d LoggerPluginManager.d Error.d Default.d Communication.d \ | |
324 | #Addfunc.d: $(GENERATED_LOGGERAPI_SOURCES:.cc=.cc) | |
325 | ||
326 | TitanLoggerControlImpl.d: $(GENERATED_LOGGERCONTROL_SOURCES) | |
327 | ||
328 | ||
329 | $(GENERATED_LOGGERAPI_SOURCES): $(GENERATED_LOGGERAPI_SOURCES).compiled | |
330 | @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi | |
331 | ||
332 | $(GENERATED_LOGGERAPI_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX) | |
333 | @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi | |
334 | ||
335 | $(GENERATED_LOGGERAPI_SOURCES).compiled:: $(GENERATED_MODULES) | |
336 | mkdir -p $(APIDIR) | |
337 | # The input (TitanLoggerApi.ttcn) is a generated file and might get corrupted | |
338 | # by parallel execution of xsd2ttcn. Get it out of the way but save it for later. | |
339 | if ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $?; then :; else mv $? $?.$$$$.bad; exit 1; fi | |
340 | perl $(ABS_SRC)/../core/simplify.pl $(GENERATED_LOGGERAPI_SOURCES:.cc=.hh) > $(GENERATED_LOGGERAPI_SOURCES:.cc=Simple.hh) | |
341 | touch $@ | |
342 | ||
343 | $(GENERATED_LOGGERCONTROL_SOURCES): $(GENERATED_LOGGERCONTROL_SOURCES).compiled | |
344 | @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi | |
345 | ||
346 | $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX) | |
347 | @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi | |
348 | ||
349 | $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: TitanLoggerControl.ttcn | |
350 | mkdir -p $(APIDIR) | |
351 | ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $? | |
352 | touch $@ | |
353 | ||
354 | include ../Makefile.genrules | |
355 | ||
356 | # These are not in STATIC_SOURCES, so vpath is not created for them | |
357 | vpath LoggerPlugin_dynamic.cc $(ABS_SRC) | |
358 | vpath LoggerPlugin_static.cc $(ABS_SRC) |