1 mike 1.1 ##==============================================================================
2 ##
3 ## Phony targets.
4 ##
5 ##==============================================================================
6
7 .PHONY: gen all clean depend memcheck cachegrind proj
8
9 ##==============================================================================
10 ##
11 ## OpenSSL
12 ##
13 ##==============================================================================
14
15 ifdef CONFIG_TOOLCHAIN
16 OPENSSL_CFLAGS=-I$(CONFIG_TOOLCHAIN)/usr/include
17 OPENSSL_LIBS=-L$(CONFIG_TOOLCHAIN)/usr/lib -lssl -lcrypto
18 OPENSSL_LIBDIR=$(CONFIG_TOOLCHAIN)/usr/lib
19 export LD_LIBRARY_PATH=$(CONFIG_TOOLCHAIN)/lib:$(CONFIG_TOOLCHAIN)/usr/lib
20 else
21 OPENSSL_CFLAGS=$(shell $(PKGCONFIG) --cflags openssl)
22 mike 1.1 OPENSSL_LIBS=$(shell $(PKGCONFIG) --libs openssl)
23 OPENSSL_LIBDIR=$(shell $(PKGCONFIG) --variable=libdir openssl)
24 endif
25
26 ##==============================================================================
27 ##
28 ## OBJDIRPATH -- resolve directory where objects will go.
29 ##
30 ##==============================================================================
31
32 OBJDIRPATH=$(OBJDIR)$(subst $(ROOT),,$(CURDIR))
33
34 ifeq ($(subst $(ROOT),,$(CURDIR)), $(ROOT))
35 $(error "current directory seems to be a symbolic link")
36 endif
37
38 ##==============================================================================
39 ##
40 ## Obtain build flags with 'buildtool'.
41 ##
42 ##==============================================================================
43 mike 1.1
44 BUILDTOOL=$(ROOT)/buildtool
45
46 CC=$(shell $(BUILDTOOL) cc)
47
48 CXX=$(shell $(BUILDTOOL) cxx)
49
50 __OPTS=
51
52 ifeq ($(ENABLE_DEBUG),1)
53 __OPTS += --debug
54 endif
55
56 ifeq ($(ENABLE_WERROR),1)
57 __OPTS += --errwarn
58 endif
59
60 __OPTS += --pic
61
62 CFLAGS=$(shell $(BUILDTOOL) cflags $(__OPTS))
63 CFLAGS+=$(OPENSSL_CFLAGS)
64 mike 1.1
65 CXXFLAGS=$(shell $(BUILDTOOL) cxxflags $(__OPTS))
66 CXXFLAGS+=$(OPENSSL_CFLAGS)
67
68 ifdef DISABLE_LIBPATH
69 LIBPATHFLAGS=$(shell $(BUILDTOOL) libpath $(OPENSSL_LIBDIR))
70 else
71 LIBPATHFLAGS=$(shell $(BUILDTOOL) libpath $(CONFIG_LIBDIR) $(OPENSSL_LIBDIR))
72 endif
73
74 CSHLIBFLAGS=$(shell $(BUILDTOOL) cshlibflags)
75 CSHLIBFLAGS+=$(shell $(BUILDTOOL) syslibs)
76 CSHLIBFLAGS+=$(OPENSSL_LIBS)
77 CSHLIBFLAGS+=$(LIBPATHFLAGS)
78
79 CXXSHLIBFLAGS=$(shell $(BUILDTOOL) cxxshlibflags)
80 CXXSHLIBFLAGS+=$(shell $(BUILDTOOL) syslibs)
81 CXXSHLIBFLAGS+=$(OPENSSL_LIBS)
82 CXXSHLIBFLAGS+=$(LIBPATHFLAGS)
83
84 CPROGFLAGS=$(shell $(BUILDTOOL) cprogflags)
85 mike 1.1 CPROGFLAGS+=$(shell $(BUILDTOOL) syslibs)
86 CPROGFLAGS+=$(OPENSSL_LIBS)
87 CPROGFLAGS+=$(LIBPATHFLAGS)
88
89 CXXPROGFLAGS=$(shell $(BUILDTOOL) cxxprogflags)
90 CXXPROGFLAGS+=$(shell $(BUILDTOOL) syslibs)
91 CXXPROGFLAGS+=$(OPENSSL_LIBS)
92 CXXPROGFLAGS+=$(LIBPATHFLAGS)
93
94 ##==============================================================================
95 ##
96 ## OBJECTS:
97 ##
98 ##==============================================================================
99
100 __TMP = $(SOURCES:.c=.o)
101 __TMP2 = $(__TMP:.s=.o)
102 OBJECTS = $(__TMP2:.cpp=.o)
103 __OBJECTS = $(addprefix $(OBJDIRPATH)/,$(OBJECTS))
104
105 ##==============================================================================
106 mike 1.1 ##
107 ## LIBRARY target
108 ##
109 ##==============================================================================
110
111 ifdef LIBRARY
112
113 FOUND = 1
114
115 $(shell mkdir -p $(OBJDIRPATH))
116
117 ifndef TOP
118 $(error "Please define TOP variable")
119 endif
120
121 ifndef SOURCES
122 $(error "Please define SOURCES variable")
123 endif
124
125 TARGET = $(LIBDIR)/lib$(LIBRARY).a
126
127 mike 1.1 $(TARGET): $(__OBJECTS)
128 mkdir -p $(LIBDIR)
129 ar r $(TARGET) $(__OBJECTS)
130 @ echo
131
132 # ranlib $(TARGET)
133
134 endif
135
136 ##==============================================================================
137 ##
138 ## CSHLIBRARY target
139 ##
140 ##==============================================================================
141
142 ifdef CSHLIBRARY
143
144 FOUND = 1
145
146 $(shell mkdir -p $(OBJDIRPATH))
147
148 mike 1.1 ifndef TOP
149 $(error "Please define TOP variable")
150 endif
151
152 ifndef SOURCES
153 $(error "Please define SOURCES variable")
154 endif
155
156 TARGET = $(LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CSHLIBRARY))
157
158 __LIBRARIES = $(addprefix -l,$(LIBRARIES))
159 __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES))
160
161 ifndef DISABLE_LIBPATH
162 LIBNAMEOPT=$(shell $(BUILDTOOL) libname $(CONFIG_LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CSHLIBRARY)))
163 endif
164
165 $(TARGET): $(__OBJECTS)
166 mkdir -p $(LIBDIR)
167 $(CC) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CSHLIBFLAGS) $(LIBNAMEOPT)
168 @ echo
169 mike 1.1
170 chklib:
171 $(BINDIR)/chklib $(TARGET)
172
173 endif
174
175 ##==============================================================================
176 ##
177 ## CXXSHLIBRARY target
178 ##
179 ##==============================================================================
180
181 ifdef CXXSHLIBRARY
182
183 FOUND = 1
184
185 $(shell mkdir -p $(OBJDIRPATH))
186
187 ifndef TOP
188 $(error "Please define TOP variable")
189 endif
190 mike 1.1
191 ifndef SOURCES
192 $(error "Please define SOURCES variable")
193 endif
194
195 TARGET = $(LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CXXSHLIBRARY))
196
197 __LIBRARIES = $(addprefix -l,$(LIBRARIES))
198 __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES))
199
200 ifndef DISABLE_LIBPATH
201 LIBNAMEOPT=$(shell $(BUILDTOOL) libname $(CONFIG_LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CXXSHLIBRARY)))
202 endif
203
204 $(TARGET): $(__OBJECTS)
205 mkdir -p $(LIBDIR)
206 $(CXX) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CXXSHLIBFLAGS) $(LIBNAMEOPT)
207 @ echo
208
209 chklib:
210 $(BINDIR)/chklib $(TARGET)
211 mike 1.1
212 endif
213
214 ##==============================================================================
215 ##
216 ## CPROGRAM target
217 ##
218 ##==============================================================================
219
220 ifdef CPROGRAM
221
222 FOUND = 1
223
224 $(shell mkdir -p $(OBJDIRPATH))
225
226 ifndef TOP
227 $(error "Please define TOP variable")
228 endif
229
230 ifndef SOURCES
231 $(error "Please define SOURCES variable")
232 mike 1.1 endif
233
234 TARGET = $(BINDIR)/$(CPROGRAM)
235
236 __LIBRARIES = $(addprefix -l,$(LIBRARIES))
237 __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES))
238 __DEPS=$(wildcard $(addprefix $(LIBDIR)/lib,$(addsuffix .*,$(LIBRARIES))))
239
240 $(TARGET): $(__OBJECTS) $(__DEPS)
241 mkdir -p $(BINDIR)
242 $(CC) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CPROGFLAGS)
243 @ echo
244
245 endif
246
247 ##==============================================================================
248 ##
249 ## CXXPROGRAM target
250 ##
251 ##==============================================================================
252
253 mike 1.1 ifdef CXXPROGRAM
254
255 FOUND = 1
256
257 $(shell mkdir -p $(OBJDIRPATH))
258
259 ifndef TOP
260 $(error "Please define TOP variable")
261 endif
262
263 ifndef SOURCES
264 $(error "Please define SOURCES variable")
265 endif
266
267 TARGET = $(BINDIR)/$(CXXPROGRAM)
268
269 __LIBRARIES = $(addprefix -l,$(LIBRARIES))
270 __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES))
271 __DEPS=$(wildcard $(addprefix $(LIBDIR)/lib,$(addsuffix .*,$(LIBRARIES))))
272
273 all: $(TARGET) $(EXTRA_RULE)
274 mike 1.1
275 $(TARGET): $(__OBJECTS) $(__DEPS)
276 mkdir -p $(BINDIR)
277 $(CXX) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CXXPROGFLAGS)
278 @ echo
279
280 endif
281
282 ##==============================================================================
283 ##
284 ## DIRECTORIES target
285 ##
286 ##==============================================================================
287
288 ifdef DIRECTORIES
289
290 FOUND = 1
291
292 # define a newline macro
293 define NL
294
295 mike 1.1
296 endef
297
298 all:
299 @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i $(NL) )
300
301 clean:
302 @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i clean $(NL) )
303
304 depend:
305 @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i depend $(NL) )
306
307 endif
308
309 ##==============================================================================
310 ##
311 ## Check that one of the targets above was defined
312 ##
313 ##==============================================================================
314
315 ifndef FOUND
316 mike 1.1
317 TARGETS = \
318 LIBRARY \
319 LIBDIR \
320 CSHLIBRARY \
321 CXXSHLIBRARY \
322 CPROGRAM \
323 CXXPROGRAM \
324 DIRECTORIES
325
326 $(error "Please define one of the following targets: $(TARGETS)")
327
328 endif
329
330 ##==============================================================================
331 ##
332 ## USECCACHE
333 ##
334 ##==============================================================================
335
336 ifdef USECCACHE
337 mike 1.1 CWRAP=ccache
338 CXXWRAP=$(CWRAP)
339 endif
340
341 ##==============================================================================
342 ##
343 ## Object file targets
344 ##
345 ##==============================================================================
346
347 __INCLUDES = -I$(INCDIR) $(addprefix -I,$(INCLUDES))
348 __DEFINES = $(addprefix -D,$(DEFINES))
349
350 compilec = \
351 $(CWRAP) $(CC) -c -o $@ $(CFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2)
352
353 compilecxx = \
354 $(CXXWRAP) $(CXX) -c -o $@ $(CXXFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2)
355
356 compiles = \
357 $(CC) -c -o $@ $(CFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2)
358 mike 1.1
359 $(OBJDIRPATH)/%.o: %.c
360 $(call compilec,$<)
361 @ echo
362
363 $(OBJDIRPATH)/%.o: %.cpp
364 $(call compilecxx,$<)
365 @ echo
366
367 $(OBJDIRPATH)/%.o: %.s
368 $(call compiles,$<)
369 @ echo
370
371 ##==============================================================================
372 ##
373 ## clean target
374 ##
375 ##==============================================================================
376
377 ifndef DIRECTORIES
378 clean:
379 mike 1.1 rm -rf $(TARGET) $(__OBJECTS) $(OBJDIRPATH)/depend.mak $(CLEANFILES)
380 endif
381
382 ##==============================================================================
383 ##
384 ## depend target
385 ##
386 ##==============================================================================
387
388 MKDEP=$(BINDIR)/mkdep
389
390 ifndef DIRECTORIES
391 depend: $(BINDIR)/mkdep
392 $(MKDEP) --objdir $(OBJDIRPATH) $(__INCLUDES) $(SOURCES) > $(OBJDIRPATH)/depend.mak
393 endif
394
395 # Only build if we are not in the mkdep source directory.
396 ifndef MAKEDEPSRCDIR
397 $(BINDIR)/mkdep:
398 $(MAKE) -C $(ROOT)/tools/mkdep
399 endif
400 mike 1.1
401 ##==============================================================================
402 ##
403 ## memcheck target
404 ##
405 ##==============================================================================
406
407 MEMCHECK=valgrind --tool=memcheck --leak-check=full --error-exitcode=1 --gen-suppressions=all --track-fds=yes
408
409 ## --trace-children=yes
410
411 ifdef MEMCHECK_SUPPRESS
412 __MEMCHECK_SUPPRESS = --suppressions=$(MEMCHECK_SUPPRESS)
413 endif
414
415 memcheck:
416 $(MEMCHECK) $(__MEMCHECK_SUPPRESS) $(TARGET) $(MEMCHECK_ARGS)
417
418 ##==============================================================================
419 ##
420 ## cachegrind target
421 mike 1.1 ##
422 ##==============================================================================
423
424 CACHEGRIND=valgrind --tool=cachegrind
425
426 cachegrind:
427 $(CACHEGRIND) --cachegrind-out-file=callgrind.out $(TARGET) $(ARGUMENTS) $(MEMCHECK_ARGS)
428 cg_annotate --auto=yes callgrind.out > cg_annotate.out
429 rm -f callgrind.out
430 @ echo "Created cg_annotate.out"
431
432 ##==============================================================================
433 ##
434 ## Include depend.mak
435 ##
436 ##==============================================================================
437
438 -include $(OBJDIRPATH)/depend.mak
439
|