bb6ac4d941f77bd73e428363b0e1dcd43cb94581
[deliverable/titan.core.git] / core / Makefile
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)
This page took 0.080119 seconds and 4 git commands to generate.