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