mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			239 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			6.3 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@
 | 
						|
DAEMON_LIBS=@DAEMON_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
 | 
						|
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 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)
 | 
						|
 | 
						|
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 $@
 | 
						|
 | 
						|
$(client) $(daemon):
 | 
						|
	$(E)echo LD $(LDFLAGS) -o $@ $^ $(LIBS)
 | 
						|
	$(Q)$(CC) $(LDFLAGS) -o $@ $^ $(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) | prepare
 | 
						|
	$(E)echo LD $(LDFLAGS) -o $@ $< "..." $(LIBS)
 | 
						|
	$(Q)$(CC) $(LDFLAGS) -o $@ $^ $(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)
 | 
						|
	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
 |