ea118e12aa206413c3f1ef79ae2c5a8c814d055a
[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 -lcurses
79 SOLARIS8_LIBS := -lsocket -lnsl -lxml2 -lcurses
80 LINUX_LIBS := -lxml2 -lncurses
81 FREEBSD_LIBS := -lxml2 -lncurses
82 WIN32_LIBS := -lxml2 -lncurses
83 INTERIX_LIBS := -lxml2 -lncurses
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 DebuggerUI.cc \
108 $(RT2_SOURCES)
109
110 # Keep GENERATED_SOURCES at the beginning. This may speed up parallel builds
111 # by starting early the compilation of the largest files.
112 SOURCES := $(GENERATED_SOURCES) $(STATIC_SOURCES)
113
114
115 ifeq ($(FUNCTION_TEST_RUNTIME), yes)
116 RT2_SUFFIX := -rt2
117 CPPFLAGS += -DTITAN_RUNTIME_2
118 endif
119
120 ifdef XMLDIR
121 ifeq ($(XMLDIR), default)
122 # Do not change XMLDIR !
123 ACTUAL_XMLDIR := /usr
124 # do not add -L/usr/lib to LDFLAGS, it's redundant
125 else
126 ACTUAL_XMLDIR := $(XMLDIR)
127 LDFLAGS += -L$(ACTUAL_XMLDIR)/lib
128 endif
129 # This addition to CPPFLAGS is always needed
130 CPPFLAGS += -I$(ACTUAL_XMLDIR)/include/libxml2
131 endif
132
133 ifdef OPENSSL_DIR
134 ifneq ($(OPENSSL_DIR), default)
135 CPPFLAGS += -I$(OPENSSL_DIR)/include
136 LDFLAGS += -L$(OPENSSL_DIR)/lib
137 endif
138 endif
139
140 ifeq ($(PLATFORM),INTERIX)
141 # to get the "right" iconv, used by libxml2
142 CPPFLAGS += -I/usr/local/include
143 endif
144
145
146 OBJECTS := $(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(SOURCES)))
147
148 PROFMERGE_OBJECTS := ProfMerge_main.o ProfilerTools.profmerge.o \
149 ../common/JSON_Tokenizer.o ../common/memory.o
150
151 COMMON_OBJECTS := $(addprefix ../common/, memory.o pattern_la.o pattern_p.o \
152 config_preproc.o config_preproc_la.o config_preproc_p.tab.o \
153 path.o pattern_uni.o Quadruple.o NetworkHandler.o Path2.o \
154 ModuleVersion.o JSON_Tokenizer.o)
155
156 ifeq ($(DEBUG), yes)
157 COMMON_OBJECTS += ../common/new.o
158 endif
159
160 ifeq ($(LICENSING), yes)
161 COMMON_OBJECTS += ../common/license.o
162 PROFMERGE_OBJECTS += ../common/license.o
163 endif
164
165 ifdef REGEX_DIR
166 COMMON_OBJECTS += $(REGEX_DIR)/lib/regex.o
167 endif
168
169 ifeq ($(USAGE_STATS), yes)
170 COMMON_OBJECTS += ../common/usage_stats.o
171 endif
172
173 EDITLINE_OBJECTS := $(addprefix ../mctr2/editline/build/src/.libs/, chared.o common.o \
174 emacs.o fgetln.o help.o history.o map.o prompt.o read.o search.o strlcat.o term.o tty.o \
175 vi.o wcsdup.o chartype.o el.o fcns.o filecomplete.o hist.o key.o parse.o readline.o \
176 refresh.o sig.o strlcpy.o tokenizer.o unvis.o vis.o)
177
178 LIBRARY_OBJECTS_NOMAIN := $(filter-out Single_main.o Parallel_main.o ProfMerge_main.o, \
179 $(OBJECTS)) $(COMMON_OBJECTS) $(EDITLINE_OBJECTS)
180
181 TOBECLEANED := LoggerPlugin_static.o LoggerPlugin_dynamic.o ProfilerTools.profmerge.o
182
183 DEPFILES := $(patsubst %.cc,%.d,$(patsubst %.c,%.d,$(SOURCES)))
184
185 SUBDIRS :=
186
187 HEADERS := TTCN3.hh Types.h Param_Types.hh Basetype.hh Template.hh RInt.hh \
188 Integer.hh Float.hh Boolean.hh Objid.hh Verdicttype.hh Bitstring.hh \
189 Hexstring.hh Octetstring.hh Charstring.hh Universal_charstring.hh Component.hh \
190 Logger.hh ILoggerPlugin.hh Error.hh Timer.hh Runtime.hh Snapshot.hh Default.hh \
191 Port.hh Event_Handler.hh Struct_of.hh Array.hh Optional.hh Textbuf.hh Encdec.hh \
192 Module_list.hh Parameters.h Addfunc.hh RAW.hh BER.hh TEXT.hh ASN_Null.hh \
193 ASN_Any.hh ASN_External.hh ASN_EmbeddedPDV.hh ASN_CharacterString.hh XER.hh \
194 XmlReader.hh cversion.h TitanLoggerControl.ttcn TitanLoggerApi.xsd Vector.hh \
195 JSON.hh Profiler.hh RefdIndex.hh ProfilerTools.hh Debugger.hh DebugCommands.hh \
196 DebuggerUI.hh
197 # Copied during "make install"
198
199 ifdef REGEX_DIR
200 HEADERS += $(REGEX_DIR)/include/regex.h
201 endif
202
203 # # # # Library and shared lib names
204 LIBRARY := libttcn3$(RT2_SUFFIX).a
205 PARALLEL_LIBRARY := libttcn3$(RT2_SUFFIX)-parallel.a
206 SHAREDLIB := libttcn3$(RT2_SUFFIX)-dynamic.so
207 PARALLEL_SHAREDLIB := libttcn3$(RT2_SUFFIX)-parallel-dynamic.so
208
209 # Executables
210 ifneq ($(FUNCTION_TEST_RUNTIME), yes)
211 PROGRAMS := ttcn3_profmerge$(EXESUFFIX)
212 endif
213
214 TARGETS := $(LIBRARY) $(PARALLEL_LIBRARY)
215
216 # Determine whether to build shared libraries:
217 DYNAMIC_LINKING := yes
218 ifeq ($(PLATFORM), WIN32)
219 LDFLAGS += -Xlinker --out-implib -Xlinker $(basename $@).a
220 endif
221 ifeq ($(PLATFORM), INTERIX)
222 DYNAMIC_LINKING := no
223 endif
224
225 ifeq ($(DYNAMIC_LINKING), yes)
226 TARGETS += $(SHAREDLIB) $(PARALLEL_SHAREDLIB)
227 ifeq ($(PLATFORM), WIN32)
228 # import libraries are generated as a side-effect; need to be cleaned
229 TOBECLEANED += $(SHAREDLIB:.so=.a) $(PARALLEL_SHAREDLIB:.so=.a)
230 endif
231 endif
232
233 ifneq ($(FUNCTION_TEST_RUNTIME), yes)
234 TARGETS += cversion.h
235 endif
236
237 # Only for testing the consistency of libraries:
238 TEST_PROGRAMS := single$(RT2_SUFFIX)$(EXESUFFIX) parallel$(RT2_SUFFIX)$(EXESUFFIX)
239 ifeq ($(DYNAMIC_LINKING), yes)
240 TEST_PROGRAMS += single$(RT2_SUFFIX)-dynamic$(EXESUFFIX) parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX)
241 endif
242 ifneq ($(FUNCTION_TEST_RUNTIME), yes)
243 TEST_PROGRAMS += gccversion$(EXESUFFIX)
244 endif
245
246
247 TOBECLEANED += $(TEST_PROGRAMS) cversion.h $(GENERATED_MODULES)
248
249 ifdef REGEX_DIR
250 CPPFLAGS += -I$(REGEX_DIR)/include
251 endif
252
253
254 ifdef SRCDIR
255 COMMON_DIR := $(SRCDIR)/common
256 else
257 COMMON_DIR := ../common
258 endif
259
260 CPPFLAGS += -I$(COMMON_DIR)
261
262 MANPAGES := ttcn3_profmerge.1
263
264 # # # # # # # # # targets
265 all: $(TARGETS) $(PROGRAMS) $(TEST_PROGRAMS)
266
267 run: all
268 # Verify that the executables are runnable.
269 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
270
271 # xsd -> ttcn
272 $(GENERATED_MODULES): $(SCHEMAS) ../xsdconvert/xsd2ttcn$(EXESUFFIX)
273 ../xsdconvert/xsd2ttcn$(EXESUFFIX) -p $<
274 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_
275 mv TitanLoggerApi.ttcn_ TitanLoggerApi.ttcn
276
277 install: $(TARGETS) $(PROGRAMS)
278 ifeq ($(DYNAMIC_LINKING), yes)
279 ifeq ($(DEBUG), no)
280 $(STRIP) $(SHAREDLIB) $(PARALLEL_SHAREDLIB)
281 endif
282 endif
283 mkdir -p $(LIBDIR)
284 cp $(TARGETS) $(LIBDIR)
285 ifneq ($(FUNCTION_TEST_RUNTIME), yes)
286 mkdir -p $(INCDIR)
287 cp $(HEADERS) $(INCDIR)
288 mkdir -p $(BINDIR)
289 cp $(PROGRAMS) $(BINDIR)
290 mkdir -p $(MANDIR)/man1
291 cp $(MANPAGES) $(MANDIR)/man1
292 ifeq ($(DYNAMIC_LINKING), yes)
293 ifneq ($(OPENSSL_DIR), default)
294 (cd $(OPENSSL_DIR)/lib && tar -cf - libcrypto.so*) |\
295 (cd $(LIBDIR) && tar -xf -)
296 endif
297 ifneq ($(XMLDIR), default)
298 (cd $(XMLDIR)/lib && tar -cf - libxml2.so*) |\
299 (cd $(LIBDIR) && tar -xf -)
300 endif
301 endif
302 endif
303 mkdir -p $(INCDIR)/$(APIDIR)
304 cp $(APIDIR)/TitanLoggerApi*.hh $(INCDIR)/$(APIDIR)
305 cp $(APIDIR)/PreGenRecordOf.hh $(INCDIR)/$(APIDIR)
306
307 # # # # executables
308 single$(RT2_SUFFIX)$(EXESUFFIX): $(LIBRARY)
309 $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS)
310
311 single$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Single_main.o $(SHAREDLIB)
312 $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS)
313
314 parallel$(RT2_SUFFIX)$(EXESUFFIX): $(PARALLEL_LIBRARY)
315 $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS)
316
317 parallel$(RT2_SUFFIX)-dynamic$(EXESUFFIX): Parallel_main.o $(PARALLEL_SHAREDLIB)
318 $(CXX) $(LDFLAGS) -o $@ $^ -lcrypto $($(PLATFORM)_LIBS)
319
320 ttcn3_profmerge$(EXESUFFIX): $(PROFMERGE_OBJECTS)
321 $(CXX) $(LDFLAGS) -o $@ $^ $(LICENSE_LIBS) $($(PLATFORM)_LIBS)
322
323 # # # # static link libraries
324 $(LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Single_main.o
325 $(AR) -r $@ $?
326
327 $(PARALLEL_LIBRARY): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_static.o Parallel_main.o
328 $(AR) -r $@ $?
329
330 # # # # dynamic link libraries
331
332 $(SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Single_main.o
333 $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS)
334
335 $(PARALLEL_SHAREDLIB): $(LIBRARY_OBJECTS_NOMAIN) LoggerPlugin_dynamic.o Parallel_main.o
336 $(LD) $(LDFLAGS) -o $@ $^ -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS)
337
338 ifneq ($(FUNCTION_TEST_RUNTIME), yes)
339 # core2 -> core dependency, core2 does not run flex and bison
340 # core must be made before core2
341
342 %.lex.cc %.lex.hh: %.l
343 $(FLEX) $(FLEXFLAGS) -P$(subst .l,_,$<) --header-file=$(subst .l,.lex.hh,$<) \
344 -o$(subst .l,.lex.cc,$<) $<
345
346 %.tab.cc %.tab.hh: %.y %.lex.hh
347 $(BISON) $(BISONFLAGS) -o $(subst .y,.tab.cc,$<) -p $(subst .y,_,$<) $<
348
349 cversion.h: gccversion$(EXESUFFIX)
350 ./$< > $@.tmp
351 if [ -f $@ ] ; then \
352 if diff $@.tmp $@ >/dev/null ; then \
353 rm $@.tmp ; \
354 else \
355 mv $@.tmp $@ ; \
356 fi \
357 else \
358 mv $@.tmp $@ ; \
359 fi
360
361 gccversion$(EXESUFFIX): gccversion.c ../Makefile.cfg
362 # The line before the backslash is $(LINK.c), except it uses CCFLAGS
363 # instead of CFLAGS. TARGET_ARCH is not used by Titan.
364 $(CC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) \
365 $< $(LOADLIBES) $(LDLIBS) -o $@
366 endif
367
368 #LegacyLogger.d: cversion.h
369 $(DEPFILES): cversion.h
370
371 #TitanLoggerControlImpl.d Single_main.d Runtime.d Port.d LegacyLogger.d \
372 #LoggerPlugin.d LoggerPluginManager.d Error.d Default.d Communication.d \
373 #Addfunc.d: $(GENERATED_LOGGERAPI_SOURCES:.cc=.cc)
374
375 TitanLoggerControlImpl.d: $(GENERATED_LOGGERCONTROL_SOURCES)
376
377
378 $(GENERATED_LOGGERAPI_SOURCES): $(GENERATED_LOGGERAPI_SOURCES).compiled
379 @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi
380
381 $(GENERATED_LOGGERAPI_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX)
382 @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi
383
384 $(GENERATED_LOGGERAPI_SOURCES).compiled:: $(GENERATED_MODULES)
385 mkdir -p $(APIDIR)
386 # The input (TitanLoggerApi.ttcn) is a generated file and might get corrupted
387 # by parallel execution of xsd2ttcn. Get it out of the way but save it for later.
388 if ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $?; then :; else mv $? $?.$$$$.bad; exit 1; fi
389 perl $(ABS_SRC)/../core/simplify.pl $(GENERATED_LOGGERAPI_SOURCES:.cc=.hh) > $(GENERATED_LOGGERAPI_SOURCES:.cc=Simple.hh)
390 touch $@
391
392 $(GENERATED_LOGGERCONTROL_SOURCES): $(GENERATED_LOGGERCONTROL_SOURCES).compiled
393 @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi
394
395 $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX)
396 @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi
397
398 $(GENERATED_LOGGERCONTROL_SOURCES).compiled:: TitanLoggerControl.ttcn
399 mkdir -p $(APIDIR)
400 ../compiler2/compiler$(EXESUFFIX) $(TTCN_COMPILER_FLAGS) $^ - $?
401 touch $@
402
403 $(PREGENERATED_SOURCES): $(PREGENERATED_SOURCES).compiled
404 @if [ ! -f $@ ]; then $(RM) $<; $(MAKE) $<; fi
405
406 $(PREGENERATED_SOURCES).compiled:: ../compiler2/compiler$(EXESUFFIX)
407 @if [ -f $@ ]; then $(RM) $@; $(MAKE) $@; fi
408
409 $(PREGENERATED_SOURCES).compiled:: $(PREGENERATOR_MODULES)
410 mkdir -p $(APIDIR)
411 ../compiler2/compiler$(EXESUFFIX) -F $(TTCN_COMPILER_FLAGS) $^ - $?
412 touch $@
413
414 include ../Makefile.genrules
415
416 # These are not in STATIC_SOURCES, so vpath is not created for them
417 vpath LoggerPlugin_dynamic.cc $(ABS_SRC)
418 vpath LoggerPlugin_static.cc $(ABS_SRC)
This page took 0.036398 seconds and 4 git commands to generate.