Fix compile bugs for win32
[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 ?= 1
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
102 ifeq ($(HARDENING),1)
103   ifeq ($(OPTIMIZE),)
104     OPTIMIZE := -O2
105   endif
106 endif
107
108 ##############
109 # add gcc warnings and optimizations if CFLAGS not set
110 ##############
111
112 ifndef CFLAGS
113   ifndef WARNINGS
114     ALL_WARNINGS +=     -Wall
115     ALL_WARNINGS +=     -Wextra
116     ALL_WARNINGS +=     -Wold-style-definition
117     ALL_WARNINGS +=     -Wdeclaration-after-statement
118     ALL_WARNINGS +=     -Wmissing-prototypes
119     ALL_WARNINGS +=     -Wstrict-prototypes
120     ALL_WARNINGS +=     -Wmissing-declarations
121     ALL_WARNINGS +=     -Wsign-compare
122     ALL_WARNINGS +=     -Waggregate-return
123     ALL_WARNINGS +=     -Wmissing-noreturn
124     ALL_WARNINGS +=     -Wmissing-format-attribute
125     ALL_WARNINGS +=     -Wno-multichar
126     ALL_WARNINGS +=     -Wno-deprecated-declarations
127     ALL_WARNINGS +=     -Wendif-labels
128     ALL_WARNINGS +=     -Wwrite-strings
129     ALL_WARNINGS +=     -Wbad-function-cast
130     ALL_WARNINGS +=     -Wpointer-arith
131     ALL_WARNINGS +=     -Wcast-qual
132     ALL_WARNINGS +=     -Wshadow
133     ALL_WARNINGS +=     -Wformat-2
134     ALL_WARNINGS +=     -Wsequence-point
135     ALL_WARNINGS +=     -Wpointer-arith
136     #ALL_WARNINGS +=    -Wcast-align
137
138     # the following 2 do not work yet and need more work on it
139     #ALL_WARNINGS +=    -Wconversion
140     #ALL_WARNINGS +=    -Wredundant-decls
141
142     ifeq ($(MUDFLAP),0)
143       # work around a bug in gcc-4.*
144       ALL_WARNINGS +=   -Wnested-externs
145     endif
146
147     # Alas, htons() triggers this so we can't seriously activate it.
148     #ALL_WARNINGS +=    -Wunreachable-code
149
150     ALL_WARNINGS +=     -Winline
151     ALL_WARNINGS +=     -Wdisabled-optimization
152                 ALL_WARNINGS += -Wformat
153                 ALL_WARNINGS += -Wformat-security
154     ALL_WARNINGS +=     -Werror
155     ALL_WARNINGS +=     -finline-functions-called-once
156     ALL_WARNINGS +=     -funit-at-a-time
157     ALL_WARNINGS +=     -fearly-inlining
158     ALL_WARNINGS += -fno-strict-aliasing
159     
160     ifeq ($(DEBUG),0)
161       ALL_WARNINGS +=   -fomit-frame-pointer
162     endif
163
164     # we have small inline functions in src/ipcalc.h which should always be inlined
165     ALL_WARNINGS +=     -finline-limit=350
166
167     # These tell gcc to put each function and global variable in a separate section.
168     # The linker can than remove all unreferenced section. But in the olsrd binary
169     # unused doesn't imply unused at all since the function may be used by plugins,
170     # e.g. the ones in src/plugin_utils.c.
171     # So we can use that feature at most to identify unused functions and remove them
172     # from the source by hand.
173
174     #ALL_WARNINGS +=    -ffunction-sections
175     #ALL_WARNINGS +=    -fdata-sections
176     ALL_WARNINGS +=     -Wstrict-overflow=5
177     ALL_WARNINGS +=     $(EXTRA_WARNINGS)
178     WARNINGS := $(shell CC="$(CC)" $(TOPDIR)/gcc-warnings $(ALL_WARNINGS) 2> /dev/null)
179   endif
180
181   CFLAGS +=     $(WARNINGS)
182   CFLAGS +=     $(OPTIMIZE)
183   CFLAGS +=     $(EXTRA_CFLAGS)
184
185   ifneq ($(filter -Wstrict-overflow%,$(WARNINGS)),)
186     NO_STRICT_OVERFLOW = -Wstrict-overflow=0
187   endif
188
189 endif # ifndef CFLAGS
190
191 ifeq ($(DEBUG),1)
192   CPPFLAGS +=   -DDEBUG
193   CFLAGS +=     -ggdb
194   OPTIMIZE ?=   -O0
195 else
196   OPTIMIZE ?=   -Os
197 endif
198
199 ifneq ($(MUDFLAP),0)
200   CFLAGS +=     -fmudflapth
201 endif
202
203 ifdef OLSRD_PLUGIN
204   # c and ld flags for libraries (plugins)
205   CPPFLAGS +=   -DOLSR_PLUGIN
206   LDFLAGS +=    -shared
207   LDFLAGS +=    -Wl,-soname,$(PLUGIN_NAME)
208   LDFLAGS +=    -Wl,--version-script=version-script.txt
209 else
210   # c and ld flags for main
211   ifeq ($(HARDENING),1)
212     CFLAGS +=   -fPIE
213     LDFLAGS +=  -pie
214   endif
215   ifeq ($(LD_HAS_DYN), yes)
216     LDFLAGS_EXE +=      -Wl,--dynamic-list=$(EXENAME).exports
217   else
218     LDFLAGS_EXE +=      -Wl,-export-dynamic
219   endif
220   LDFLAGS +=    -Wl,-rpath,$(LIBDIR)
221 endif
222
223 # LDFLAGS for all
224 LDFLAGS +=      -Wl,--warn-common
225
226 # See above at "-ffunction-sections" for an explanation (and why it is disabled).
227 #LDOPTS +=      -Wl,--gc-sections
228 #LDOPTS +=      -Wl,--print-gc-sections
229 #LDFLAGS +=     $(shell CC="$(CC)" $(TOPDIR)/ld-warnings $(LDOPTS))
230 ifneq ($(MUDFLAP),0)
231   LIBS +=               -lmudflapth
232 endif
233
234 # extra options from the outside
235 CPPFLAGS +=     $(EXTRA_CPPFLAGS)
236 LDFLAGS +=      $(EXTRA_LDFLAGS)
237
238 # search sources and headers in current dir and in src/
239 SRCS +=         $(wildcard src/common/*.c src/*.c)
240 HDRS +=         $(wildcard src/common/*.h src/*.h)
241
242 #get headers and object files for static plugins
243 STATIC_PLUGIN_SRCS += $(foreach dir,$(STATIC_PLUGINS),$(wildcard lib/$(dir)/src/*.c))
244 STATIC_PLUGIN_OBJS += $(STATIC_PLUGIN_SRCS:%.c=%.o)
245
246 ifdef OLSRD_PLUGIN
247   # this must be run after the OS-specific makefile
248   CPPFLAGS +=  -DPLUGIN_FULLNAME="\"$(PLUGIN_FULLNAME)\""
249 endif
250
251 # load os-specific makefiles
252 ifeq ($(OS),UNKNOWN)
253 all: help
254 else
255 # include OS specifics
256 all: default_target
257 include $(TOPDIR)/make/Makefile.$(OS)
258 endif
259
260 # one object for each source file
261 OBJS +=         $(SRCS:%.c=%.o)
262
263 # a make function to quote "/" and "."
264 quote = $(subst .,\.,$(subst /,\/,$1))
265
266 # fully automatic and working dependency generation
267 %.d: %.c
268         @$(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' >"$@"
269
270 src/common/autobuf.o src/mpr.o: CFLAGS += $(NO_STRICT_OVERFLOW)
271
272 # we always need the includes and defines
273 # for legacy since now
274 CPPFLAGS += $(INCLUDES) $(DEFINES)
275 ifneq ($(INCLUDES),)
276   $(warning Use CPPFLAGS instead of INCLUDES for -I)
277 endif
278 ifneq ($(DEFINES),)
279   $(warning Use CPPFLAGS instead of DEFINES for -D)
280 endif
281
282 TAGFILE ?=      src/TAGS
283
284 help:
285         @echo
286         @echo '***** olsr.org olsr daemon Make ****'
287         @echo ' Automatic detection of your OS     '
288         @echo ' failed!                            '
289         @echo ' You can provide a valid target OS  '
290         @echo ' by setting the OS variable! Valid  '
291         @echo ' target OSes are:                   '
292         @echo ' ---------------------------------  '
293         @echo ' linux - GNU/Linux                  '
294         @echo ' win32 - MS Windows                 '
295         @echo ' fbsd  - FreeBSD                    '
296         @echo ' nbsd  - NetBSD                     '
297         @echo ' obsd  - OpenBSD                    '
298         @echo ' osx   - Mac OS X                   '
299         @echo ' ---------------------------------  '
300         @echo ' Example - build for windows:       '
301         @echo ' make OS=win32                      '
302         @echo ' If you are developing olsrd code,  '
303         @echo ' exporting the OS variable might    '
304         @echo ' be a good idea :-) Have fun!       '
305         @echo '************************************'
306         @echo
307
308 ifeq ($(filter clean% %clean rpm, $(MAKECMDGOALS)),)
309 # include dependencies - we don't need any dependency for a everytime generated files
310 -include $(filter-out src/builddata.%,$(SRCS:%.c=%.d))
311 endif
312
313 # Local Variables:
314 # mode: makefile
315 # End: