mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 12:18:42 +00:00
01bfa5ebf3
This is the first part of rewriting Flock to C to significantly reduce memory footprint of individual machines from 20+M in Python to (goal) less than 1M. Now the process eats ~460k and I suspect that this won't even be the consumption per machine in total as fork() is involved and some parts of the memory will be heavily shared.
258 lines
7.1 KiB
Makefile
258 lines
7.1 KiB
Makefile
# Makefile for the BIRD Internet Routing Daemon
|
|
# (c) 1999--2000 Martin Mares <mj@ucw.cz>
|
|
# (c) 2016 Jan Moskyto Matejka <mq@ucw.cz>
|
|
|
|
# Disable build-in rules
|
|
MAKEFLAGS += -r
|
|
|
|
# Variable definitions
|
|
CPPFLAGS=-I$(objdir) -I$(srcdir) @CPPFLAGS@
|
|
CFLAGS=$(CPPFLAGS) @CFLAGS@
|
|
LDFLAGS=@LDFLAGS@
|
|
M4FLAGS=@M4FLAGS@
|
|
BISONFLAGS=@BISONFLAGS@
|
|
LIBS=@LIBS@
|
|
COMMON_LIBS=@COMMON_LIBS@
|
|
DAEMON_LIBS=@DAEMON_LIBS@ $(COMMON_LIBS)
|
|
CLIENT_LIBS=@CLIENT_LIBS@
|
|
CC=@CC@
|
|
M4=@M4@
|
|
BISON=@BISON@
|
|
FLEX=@FLEX@
|
|
RANLIB=@RANLIB@
|
|
INSTALL=@INSTALL@
|
|
INSTALL_PROGRAM=@INSTALL_PROGRAM@
|
|
INSTALL_DATA=@INSTALL_DATA@
|
|
|
|
client=$(addprefix $(exedir)/,@CLIENT@)
|
|
daemon=$(exedir)/bird
|
|
common-lib=$(objdir)/libbird.o.txt
|
|
protocols=@protocols@
|
|
PROTO_BUILD := $(protocols) dev kif krt
|
|
|
|
prefix=@prefix@
|
|
exec_prefix=@exec_prefix@
|
|
bindir=@bindir@
|
|
sbindir=@sbindir@
|
|
sysconfdir=@sysconfdir@
|
|
localstatedir=@localstatedir@
|
|
runstatedir=@runstatedir@
|
|
docdir=@prefix@/doc
|
|
|
|
srcdir := @srcdir@
|
|
objdir := @objdir@
|
|
exedir := @exedir@
|
|
|
|
git-label:=$(strip $(shell cd $(srcdir) && [ "$$(git rev-parse --show-toplevel)" = "$$(readlink -f .)" ] && git describe --always --dirty=-x 2>/dev/null))
|
|
ifneq ($(git-label),)
|
|
CFLAGS += -DGIT_LABEL="$(git-label)"
|
|
endif
|
|
|
|
ifeq ($(objdir),.)
|
|
objdir := $(realpath .)
|
|
endif
|
|
|
|
ifeq ($(VERBOSE),)
|
|
E:=@
|
|
Q:=@
|
|
else
|
|
E:=@\#
|
|
Q:=
|
|
endif
|
|
|
|
ifneq ($(COLOR),)
|
|
CFLAGS += -fdiagnostics-color=always
|
|
endif
|
|
|
|
# Meta rules
|
|
docgoals := docs userdocs progdocs
|
|
testgoals := check test tests tests_run
|
|
cleangoals := clean distclean testsclean
|
|
.PHONY: all daemon cli $(docgoals) $(testgoals) $(cleangoals) tags cscope prepare
|
|
|
|
all: daemon cli
|
|
|
|
daemon: $(daemon)
|
|
cli: $(client)
|
|
|
|
$(daemon): LIBS += $(DAEMON_LIBS)
|
|
|
|
# Include directories
|
|
dirs := client conf doc filter flock lib nest test $(addprefix proto/,$(protocols)) @sysdep_dirs@
|
|
|
|
# conf/Makefile declarations needed for all other modules
|
|
conf-lex-targets := $(addprefix $(objdir)/conf/,cf-lex.o)
|
|
conf-y-targets := $(addprefix $(objdir)/conf/,cf-parse.y keywords.h commands.h)
|
|
cf-local = $(conf-y-targets): $(s)config.Y
|
|
|
|
src-o-files = $(patsubst %.c,$(o)%.o,$(src))
|
|
tests-target-files = $(patsubst %.c,$(o)%,$(tests_src))
|
|
|
|
all-daemon = $(daemon): $(obj)
|
|
all-client = $(client): $(obj)
|
|
all-lib = $(common-lib): $(obj)
|
|
|
|
s = $(dir $(lastword $(MAKEFILE_LIST)))
|
|
ifeq ($(srcdir),.)
|
|
o = $(objdir)/$(s)
|
|
else
|
|
o = $(patsubst $(srcdir)%,$(objdir)%,$(s))
|
|
endif
|
|
|
|
define clean_in =
|
|
clean::
|
|
rm -f $(addprefix $(o),$(1))
|
|
endef
|
|
|
|
clean = $(eval $(call clean_in,$(1)))
|
|
|
|
# Include main Makefiles of the directories
|
|
include $(addsuffix /Makefile,$(addprefix $(srcdir)/,$(dirs)))
|
|
|
|
# Generic rules
|
|
# Object file rules
|
|
$(objdir)/%.o: $(srcdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -c $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -c $<
|
|
|
|
$(objdir)/%.o: $(objdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -c $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -c $<
|
|
|
|
# Debug: Preprocessed source rules
|
|
$(objdir)/%.E: $(srcdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -E $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -E $<
|
|
|
|
$(objdir)/%.E: $(objdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -E $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -E $<
|
|
|
|
# Debug: Assembler object rules
|
|
$(objdir)/%.S: $(srcdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -S $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -S $<
|
|
|
|
$(objdir)/%.S: $(objdir)/%.c | prepare
|
|
$(E)echo CC -o $@ -S $<
|
|
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -S $<
|
|
|
|
# Finally include the computed dependencies:
|
|
DEPS = $(shell find $(objdir) -name '*.d')
|
|
|
|
# ## if there is at least one non-clean goal
|
|
ifneq ($(filter-out $(cleangoals),$(MAKECMDGOALS)),)
|
|
-include $(DEPS)
|
|
endif
|
|
|
|
# ## if the implicit goal is called
|
|
ifeq ($(MAKECMDGOALS),)
|
|
-include $(DEPS)
|
|
endif
|
|
|
|
# Rule for pre-generating all generated includables
|
|
# before compiling any C file
|
|
prepare: $(objdir)/sysdep/paths.h | $(objdir)/.dir-stamp
|
|
|
|
$(objdir)/.dir-stamp: Makefile
|
|
$(E)echo MKDIR -p $(addprefix $(objdir)/,$(dirs) doc)
|
|
$(Q)mkdir -p $(addprefix $(objdir)/,$(dirs) doc)
|
|
$(Q)touch $@
|
|
|
|
# Composing static library; older GCC's and linkers somehow fail
|
|
# both with partial linking with LTO and also with static library creation,
|
|
# thus we just collect all the deps and add them to the final build
|
|
$(common-lib):
|
|
$(E)echo TXT $^ > $@
|
|
$(Q)echo $^ > $@
|
|
# Some time in future, somebody may want to try the following recipe again
|
|
# $(E)echo LD $(LDFLAGS) -r -o $@ $^
|
|
# +$(Q)$(CC) $(LDFLAGS) -r -o $@ $^
|
|
|
|
# The lib must be linked last
|
|
$(daemon): $(common-lib)
|
|
|
|
#$(warning $(patsubst $(common-lib),$(shell cat $(common-lib)),whatever obj/libbird.o.txt))
|
|
|
|
$(client) $(daemon):
|
|
$(E)echo LD $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
+$(Q)$(CC) $(LDFLAGS) -o $@ $(patsubst $(common-lib),$(shell cat $(common-lib)),$^) $(LIBS)
|
|
|
|
$(objdir)/sysdep/paths.h: Makefile
|
|
$(E)echo GEN $@
|
|
$(Q)echo >$@ "/* Generated by Makefile, don't edit manually! */"
|
|
$(Q)echo >>$@ "#define PATH_CONFIG_FILE \"@CONFIG_FILE@\""
|
|
$(Q)echo >>$@ "#define PATH_CONTROL_SOCKET \"@CONTROL_SOCKET@\""
|
|
$(Q)if test -n "@iproutedir@" ; then echo >>$@ "#define PATH_IPROUTE_DIR \"@iproutedir@\"" ; fi
|
|
|
|
# Unit tests rules
|
|
|
|
tests_targets_ok = $(addsuffix .ok,$(tests_targets))
|
|
|
|
$(tests_targets): %: %.o $(tests_objs) $(common-lib) | prepare
|
|
$(E)echo LD $(LDFLAGS) -o $@ $< "..." $(LIBS)
|
|
+$(Q)$(CC) $(LDFLAGS) -o $@ $(patsubst $(common-lib),$(shell cat $(common-lib)),$^) $(LIBS)
|
|
|
|
# Hack to avoid problems with tests linking everything
|
|
$(tests_targets): LIBS += $(DAEMON_LIBS)
|
|
|
|
$(tests_targets_ok): %.ok: %
|
|
$(Q)$* 2>/dev/null && touch $*.ok
|
|
|
|
test: testsclean check
|
|
check: tests tests_run
|
|
tests: $(tests_targets)
|
|
tests_run: $(tests_targets_ok)
|
|
|
|
STATIC_CHECKERS_ENABLE := nullability.NullableDereferenced nullability.NullablePassedToNonnull nullability.NullableReturnedFromNonnull optin.portability.UnixAPI valist.CopyToSelf valist.Uninitialized valist.Unterminated
|
|
STATIC_CHECKERS_DISABLE := deadcode.DeadStores
|
|
STATIC_SCAN_FLAGS := -o $(objdir)/static-scan/ $(addprefix -enable-checker ,$(STATIC_CHECKERS_ENABLE)) $(addprefix -disable-checker ,$(STATIC_CHECKERS_DISABLE))
|
|
|
|
static-scan:
|
|
$(E)echo Running static code analysis
|
|
$(Q)$(MAKE) clean
|
|
$(Q)scan-build $(STATIC_SCAN_FLAGS) $(MAKE) -$(MAKEFLAGS)
|
|
|
|
tags:
|
|
cd $(srcdir) ; etags -lc `find $(dirs) -name '*.[chY]'`
|
|
|
|
cscope:
|
|
cd $(srcdir) ; find $(dirs) -name '*.[chY]' > cscope.files ; cscope -b
|
|
|
|
# Install
|
|
|
|
install: all
|
|
$(INSTALL) -d $(DESTDIR)/$(sbindir) $(DESTDIR)/$(sysconfdir) $(DESTDIR)/$(runstatedir)
|
|
for BIN in bird @CLIENT@ ; do \
|
|
$(INSTALL_PROGRAM) $(exedir)/$$BIN $(DESTDIR)/$(sbindir)/$$BIN ; \
|
|
done
|
|
if ! test -f $(DESTDIR)/@CONFIG_FILE@ ; then \
|
|
$(INSTALL_DATA) $(srcdir)/doc/bird.conf.example $(DESTDIR)/@CONFIG_FILE@ ; \
|
|
else \
|
|
echo "Not overwriting old bird.conf" ; \
|
|
fi
|
|
|
|
install-docs:
|
|
$(INSTALL) -d $(DESTDIR)/$(docdir)
|
|
$(INSTALL_DATA) $(objdir)/doc/{bird,prog}{,-*}.html $(DESTDIR)/$(docdir)/
|
|
|
|
# Cleanup
|
|
clean::
|
|
rm -f $(objdir)/sysdep/paths.h $(objdir)/nest/proto-build.c
|
|
rm -f $(addprefix $(exedir)/,bird birdc birdcl)
|
|
rm -f $(common-lib)
|
|
find $(objdir) -name "*.[od]" -exec rm -f '{}' '+'
|
|
|
|
testsclean:
|
|
rm -f $(tests_targets_ok)
|
|
|
|
ifeq ($(objdir),obj)
|
|
distclean: clean
|
|
rm -rf $(objdir)
|
|
rm -f config.log config.status configure Makefile
|
|
else
|
|
distclean: clean
|
|
rm -rf * .dir-stamp
|
|
rm -f config.log config.status configure Makefile
|
|
endif
|