Bugfix for interface refactoring
[olsrd.git] / Makefile.inc
1 ######################
2 #
3 # Highlevel configuration options for all
4 #
5 #
6
7 # set DEBUG to 1 to add debugger symbols to olsrd
8 # set DEBUG to 0 to remove both and optimize olsrd for size
9 DEBUG ?= 1
10
11 # set to 1 to remove a severity level of logging from olsrd
12 REMOVE_LOG_DEBUG ?= 0
13 REMOVE_LOG_INFO  ?= 0
14 REMOVE_LOG_WARN  ?= 0
15 REMOVE_LOG_ERROR ?= 0
16
17 # enable mudflap with 1 or deactivate with 0
18 # you need a recent enough gcc and the libmudflap installed
19 MUDFLAP ?= 0
20
21 # enables several security features like exec ASLR,
22 # stack protector, fortify source, RELRO and BIND_NOW
23 # only for linux at the moment
24 HARDENING ?= 0
25
26 # enable static linking of plugins (list of plugin directory names) 
27 STATIC_PLUGINS ?= lq_etx_ff
28
29 ######################
30 #
31 # Lowlevel options and rules
32 #
33
34 # programs
35 CCACHE ?=       $(shell IFS=:; for i in $$PATH;do test -x "$$i/ccache" && echo "$$i/ccache" && break; done)
36 ifeq ($(origin CC),default)
37   CC =          $(CCACHE) gcc
38 else
39   CC ?=                 $(CCACHE) gcc
40 endif
41 ifeq ($(DEBUG),0)
42   STRIP ?=      strip
43 else
44   STRIP ?=      :
45 endif
46
47 BISON ?=        bison
48 FLEX ?=         flex
49 TAGCMD ?=       etags
50 LD_HAS_DYN ?=   $(shell $(CC) -Wl,--help 2>&1|grep -w -q -- --dynamic-list && echo yes)
51
52 # target directories and names
53 PREFIX  ?= /usr/local
54 DESTDIR ?=
55 SBINDIR ?= $(DESTDIR)$(PREFIX)/sbin
56 ETCDIR  ?= $(DESTDIR)$(subst /usr/etc,/etc,$(PREFIX)/etc)
57 LIBDIR  ?= $(DESTDIR)$(PREFIX)/lib
58 DOCDIR  ?= $(DESTDIR)$(PREFIX)/share/doc
59 MANDIR  ?= $(DESTDIR)$(PREFIX)/share/man
60 EXENAME ?= olsrd
61 CFGNAME ?= $(EXENAME).conf
62 CFGFILE ?= $(ETCDIR)/$(CFGNAME)
63
64 CPPFLAGS =      $(filter-out -I./src,-Isrc -I$(TOPDIR)/src)
65 CPPFLAGS +=     -DOLSRD_CONF_FILE_NAME='"$(CFGNAME)"'
66 CPPFLAGS +=     -DOLSRD_GLOBAL_CONF_FILE='"$(CFGFILE)"'
67
68 #############
69 # handle debugging and logging options
70 #############
71 ifeq ($(REMOVE_LOG_DEBUG),1)
72   CPPFLAGS +=   -DREMOVE_LOG_DEBUG
73 endif
74 ifeq ($(REMOVE_LOG_INFO),1)
75   CPPFLAGS +=   -DREMOVE_LOG_INFO
76 endif
77 ifeq ($(REMOVE_LOG_WARN),1)
78   CPPFLAGS +=   -DREMOVE_LOG_WARN
79 endif
80 ifeq ($(REMOVE_LOG_ERROR),1)
81   CPPFLAGS +=   -DREMOVE_LOG_ERROR
82 endif
83
84 ##############
85 # OS detection
86 ##############
87 ifeq ($(OS),Windows_NT)
88   OS := win32
89 endif
90 ifeq ($(OS),)
91   OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
92 endif
93
94 #################
95 # OLSRd hardening
96 #################
97 # -D_FORTIFY_SOURCE=2 need at least -O2
98 ifeq ($(OS),win32)
99   HARDENING := 0
100 endif
101 ifeq ($(DEBUG),1)
102   HARDENING := 0
103 endif
104
105 ifeq ($(HARDENING),1)
106   ifeq ($(OPTIMIZE),)
107     OPTIMIZE := -O2
108   endif
109 endif
110
111 ##############
112 # add gcc warnings and optimizations if CFLAGS not set
113 ##############
114
115 ifndef CFLAGS
116   ifndef WARNINGS
117     ALL_WARNINGS +=     -Wall
118     ALL_WARNINGS +=     -Wextra
119     ALL_WARNINGS +=     -Wold-style-definition
120     ALL_WARNINGS +=     -Wdeclaration-after-statement
121     ALL_WARNINGS +=     -Wmissing-prototypes
122     ALL_WARNINGS +=     -Wstrict-prototypes
123     ALL_WARNINGS +=     -Wmissing-declarations
124     ALL_WARNINGS +=     -Wsign-compare
125     ALL_WARNINGS +=     -Waggregate-return
126     ALL_WARNINGS +=     -Wmissing-noreturn
127     ALL_WARNINGS +=     -Wmissing-format-attribute
128     ALL_WARNINGS +=     -Wno-multichar
129     ALL_WARNINGS +=     -Wno-deprecated-declarations
130     ALL_WARNINGS +=     -Wendif-labels
131     ALL_WARNINGS +=     -Wwrite-strings
132     ALL_WARNINGS +=     -Wbad-function-cast
133     ALL_WARNINGS +=     -Wpointer-arith
134     ALL_WARNINGS +=     -Wcast-qual
135     ALL_WARNINGS +=     -Wshadow
136     ALL_WARNINGS +=     -Wformat-2
137     ALL_WARNINGS +=     -Wsequence-point
138     ALL_WARNINGS +=     -Wpointer-arith
139     #ALL_WARNINGS +=    -Wcast-align
140
141     # the following 2 do not work yet and need more work on it
142     #ALL_WARNINGS +=    -Wconversion
143     #ALL_WARNINGS +=    -Wredundant-decls
144
145     ifeq ($(MUDFLAP),0)
146       # work around a bug in gcc-4.*
147       ALL_WARNINGS +=   -Wnested-externs
148     endif
149
150     # Alas, htons() triggers this so we can't seriously activate it.
151     #ALL_WARNINGS +=    -Wunreachable-code
152
153     ALL_WARNINGS +=     -Winline
154     ALL_WARNINGS +=     -Wdisabled-optimization
155                 ALL_WARNINGS += -Wformat
156                 ALL_WARNINGS += -Wformat-security
157     ALL_WARNINGS +=     -Werror
158     ALL_WARNINGS +=     -finline-functions-called-once
159     ALL_WARNINGS +=     -funit-at-a-time
160     ALL_WARNINGS +=     -fearly-inlining
161     ALL_WARNINGS += -fno-strict-aliasing
162     
163     ifeq ($(DEBUG),0)
164       ALL_WARNINGS +=   -fomit-frame-pointer
165     endif
166
167     # we have small inline functions in src/ipcalc.h which should always be inlined
168     ALL_WARNINGS +=     -finline-limit=350
169
170     # These tell gcc to put each function and global variable in a separate section.
171     # The linker can than remove all unreferenced section. But in the olsrd binary
172     # unused doesn't imply unused at all since the function may be used by plugins,
173     # e.g. the ones in src/plugin_utils.c.
174     # So we can use that feature at most to identify unused functions and remove them
175     # from the source by hand.
176
177     #ALL_WARNINGS +=    -ffunction-sections
178     #ALL_WARNINGS +=    -fdata-sections
179     ALL_WARNINGS +=     -Wstrict-overflow=5
180     ALL_WARNINGS +=     $(EXTRA_WARNINGS)
181     WARNINGS := $(shell CC="$(CC)" $(TOPDIR)/gcc-warnings $(ALL_WARNINGS) 2> /dev/null)
182   endif
183
184   CFLAGS +=     $(WARNINGS)
185   CFLAGS +=     $(OPTIMIZE)
186   CFLAGS +=     $(EXTRA_CFLAGS)
187
188   ifneq ($(filter -Wstrict-overflow%,$(WARNINGS)),)
189     NO_STRICT_OVERFLOW = -Wstrict-overflow=0
190   endif
191
192 endif # ifndef CFLAGS
193
194 ifeq ($(DEBUG),1)
195   CPPFLAGS +=   -DDEBUG
196   CFLAGS +=     -ggdb
197   OPTIMIZE ?=   -O0
198 else
199   OPTIMIZE ?=   -Os
200 endif
201
202 ifneq ($(MUDFLAP),0)
203   CFLAGS +=     -fmudflapth
204 endif
205
206 ifdef OLSRD_PLUGIN
207   # c and ld flags for libraries (plugins)
208   CPPFLAGS +=   -DOLSR_PLUGIN
209   LDFLAGS +=    -shared
210   LDFLAGS +=    -Wl,-soname,$(PLUGIN_NAME)
211   LDFLAGS +=    -Wl,--version-script=version-script.txt
212 else
213   # c and ld flags for main
214   ifeq ($(HARDENING),1)
215     CFLAGS +=   -fPIE
216     LDFLAGS +=  -pie
217   endif
218   ifeq ($(LD_HAS_DYN), yes)
219     LDFLAGS_EXE +=      -Wl,--dynamic-list=$(EXENAME).exports
220   else
221     LDFLAGS_EXE +=      -Wl,-export-dynamic
222   endif
223   LDFLAGS +=    -Wl,-rpath,$(LIBDIR)
224 endif
225
226 # LDFLAGS for all
227 LDFLAGS +=      -Wl,--warn-common
228
229 # See above at "-ffunction-sections" for an explanation (and why it is disabled).
230 #LDOPTS +=      -Wl,--gc-sections
231 #LDOPTS +=      -Wl,--print-gc-sections
232 #LDFLAGS +=     $(shell CC="$(CC)" $(TOPDIR)/ld-warnings $(LDOPTS))
233 ifneq ($(MUDFLAP),0)
234   LIBS +=               -lmudflapth
235 endif
236
237 # extra options from the outside
238 CPPFLAGS +=     $(EXTRA_CPPFLAGS)
239 LDFLAGS +=      $(EXTRA_LDFLAGS)
240
241 # search sources and headers in current dir and in src/
242 SRCS +=         $(wildcard src/common/*.c src/*.c)
243 HDRS +=         $(wildcard src/common/*.h src/*.h)
244
245 #get headers and object files for static plugins
246 STATIC_PLUGIN_SRCS += $(foreach dir,$(STATIC_PLUGINS),$(wildcard lib/$(dir)/src/*.c))
247 STATIC_PLUGIN_OBJS += $(STATIC_PLUGIN_SRCS:%.c=%.o)
248
249 ifdef OLSRD_PLUGIN
250   # this must be run after the OS-specific makefile
251   CPPFLAGS +=  -DPLUGIN_FULLNAME="\"$(PLUGIN_FULLNAME)\""
252 endif
253
254 # load os-specific makefiles
255 ifeq ($(OS),UNKNOWN)
256 all: help
257 else
258 # include OS specifics
259 all: default_target
260 include $(TOPDIR)/make/Makefile.$(OS)
261 endif
262
263 # one object for each source file
264 OBJS +=         $(SRCS:%.c=%.o)
265
266 # a make function to quote "/" and "."
267 quote = $(subst .,\.,$(subst /,\/,$1))
268
269 # fully automatic and working dependency generation
270 %.d: %.c
271         @$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(if $(TOPDIR),$(TOPDIR)/)Makefile.inc) /g' >"$@"
272
273 src/common/autobuf.o src/mpr.o: CFLAGS += $(NO_STRICT_OVERFLOW)
274
275 # we always need the includes and defines
276 # for legacy since now
277 CPPFLAGS += $(INCLUDES) $(DEFINES)
278 ifneq ($(INCLUDES),)
279   $(warning Use CPPFLAGS instead of INCLUDES for -I)
280 endif
281 ifneq ($(DEFINES),)
282   $(warning Use CPPFLAGS instead of DEFINES for -D)
283 endif
284
285 TAGFILE ?=      src/TAGS
286
287 help:
288         @echo
289         @echo '***** olsr.org olsr daemon Make ****'
290         @echo ' Automatic detection of your OS     '
291         @echo ' failed!                            '
292         @echo ' You can provide a valid target OS  '
293         @echo ' by setting the OS variable! Valid  '
294         @echo ' target OSes are:                   '
295         @echo ' ---------------------------------  '
296         @echo ' linux - GNU/Linux                  '
297         @echo ' win32 - MS Windows                 '
298         @echo ' fbsd  - FreeBSD                    '
299         @echo ' nbsd  - NetBSD                     '
300         @echo ' obsd  - OpenBSD                    '
301         @echo ' osx   - Mac OS X                   '
302         @echo ' ---------------------------------  '
303         @echo ' Example - build for windows:       '
304         @echo ' make OS=win32                      '
305         @echo ' If you are developing olsrd code,  '
306         @echo ' exporting the OS variable might    '
307         @echo ' be a good idea :-) Have fun!       '
308         @echo '************************************'
309         @echo
310
311 ifeq ($(filter clean% %clean rpm, $(MAKECMDGOALS)),)
312 # include dependencies - we don't need any dependency for a everytime generated files
313 -include $(filter-out src/builddata.%,$(SRCS:%.c=%.d))
314 endif
315
316 # Local Variables:
317 # mode: makefile
318 # End: