# compile OLSR_PRINTF out
NO_DEBUG_MESSAGES ?= 0
+# the optimize option to be set for gcc
+OPTIMIZE ?=
+
# enable mudflap with 1 or deactivate with 0
# you need a recent enough gcc and the libmudflap installed
MUDFLAP ?= 0
+# shows full compiler/linker calls if activated
+VERBOSE ?= 0
+
+ifeq ($(VERBOSE),0)
+MAKECMDPREFIX = @
+else
+MAKECMDPREFIX =
+endif
+
+# OS detection
+ifeq ($(OS),Windows_NT)
+OS := win32
+endif
+ifeq ($(OS),)
+OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
+endif
######################
#
TAGCMD ?= etags
# target directories and names
-PREFIX ?= /usr/local
-DESTDIR ?=
-SBINDIR ?= $(DESTDIR)$(PREFIX)/sbin
-ETCDIR ?= $(DESTDIR)$(subst /usr/etc,/etc,$(PREFIX)/etc)
-LIBDIR ?= $(DESTDIR)$(PREFIX)/lib
-DOCDIR ?= $(DESTDIR)$(PREFIX)/share/doc
-MANDIR ?= $(DESTDIR)$(PREFIX)/share/man
-EXENAME ?= olsrd
-CFGNAME ?= $(EXENAME).conf
-CFGFILE ?= $(ETCDIR)/$(CFGNAME)
-
-CPPFLAGS = $(filter-out -I./src,-Isrc -I$(TOPDIR)/src)
-CPPFLAGS += -DOLSRD_CONF_FILE_NAME='"$(CFGNAME)"'
-CPPFLAGS += -DOLSRD_GLOBAL_CONF_FILE='"$(CFGFILE)"'
+DESTDIR ?=
+ETCDIR ?= $(DESTDIR)/etc
+USRDIR ?= $(DESTDIR)/usr
+INCLUDEDIR ?= $(DESTDIR)/usr/include
+LIBDIR ?= $(USRDIR)/lib
+SBINDIR ?= $(USRDIR)/sbin
+SHAREDIR ?= $(USRDIR)/share
+DOCDIR ?= $(SHAREDIR)/doc
+MANDIR ?= $(SHAREDIR)/man
+EXENAME ?= olsrd
+CFGNAME ?= $(EXENAME).conf
+CFGFILE ?= $(ETCDIR)/$(CFGNAME)
+
+DOCDIR_OLSRD ?= $(DOCDIR)/$(EXENAME)
+
+
+CPPFLAGS = -Isrc
+ifneq ($(TOPDIR),.)
+CPPFLAGS += -I$(TOPDIR)/src
+endif
# add gcc warnings and optimizations if CFLAGS not set
ifndef CFLAGS
ifndef WARNINGS
-ALL_WARNINGS += -Wall
-ALL_WARNINGS += -Wextra
-ALL_WARNINGS += -Wold-style-definition
-ALL_WARNINGS += -Wdeclaration-after-statement
-ALL_WARNINGS += -Wmissing-prototypes
-ALL_WARNINGS += -Wstrict-prototypes
-ALL_WARNINGS += -Wmissing-declarations
-ALL_WARNINGS += -Wsign-compare
-ALL_WARNINGS += -Waggregate-return
-ALL_WARNINGS += -Wmissing-noreturn
-ALL_WARNINGS += -Wmissing-format-attribute
-ALL_WARNINGS += -Wno-multichar
-ALL_WARNINGS += -Wno-deprecated-declarations
-ALL_WARNINGS += -Wendif-labels
-ALL_WARNINGS += -Wwrite-strings
-ALL_WARNINGS += -Wbad-function-cast
-ALL_WARNINGS += -Wpointer-arith
-ALL_WARNINGS += -Wcast-qual
-ALL_WARNINGS += -Wshadow
-ALL_WARNINGS += -Wformat-2
-ALL_WARNINGS += -Wsequence-point
-ALL_WARNINGS += -Wpointer-arith
-ALL_WARNINGS += -Wcast-align
+WARNINGS += -Wall
+WARNINGS += -Wextra
+WARNINGS += -Wold-style-definition
+WARNINGS += -Wdeclaration-after-statement
+WARNINGS += -Wmissing-prototypes
+WARNINGS += -Wstrict-prototypes
+WARNINGS += -Wmissing-declarations
+WARNINGS += -Wsign-compare
+WARNINGS += -Waggregate-return
+WARNINGS += -Wmissing-noreturn
+WARNINGS += -Wmissing-format-attribute
+WARNINGS += -Wno-multichar
+WARNINGS += -Wno-deprecated-declarations
+WARNINGS += -Wendif-labels
+WARNINGS += -Wwrite-strings
+WARNINGS += -Wbad-function-cast
+WARNINGS += -Wpointer-arith
+WARNINGS += -Wcast-qual
+WARNINGS += -Wshadow
+WARNINGS += -Wformat
+WARNINGS += -Wsequence-point
+WARNINGS += -Wcast-align
+WARNINGS += -Wformat-security
+WARNINGS += -Wformat-y2k
+WARNINGS += -Werror=format-security
+WARNINGS += -Winit-self
+WARNINGS += -Wswitch-default
+WARNINGS += -Wsync-nand
+WARNINGS += -Wundef
+WARNINGS += -Wlogical-op
+ifneq ($(OS),android)
+WARNINGS += -Wdouble-promotion
+WARNINGS += -Wjump-misses-init
+WARNINGS += -Wtrampolines
+endif
+WARNINGS += -Wunused-parameter
# the following 2 do not work yet and need more work on it
-#ALL_WARNINGS += -Wconversion
-#ALL_WARNINGS += -Wredundant-decls
+#WARNINGS += -Wconversion
+#WARNINGS += -Wredundant-decls
ifeq ($(MUDFLAP),0)
# work around a bug in gcc-4.*
-ALL_WARNINGS += -Wnested-externs
+WARNINGS += -Wnested-externs
endif
# Alas, htons() triggers this so we can't seriously activate it.
-#ALL_WARNINGS += -Wunreachable-code
-ALL_WARNINGS += -Winline
-ALL_WARNINGS += -Wdisabled-optimization
-ALL_WARNINGS += -Werror
-ALL_WARNINGS += -finline-functions-called-once
-ALL_WARNINGS += -funit-at-a-time
-ALL_WARNINGS += -fearly-inlining
+#WARNINGS += -Wunreachable-code
+WARNINGS += -Winline
+WARNINGS += -Wdisabled-optimization
+# WARNINGS += -Werror
+WARNINGS += -finline-functions-called-once
+WARNINGS += -funit-at-a-time
+WARNINGS += -fearly-inlining
ifeq ($(DEBUG),0)
-ALL_WARNINGS += -fomit-frame-pointer
+WARNINGS += -fomit-frame-pointer
endif
-# we have small inline functions in src/ipcalc.h which should always be inlined
-ALL_WARNINGS += -finline-limit=350
+# we have small inline functions in src/lq_route.h which should always be inlined
+WARNINGS += -finline-limit=350
# These tell gcc to put each function and global variable in a separate section.
# The linker can than remove all unreferenced section. But in the olsrd binary
# unused doesn't imply unused at all since the function may be used by plugins,
# e.g. the ones in src/plugin_utils.c.
-# So we can use that feature at most to identify unused functions and remove them
+# So we can use that featuer at most to identify unused functions and remove them
# from the source by hand.
-#ALL_WARNINGS += -ffunction-sections
-#ALL_WARNINGS += -fdata-sections
-ALL_WARNINGS += -Wstrict-overflow=5
-ALL_WARNINGS += $(EXTRA_WARNINGS)
-WARNINGS := $(shell CC="$(CC)" $(TOPDIR)/gcc-warnings $(ALL_WARNINGS) 2> /dev/null)
+#WARNINGS += -ffunction-sections
+#WARNINGS += -fdata-sections
+WARNINGS := $(shell CC="$(CC)" "$(TOPDIR)/gcc-warnings" $(WARNINGS))
endif
CFLAGS += $(WARNINGS)
CFLAGS += $(OPTIMIZE)
CFLAGS += $(EXTRA_CFLAGS)
-ifneq ($(filter -Wstrict-overflow%,$(WARNINGS)),)
-NO_STRICT_OVERFLOW = -Wstrict-overflow=0
-endif
-
# Must be specified along with -lpthread on linux
CPPFLAGS += $(OS_CFLAG_PTHREAD)
endif
ifdef OLSRD_PLUGIN
# c and ld flags for libraries (plugins)
CPPFLAGS += -DOLSR_PLUGIN
+ifeq ($(OS),win32)
+ LDFLAGS += -Wl,-export-all-symbols,--enable-auto-import
+endif
LDFLAGS += -shared
-LDFLAGS += -Wl,-soname,$(PLUGIN_NAME)
+LDFLAGS += -Wl,-soname,$(PLUGIN_SONAME)
LDFLAGS += -Wl,--version-script=version-script.txt
else
# c and ld flags for main
-LDFLAGS += -Wl,-export-dynamic
+ifeq ($(OS),win32)
+ LDFLAGS += -Wl,-export-all-symbols
+else
+ LDFLAGS += -Wl,-export-dynamic
+endif
LDFLAGS += -Wl,-rpath,$(LIBDIR)
endif
# LDFLAGS for all
# extra options from the outside
CPPFLAGS += $(EXTRA_CPPFLAGS)
-LDFLAGS += $(EXTRA_LDFLAGS)
###################################
#
# we have plugins with the old interface
#CPPFLAGS += -DSUPPORT_OLD_PLUGIN_VERSIONS=1
-CPPFLAGS += -DSUPPORT_OLD_PLUGIN_VERSIONS=0
# use the new fixed point math stuff
-#CPPFLAGS += -DUSE_FPM
+CPPFLAGS += -DUSE_FPM
# search sources and headers in current dir and in src/
SRCS += $(wildcard src/common/*.c src/*.c *.c)
HDRS += $(wildcard src/common/*.h src/*.h *.h)
-# OS detection
-ifeq ($(OS),Windows_NT)
-OS := win32
-endif
-ifeq ($(OS),)
-OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
-endif
ifeq ($(OS),UNKNOWN)
all: help
else
ifeq ($(DEBUG),1)
CPPFLAGS += -DDEBUG
CFLAGS += -ggdb
-OPTIMIZE ?= -O0
else
CPPFLAGS += -DNDEBUG
-OPTIMIZE ?= -O2
+ifeq ($(OPTIMIZE),)
+OPTIMIZE += -O2 -D_FORTIFY_SOURCE=2
+endif
endif
ifeq ($(NO_DEBUG_MESSAGES),1)
CPPFLAGS += -DNODEBUG
-OPTIMIZE ?= -Os
+endif
+
+ifeq ($(OS),linux)
+CPPFLAGS+=-DHTTPINFO_PUD -I$(TOPDIR)/lib -I$(TOPDIR)/lib/pud/nmealib/include -I$(TOPDIR)/lib/pud/wireformat/include
endif
# a make function to quote "/" and "."
# fully automatic and working dependency generation
%.d: %.c
- @$(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' >"$@"
+ $(MAKECMDPREFIX)$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(TOPDIR)$(if $(TOPDIR),/)Makefile.inc) /g' >"$@"
-src/common/autobuf.o src/mpr.o: CFLAGS += $(NO_STRICT_OVERFLOW)
+%.o: %.c
+ifeq ($(VERBOSE),0)
+ @echo "[CC] $<"
+endif
+ $(MAKECMDPREFIX)$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
# we always need the includes and defines
# for legacy since now
@echo ' by setting the OS variable! Valid '
@echo ' target OSes are: '
@echo ' --------------------------------- '
- @echo ' linux - GNU/Linux '
- @echo ' win32 - MS Windows '
- @echo ' fbsd - FreeBSD '
- @echo ' nbsd - NetBSD '
- @echo ' obsd - OpenBSD '
- @echo ' osx - Mac OS X '
+ @echo ' linux - GNU/Linux '
+ @echo ' win32 - MS Windows '
+ @echo ' fbsd - FreeBSD '
+ @echo ' nbsd - NetBSD '
+ @echo ' obsd - OpenBSD '
+ @echo ' osx - Mac OS X '
+ @echo ' android - Android '
@echo ' --------------------------------- '
@echo ' Example - build for windows: '
@echo ' make OS=win32 '
@echo '************************************'
@echo
-ifeq ($(filter clean% %clean rpm, $(MAKECMDGOALS)),)
+ifeq ($(filter clean% %clean, $(MAKECMDGOALS)),)
# include dependencies - we don't need any dependency for a everytime generated files
-include $(filter-out src/builddata.%,$(SRCS:%.c=%.d))
endif