diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a211137 --- /dev/null +++ b/Makefile @@ -0,0 +1,307 @@ +# netsniff-ng build system +# Copyright 2012 - 2013 Daniel Borkmann <borkmann@gnumaniacs.org> +# Subject to the GNU GPL, version 2. + +VERSION = 0 +PATCHLEVEL = 5 +SUBLEVEL = 8 +EXTRAVERSION = -rc0 +NAME = Ziggomatic + +TOOLS = netsniff-ng trafgen astraceroute flowtop ifpps bpfc curvetun + +# For packaging purposes, prefix can define a different path. +PREFIX ?= + +# Debugging option +ifeq ("$(origin DEBUG)", "command line") + DEBUG := 1 +else + DEBUG := 0 +endif + +# Disable if you don't want it +CCACHE = ccache + +# Location of installation paths. +BINDIR = $(PREFIX)/usr/bin +SBINDIR = $(PREFIX)/usr/sbin +INCDIR = $(PREFIX)/usr/include +ETCDIR = $(PREFIX)/etc +ETCDIRE = $(ETCDIR)/netsniff-ng +DOCDIR = $(PREFIX)/usr/share/doc +DOCDIRE = $(DOCDIR)/netsniff-ng + +# Shut up make, helper warnings, parallel compilation! +MAKEFLAGS += --no-print-directory +MAKEFLAGS += -rR +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --jobs=$(shell grep "^processor" /proc/cpuinfo | wc -l) + +# For packaging purposes, you might want to disable O3+arch tuning +CFLAGS = -fstack-protector +ifeq ($(DEBUG), 1) + CFLAGS += -g + CFLAGS += -O2 +else + CFLAGS += -march=native + CFLAGS += -mtune=native + CFLAGS += -O3 + CFLAGS += -fpie + CFLAGS += -pipe + CFLAGS += -fomit-frame-pointer +endif +CFLAGS += --param=ssp-buffer-size=4 +CFLAGS += -fno-strict-aliasing +CFLAGS += -fexceptions +CFLAGS += -fasynchronous-unwind-tables +CFLAGS += -fno-delete-null-pointer-checks +CFLAGS += -D_FORTIFY_SOURCE=2 +CFLAGS += -D_REENTRANT +CFLAGS += -D_FILE_OFFSET_BITS=64 +CFLAGS += -D_LARGEFILE_SOURCE +CFLAGS += -D_LARGEFILE64_SOURCE +ifneq ($(wildcard /usr/include/linux/net_tstamp.h),) + CFLAGS += -D__WITH_HARDWARE_TIMESTAMPING +endif +CFLAGS += -DVERSION_STRING=\"$(VERSION_STRING)\" +CFLAGS += -std=gnu99 + +WFLAGS = -Wall +WFLAGS += -Wformat=2 +WFLAGS += -Wmissing-prototypes +WFLAGS += -Wdeclaration-after-statement +WFLAGS += -Werror-implicit-function-declaration +WFLAGS += -Wstrict-prototypes +WFLAGS += -Wundef +WFLAGS += -Wimplicit-int + +WFLAGS_EXTRA = -Wno-unused-result +WFLAGS_EXTRA += -Wmissing-parameter-type +WFLAGS_EXTRA += -Wtype-limits +WFLAGS_EXTRA += -Wclobbered +WFLAGS_EXTRA += -Wmissing-field-initializers +WFLAGS_EXTRA += -Woverride-init +WFLAGS_EXTRA += -Wold-style-declaration +WFLAGS_EXTRA += -Wignored-qualifiers +WFLAGS_EXTRA += -Wempty-body +WFLAGS_EXTRA += -Wuninitialized + +CFLAGS += $(WFLAGS) -I. +CPPFLAGS = +ifeq ("$(origin CROSS_LD_LIBRARY_PATH)", "command line") + LDFLAGS = -L$(CROSS_LD_LIBRARY_PATH) +else + LDFLAGS = +endif + +ALL_CFLAGS = $(CFLAGS) +ALL_LDFLAGS = $(LDFLAGS) +TARGET_ARCH = +LEX_FLAGS = +YAAC_FLAGS = + +Q = @ + +LD = $(Q)echo -e " LD\t$@" && $(CCACHE) $(CROSS_COMPILE)gcc +CCNQ = $(CCACHE) $(CROSS_COMPILE)gcc +CC = $(Q)echo -e " CC\t$<" && $(CCNQ) +MKDIR = $(Q)echo -e " MKDIR\t$@" && mkdir +ifeq ($(DEBUG), 1) + STRIP = $(Q)true +else + STRIP = $(Q)echo -e " STRIP\t$@" && $(CROSS_COMPILE)strip +endif +LEX = $(Q)echo -e " LEX\t$<" && flex +YAAC = $(Q)echo -e " YAAC\t$<" && bison +INST = echo -e " INST\t$(1)" && install -d $(2) && \ + install --mode=644 -DC $(1) $(2)/$(shell basename $(1)) +ifeq ("$(origin PREFIX)", "command line") + INSTX = echo -e " INST\t$(1)" && install -d $(2) && \ + install -C $(1) $(2)/$(shell basename $(1)) +else + INSTX = echo -e " INST\t$(1)" && install -C $(1) $(2)/$(shell basename $(1)) +endif +RM = echo -e " RM\t$(1)" && rm -rf $(1) +RMDIR = echo -e " RM\t$(1)" && rmdir --ignore-fail-on-non-empty $(1) 2> /dev/null || true +GIT_ARCHIVE = git archive --prefix=netsniff-ng-$(VERSION_STRING)/ $(VERSION_STRING) | \ + $(1) > ../netsniff-ng-$(VERSION_STRING).tar.$(2) +GIT_TAG = git tag -a $(VERSION_STRING) -m "$(VERSION_STRING) release" + +export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION +export CROSS_COMPILE + +VERSION_STRING = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) +VERSION_SHORT = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) + +bold = $(shell tput bold) +normal = $(shell tput sgr0) + +ifndef NACL_LIB_DIR +ifndef NACL_INC_DIR + $(info $(bold)NACL_LIB_DIR/NACL_INC_DIR is undefined, build libnacl first for curvetun!$(normal)) +endif +endif + +ifeq ("$(origin CROSS_COMPILE)", "command line") + WHAT := Cross compiling +else + WHAT := Building +endif + +build_showinfo: + $(Q)echo "$(bold)$(WHAT) netsniff-ng toolkit ($(VERSION_STRING)) for" \ + $(shell $(CCNQ) -dumpmachine)":$(normal)" +clean_showinfo: + $(Q)echo "$(bold)Cleaning netsniff-ng toolkit ($(VERSION_STRING)):$(normal)" + +%.yy.o: %.l + $(LEX) -P $(shell perl -wlne 'print $$1 if /lex-func-prefix:\s([a-z]+)/' $<) \ + -o $(BUILD_DIR)/$(shell basename $< .l).yy.c $(LEX_FLAGS) $< +%.tab.o: %.y + $(YAAC) -p $(shell perl -wlne 'print $$1 if /yaac-func-prefix:\s([a-z]+)/' $<) \ + -o $(BUILD_DIR)/$(shell basename $< .y).tab.c $(YAAC_FLAGS) -d $< + +.PHONY: all toolkit $(TOOLS) clean %_prehook %_distclean %_clean %_install tag tags cscope +.FORCE: +.DEFAULT_GOAL := all +.DEFAULT: +.IGNORE: %_clean_custom %_install_custom +.NOTPARALLEL: $(TOOLS) + +DOC_FILES = Summary RelatedWork Performance KnownIssues Sponsors SubmittingPatches CodingStyle + +NCONF_FILES = ether.conf tcp.conf udp.conf oui.conf geoip.conf + +all: build_showinfo toolkit +allbutcurvetun: $(filter-out curvetun,$(TOOLS)) +allbutmausezahn: $(filter-out mausezahn,$(TOOLS)) +toolkit: $(TOOLS) +install: install_all +install_all: $(foreach tool,$(TOOLS),$(tool)_install) + $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));) +install_allbutcurvetun: $(foreach tool,$(filter-out curvetun,$(TOOLS)),$(tool)_install) + $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));) +install_allbutmausezahn: $(foreach tool,$(filter-out mausezahn,$(TOOLS)),$(tool)_install) + $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));) +clean mostlyclean: $(foreach tool,$(TOOLS),$(tool)_clean) +realclean distclean clobber: $(foreach tool,$(TOOLS),$(tool)_distclean) + $(Q)$(foreach file,$(DOC_FILES),$(call RM,$(DOCDIRE)/$(file));) + $(Q)$(call RMDIR,$(DOCDIRE)) + $(Q)$(call RMDIR,$(ETCDIRE)) +mrproper: clean distclean + +define TOOL_templ + include $(1)/Makefile + $(1) $(1)%: BUILD_DIR := $(1) + $(1)_prehook: + $(Q)echo "$(bold)$(WHAT) $(1):$(normal)" + $(1): $(1)_prehook $$($(1)-lex) $$($(1)-yaac) $$(patsubst %.o,$(1)/%.o,$$($(1)-objs)) + $(1)_clean: $(1)_clean_custom + $(Q)$$(call RM,$(1)/*.o $(1)/$(1)) + $(1)_install: $(1)_install_custom + $(Q)$$(call INSTX,$(1)/$(1),$$(SBINDIR)) + $(1)_distclean: $(1)_distclean_custom + $(Q)$$(call RM,$$(SBINDIR)/$(1)) + $(1)/%.yy.o: $(1)/%.yy.c + $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$< + $(1)/%.tab.o: $(1)/%.tab.c + $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$< + $(1)/%.o: %.c + $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$< +endef + +$(foreach tool,$(TOOLS),$(eval $(call TOOL_templ,$(tool)))) + +%:: ; + +netsniff-ng: ALL_CFLAGS += -I$(INCDIR)/libnl3/ -D__WITH_PROTOS -D__WITH_TCPDUMP_LIKE_FILTER +trafgen: ALL_CFLAGS += -I.. -I$(INCDIR)/libnl3/ -D__WITH_PROTOS +bpfc: ALL_CFLAGS += -I.. +curvetun: ALL_CFLAGS += -I ${NACL_INC_DIR} +curvetun: ALL_LDFLAGS += -L ${NACL_LIB_DIR} + +bpfc_clean_custom: + $(Q)$(call RM,$(BUILD_DIR)/*.h $(BUILD_DIR)/*.c) +trafgen_clean_custom: + $(Q)$(call RM,$(BUILD_DIR)/*.h $(BUILD_DIR)/*.c) + +netsniff-ng_distclean_custom flowtop_distclean_custom: + $(Q)$(foreach file,$(NCONF_FILES),$(call RM,$(ETCDIRE)/$(file));) + $(Q)$(call RMDIR,$(ETCDIRE)) +trafgen_distclean_custom: + $(Q)$(call RM,$(ETCDIRE)/stddef.h) + $(Q)$(call RMDIR,$(ETCDIRE)) +astraceroute_distclean_custom: + $(Q)$(call RM,$(ETCDIRE)/geoip.conf) + $(Q)$(call RMDIR,$(ETCDIRE)) + +netsniff-ng_install_custom flowtop_install_custom: + $(Q)$(foreach file,$(NCONF_FILES),$(call INST,configs/$(file),$(ETCDIRE));) +trafgen_install_custom: + $(Q)$(call INST,configs/stddef.h,$(ETCDIRE)) +astraceroute_install_custom: + $(Q)$(call INST,configs/geoip.conf,$(ETCDIRE)) + +$(TOOLS): WFLAGS += $(WFLAGS_EXTRA) +$(TOOLS): + $(LD) $(ALL_LDFLAGS) -o $@/$@ $@/*.o $($@-libs) + $(STRIP) $@/$@ + +nacl: + $(Q)echo "$(bold)$(WHAT) $@:$(normal)" + $(Q)cd curvetun/ && ./build_nacl.sh ~/nacl + $(Q)source ~/.bashrc + +tarball.gz: ; $(call GIT_ARCHIVE,gzip,gz) +tarball.bz2: ; $(call GIT_ARCHIVE,bzip2,bz2) +tarball.xz: ; $(call GIT_ARCHIVE,xz,xz) +tarball: tarball.gz tarball.bz2 tarball.xz + +tag: + $(GIT_TAG) + +FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \ + find . \( -name .git -type d -prune \) \ + -o \( -name '*.[hcS]' -type f -print \) ) + +tags ctags: + $(Q)$(call RM,tags) + $(FIND_SOURCE_FILES) | xargs ctags -a + +cscope: + $(Q)$(call RM,cscope*) + $(FIND_SOURCE_FILES) | xargs cscope -b + +help: + $(Q)echo "$(bold)Available tools from the toolkit:$(normal)" + $(Q)echo " <toolnames>:={$(TOOLS)}" + $(Q)echo "$(bold)Targets for building the toolkit:$(normal)" + $(Q)echo " all|toolkit - Build the whole toolkit" + $(Q)echo " allbutcurvetun - Build all except curvetun" + $(Q)echo " <toolname> - Build only one of the tools" + $(Q)echo "$(bold)Targets for cleaning the toolkit's build files:$(normal)" + $(Q)echo " clean|mostlyclean - Remove all build files" + $(Q)echo " <toolname>_clean - Remove only one of the tool's files" + $(Q)echo "$(bold)Targets for installing the toolkit:$(normal)" + $(Q)echo " install - Install the whole toolkit" + $(Q)echo " <toolname>_install - Install only one of the tools" + $(Q)echo "$(bold)Targets for removing the toolkit:$(normal)" + $(Q)echo " realclean|distclean|clobber - Remove the whole toolkit from the system" + $(Q)echo " <toolname>_distclean - Remove only one of the tools" + $(Q)echo " mrproper - Remove build and install files" + $(Q)echo "$(bold)Hacking/development targets:$(normal)" + $(Q)echo " tag - Generate Git tag of current version" + $(Q)echo " tarball - Generate tarball of latest version" + $(Q)echo " tags - Generate sparse ctags" + $(Q)echo " cscope - Generate cscope files" + $(Q)echo "$(bold)Misc targets:$(normal)" + $(Q)echo " nacl - Execute the build_nacl script" + $(Q)echo " help - Show this help" + $(Q)echo "$(bold)Available parameters:$(normal)" + $(Q)echo " DEBUG=1 - Enable debugging" + $(Q)echo " PREFIX=/path - Install path prefix" + $(Q)echo " CROSS_COMPILE=/path-prefix - Kernel-like cross-compiling prefix" + $(Q)echo " CROSS_LD_LIBRARY_PATH=/path - Library search path for cross-compiling" + $(Q)echo " CC=cgcc - Use sparse compiler wrapper" + $(Q)echo " Q= - Show verbose garbage" |