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