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