# NOTE: these are needed by the configure.in inside the packages folder N2N_VERSION_SHORT=@N2N_VERSION_SHORT@ GIT_COMMITS=@GIT_COMMITS@ GIT_DESCRIBE=$(shell git describe --always --dirty) ######## CC=@CC@ AR=@AR@ #Ultrasparc64 users experiencing SIGBUS should try the following gcc options #(thanks to Robert Gibbon) PLATOPTS_SPARC64=-mcpu=ultrasparc -pipe -fomit-frame-pointer -ffast-math -finline-functions -fweb -frename-registers -mapp-regs N2N_OBJS_OPT= CFLAGS=@CFLAGS@ -I ./include LDFLAGS=@LDFLAGS@ -L . OPENSSL_CFLAGS=$(shell pkg-config openssl; echo $$?) ifeq ($(OPENSSL_CFLAGS), 0) CFLAGS+=$(shell pkg-config --cflags-only-I openssl) endif WARN=-Wall CFLAGS+=$(DEBUG) $(OPTIMIZATION) $(WARN) $(OPTIONS) $(PLATOPTS) INSTALL=install MKDIR=mkdir -p OS := $(shell uname -s) INSTALL_PROG=$(INSTALL) -m755 INSTALL_DOC=$(INSTALL) -m644 # DESTDIR set in debian make system PREFIX?=$(DESTDIR)/usr #BINDIR=$(PREFIX)/bin ifeq ($(OS),Darwin) SBINDIR=$(PREFIX)/local/sbin else SBINDIR=$(PREFIX)/sbin endif MANDIR?=$(PREFIX)/share/man MAN1DIR=$(MANDIR)/man1 MAN7DIR=$(MANDIR)/man7 MAN8DIR=$(MANDIR)/man8 N2N_LIB=libn2n.a N2N_OBJS=$(patsubst src/%.c, src/%.o, $(wildcard src/*.c)) N2N_DEPS=$(wildcard include/*.h) $(wildcard src/*.c) Makefile LDLIBS+=-ln2n LDLIBS+=@N2N_LIBS@ #For OpenSolaris (Solaris too?) ifeq ($(shell uname), SunOS) LDLIBS+=-lsocket -lnsl endif APPS=edge APPS+=supernode APPS+=example_edge_embed_quick_edge_init APPS+=example_edge_embed APPS+=example_sn_embed DOCS=edge.8.gz supernode.1.gz n2n.7.gz .PHONY: steps build push all clean install tools test cover gcov build-dep all: $(APPS) $(DOCS) tools tools: $(N2N_LIB) $(MAKE) -C $@ src/edge.o: $(N2N_DEPS) src/supernode.o: $(N2N_DEPS) src/example_edge_embed_quick_edge_init.o: $(N2N_DEPS) src/example_sn_embed.o: $(N2N_DEPS) src/example_edge_embed.o: $(N2N_DEPS) src/edge: $(N2N_LIB) src/supernode: $(N2N_LIB) src/example_edge_embed_quick_edge_init: $(N2N_LIB) src/example_sn_embed: $(N2N_LIB) src/example_edge_embed: $(N2N_LIB) %: src/% cp $< $@ %.gz : % gzip -c $< > $@ $(N2N_LIB): $(N2N_OBJS) $(AR) rcs $(N2N_LIB) $(N2N_OBJS) # $(RANLIB) $@ test: tools tools/test_harness # To generate coverage information, run configure with # CFLAGS="-fprofile-arcs -ftest-coverage" LDFLAGS="--coverage" # and run the desired tests. Ensure that package gcovr is installed # and then run "make cover" cover: mkdir -p coverage gcovr -s --html --html-details --output=coverage/index.html # Use coverage data to generate gcov text report files. # Unfortunately, these end up in the wrong directory due to the # makefile layout # The steps to use this are similar to the "make cover" above gcov: gcov $(N2N_OBJS) $(MAKE) -C tools gcov # This is the superset of all packages that might be needed. # It is a convinent target to use during development or from a CI/CD system build-dep: ifeq ($(OS),Linux) sudo apt install build-essential autoconf libcap-dev libzstd-dev gcovr else echo Not attempting to handle build dependancies for non dpkg systems endif clean: rm -rf $(N2N_OBJS) $(N2N_LIB) $(APPS) $(DOCS) coverage/ *.dSYM *~ rm -f tests/*.out src/*.gcno src/*.gcda $(MAKE) -C tools clean install: edge supernode edge.8.gz supernode.1.gz n2n.7.gz echo "MANDIR=$(MANDIR)" $(MKDIR) $(SBINDIR) $(MAN1DIR) $(MAN7DIR) $(MAN8DIR) $(INSTALL_PROG) supernode $(SBINDIR)/ $(INSTALL_PROG) edge $(SBINDIR)/ $(INSTALL_DOC) edge.8.gz $(MAN8DIR)/ $(INSTALL_DOC) supernode.1.gz $(MAN1DIR)/ $(INSTALL_DOC) n2n.7.gz $(MAN7DIR)/ $(MAKE) -C tools install # Docker builder section DOCKER_IMAGE_NAME=ntop/supernode DOCKER_IMAGE_VERSION=$N2N_VERSION_SHORT N2N_COMMIT_HASH=@GIT_REVISION@ default: steps steps: if [ "$(TARGET_ARCHITECTURE)" = "arm32v7" ] || [ "$(TARGET_ARCHITECTURE)" = "" ]; then DOCKER_IMAGE_FILENAME="Dockerfile.arm32v7" DOCKER_IMAGE_TAGNAME=$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_VERSION)-arm32v7 make build; fi if [ "$(TARGET_ARCHITECTURE)" = "x86_64" ] || [ "$(TARGET_ARCHITECTURE)" = "" ]; then DOCKER_IMAGE_FILENAME="Dockerfile.x86_64" DOCKER_IMAGE_TAGNAME=$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_VERSION)-x86_64 make build; fi build: $(eval OS := $(shell uname -s)) $(eval ARCHITECTURE := $(shell export DOCKER_IMAGE_TAGNAME="$(DOCKER_IMAGE_TAGNAME)"; echo $$DOCKER_IMAGE_TAGNAME | grep -oe -.*)) docker build --target builder --build-arg COMMIT_HASH=$(N2N_COMMIT_HASH) -t $(DOCKER_IMAGE_TAGNAME) -f image-platforms/$(DOCKER_IMAGE_FILENAME) . docker container create --name builder $(DOCKER_IMAGE_TAGNAME) if [ ! -d "./build" ]; then mkdir ./build; fi docker container cp builder:/usr/src/n2n/supernode ./build/supernode-$(OS)$(ARCHITECTURE) docker container cp builder:/usr/src/n2n/edge ./build/edge-$(OS)$(ARCHITECTURE) docker container rm -f builder docker build --build-arg COMMIT_HASH=$(N2N_COMMIT_HASH) -t $(DOCKER_IMAGE_TAGNAME) -f image-platforms/$(DOCKER_IMAGE_FILENAME) . docker tag $(DOCKER_IMAGE_TAGNAME) $(DOCKER_IMAGE_NAME):latest$(ARCHITECTURE) push: if [ ! "$(TARGET_ARCHITECTURE)" = "" ]; then \ docker push $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_VERSION)-$(TARGET_ARCHITECTURE); \ docker push $(DOCKER_IMAGE_NAME):latest-$(TARGET_ARCHITECTURE); \ else \ echo "Please pass TARGET_ARCHITECTURE, see README.md."; \ fi # End Docker builder section