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