8b7324ed3f
Make compiler check use the output of the actual compiler being used as reported by the CC variable, instead of unconditionally running the "gcc" binary. Also only run the check if the compiler is gcc or a cross-compile gcc. ASTERISK-28374 Change-Id: Icaacf6d93686ad21076878aa1504a23b4fc9d0f4
207 lines
6.9 KiB
Makefile
207 lines
6.9 KiB
Makefile
#
|
|
# Asterisk -- An open source telephony toolkit.
|
|
#
|
|
# Makefile rules
|
|
#
|
|
# Copyright (C) 2006-2010, Digium, Inc.
|
|
#
|
|
# Kevin P. Fleming <kpfleming@digium.com>
|
|
#
|
|
# This program is free software, distributed under the terms of
|
|
# the GNU General Public License
|
|
#
|
|
|
|
# Each command is preceded by a short comment on what to do.
|
|
# Prefixing one or the other with @\# or @ or nothing makes the desired
|
|
# behaviour. ECHO_PREFIX prefixes the comment, CMD_PREFIX prefixes the command.
|
|
|
|
-include $(ASTTOPDIR)/makeopts
|
|
|
|
# Helpful functions
|
|
# call with $(call function,...)
|
|
tolower = $(shell echo $(1) | tr '[:upper:]' '[:lower:]')
|
|
# Takes a list of MENUSELECT_CFLAG Id and returns CFLAGS to declare
|
|
# the ones which are enabled.
|
|
get_menuselect_cflags=$(patsubst %,-D%,$(filter $1,$(MENUSELECT_CFLAGS)))
|
|
|
|
.PHONY: dist-clean
|
|
|
|
# If 'make' decides to create intermediate files to satisfy a build requirement
|
|
# (like producing a .i from a .c), we want to keep them, so tell make to keep
|
|
# all intermediate files
|
|
.SECONDARY:
|
|
|
|
# extra cflags to build dependencies. Recursively expanded.
|
|
MAKE_DEPS=-MD -MT $@ -MF .$(subst /,_,$@).d -MP
|
|
|
|
ifeq ($(findstring ADDRESS_SANITIZER,$(MENUSELECT_CFLAGS)),ADDRESS_SANITIZER)
|
|
_ASTLDFLAGS+=-fsanitize=address
|
|
_ASTCFLAGS+=-fno-omit-frame-pointer -fsanitize=address
|
|
endif
|
|
|
|
ifeq ($(findstring THREAD_SANITIZER,$(MENUSELECT_CFLAGS)),THREAD_SANITIZER)
|
|
_ASTLDFLAGS+=-fsanitize=thread -pie -fPIE
|
|
_ASTCFLAGS+=-fno-omit-frame-pointer -pie -fPIE -fsanitize=thread
|
|
endif
|
|
|
|
ifeq ($(findstring LEAK_SANITIZER,$(MENUSELECT_CFLAGS)),LEAK_SANITIZER)
|
|
_ASTLDFLAGS+=-fsanitize=leak
|
|
_ASTCFLAGS+=-fno-omit-frame-pointer -fsanitize=leak
|
|
endif
|
|
|
|
ifeq ($(findstring UNDEFINED_SANITIZER,$(MENUSELECT_CFLAGS)),UNDEFINED_SANITIZER)
|
|
_ASTLDFLAGS+=-fsanitize=undefined
|
|
_ASTCFLAGS+=-fno-omit-frame-pointer -fsanitize=undefined
|
|
endif
|
|
|
|
ifeq ($(NOISY_BUILD),)
|
|
ECHO_PREFIX=@
|
|
CMD_PREFIX=@
|
|
else
|
|
ECHO_PREFIX=@\#
|
|
CMD_PREFIX=
|
|
endif
|
|
|
|
OPTIMIZE?=-O3
|
|
ifneq ($(findstring darwin,$(OSARCH)),)
|
|
ifeq ($(shell if test `/usr/bin/sw_vers -productVersion | cut -c4` -gt 5; then echo 6; else echo 0; fi),6)
|
|
# Snow Leopard/Lion has an issue with this optimization flag on large files (like chan_sip)
|
|
OPTIMIZE+=-fno-inline-functions
|
|
endif
|
|
endif
|
|
|
|
# gcc version 8.2.1 and above must have partial-inlining disabled to avoid documented bug.
|
|
# We must handle cross-compiling and clang so make sure the compiler version string has "gcc"
|
|
# somewhere in it before testing the version.
|
|
CC_VERS_STRING=$(shell $(CC) --version | grep -i gcc)
|
|
ifneq ($(CC_VERS_STRING),)
|
|
GCC_VER_GTE821:=$(shell expr `echo '$(CC_VERS_STRING)' | cut -d ' ' -f 3 | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 80201)
|
|
ifeq ($(GCC_VER_GTE821),1)
|
|
OPTIMIZE+=-fno-partial-inlining
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS))$(AST_CODE_COVERAGE),no)
|
|
_ASTCFLAGS+=$(OPTIMIZE)
|
|
else
|
|
_ASTCFLAGS+=-O0
|
|
endif
|
|
|
|
ifeq ($(AST_CODE_COVERAGE),yes)
|
|
_ASTCFLAGS_COVERAGE=-ftest-coverage -fprofile-arcs
|
|
_ASTLDFLAGS+=-ftest-coverage -fprofile-arcs
|
|
else
|
|
_ASTCFLAGS_COVERAGE=
|
|
endif
|
|
|
|
ifeq ($(findstring $(CONFIG_CFLAGS),$(_ASTCFLAGS)),)
|
|
_ASTCFLAGS+=$(CONFIG_CFLAGS)
|
|
endif
|
|
|
|
# shortcuts for common combinations of flags; these must be recursively expanded so that
|
|
# per-target settings will be applied
|
|
CC_CFLAGS=$(PTHREAD_CFLAGS) $(_ASTCFLAGS) $(ASTCFLAGS)
|
|
CXX_CFLAGS=$(PTHREAD_CFLAGS) $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_DECLARATION_AFTER_STATEMENT),$(_ASTCFLAGS) $(ASTCFLAGS))
|
|
|
|
# Clang -Werror warning suppressions
|
|
ifeq ($(C_COMPILER_FAMILY),clang)
|
|
CC_CFLAGS+=-Wno-unused-value -Wno-parentheses-equality
|
|
endif
|
|
|
|
ifeq ($(GNU_LD),1)
|
|
SO_SUPPRESS_SYMBOLS=-Wl,--version-script,$(subst .so,.exports,$@),--warn-common
|
|
ifneq ($(wildcard $(subst .so,.dynamics,$@)),)
|
|
SO_SUPPRESS_SYMBOLS+=-Wl,--dynamic-list,$(subst .so,.dynamics,$@)
|
|
endif
|
|
endif
|
|
|
|
CC_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(SOLINK) $(SO_SUPPRESS_SYMBOLS) $(ASTLDFLAGS)
|
|
CXX_LDFLAGS_SO=$(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(SOLINK) $(SO_SUPPRESS_SYMBOLS) $(ASTLDFLAGS)
|
|
CC_LIBS=$(PTHREAD_LIBS) $(LIBS)
|
|
CXX_LIBS=$(PTHREAD_LIBS) $(LIBS)
|
|
|
|
# determine whether to double-compile so that the optimizer can report code path problems
|
|
# In this case, we run the preprocessor to produce a .i or .ii file from the source
|
|
# code, then compile once with optimizer enabled (and the output to /dev/null),
|
|
# and if that doesn't fail then compile again with optimizer disabled
|
|
|
|
ifeq ($(findstring COMPILE_DOUBLE,$(MENUSELECT_CFLAGS)),COMPILE_DOUBLE)
|
|
COMPILE_DOUBLE=yes
|
|
endif
|
|
|
|
ifeq ($(findstring DONT_OPTIMIZE,$(MENUSELECT_CFLAGS))$(AST_DEVMODE),)
|
|
_ASTCFLAGS+=$(AST_FORTIFY_SOURCE)
|
|
endif
|
|
|
|
ifeq ($(findstring BUILD_NATIVE,$(MENUSELECT_CFLAGS)),BUILD_NATIVE)
|
|
_ASTCFLAGS+=-march=native
|
|
endif
|
|
|
|
%.o: %.s
|
|
$(ECHO_PREFIX) echo " [AS] $< -> $@"
|
|
ifeq ($(COMPILE_DOUBLE),yes)
|
|
$(CMD_PREFIX) $(CC) -o /dev/null -c $< $(CC_CFLAGS) $(OPTIMIZE)
|
|
endif
|
|
$(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
|
|
%.o: %.i
|
|
$(ECHO_PREFIX) echo " [CCi] $< -> $@"
|
|
ifneq ($(AST_CLANG_BLOCKS),)
|
|
ifeq ($(COMPILE_DOUBLE),yes)
|
|
$(CMD_PREFIX) $(CC) -o /dev/null -c $< $(CC_CFLAGS) $(OPTIMIZE) -Wno-unused-command-line-argument
|
|
endif
|
|
$(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS) $(_ASTCFLAGS_COVERAGE) -Wno-unused-command-line-argument
|
|
else
|
|
ifeq ($(COMPILE_DOUBLE),yes)
|
|
$(CMD_PREFIX) $(CC) -o /dev/null -c $< $(CC_CFLAGS) $(OPTIMIZE)
|
|
endif
|
|
$(CMD_PREFIX) $(CC) -o $@ -c $< $(CC_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
endif
|
|
|
|
ifneq ($(COMPILE_DOUBLE),yes)
|
|
%.o: %.c
|
|
$(ECHO_PREFIX) echo " [CC] $< -> $@"
|
|
$(CMD_PREFIX) $(CC) -o $@ -c $< $(MAKE_DEPS) $(CC_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
endif
|
|
|
|
%.i: %.c
|
|
$(ECHO_PREFIX) echo " [CPP] $< -> $@"
|
|
$(CMD_PREFIX) $(CC) -o $@ -E $< $(MAKE_DEPS) $(CC_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
|
|
%.oo: %.ii
|
|
$(ECHO_PREFIX) echo " [CXXi] $< -> $@"
|
|
ifeq ($(COMPILE_DOUBLE),yes)
|
|
$(CMD_PREFIX) $(CXX) -o /dev/null -c $< $(CXX_CFLAGS) $(OPTIMIZE)
|
|
endif
|
|
$(CMD_PREFIX) $(CXX) -o $@ -c $< $(CXX_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
|
|
ifneq ($(COMPILE_DOUBLE),yes)
|
|
%.oo: %.cc
|
|
$(ECHO_PREFIX) echo " [CXX] $< -> $@"
|
|
$(CMD_PREFIX) $(CXX) -o $@ -c $< $(MAKE_DEPS) $(CXX_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
endif
|
|
|
|
%.ii: %.cc
|
|
$(ECHO_PREFIX) echo " [CPP] $< -> $@"
|
|
$(CMD_PREFIX) $(CXX) -o $@ -E $< $(MAKE_DEPS) $(CXX_CFLAGS) $(_ASTCFLAGS_COVERAGE)
|
|
|
|
%.so: %.o
|
|
ifeq ($(GNU_LD),1)
|
|
$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_version_script $* "$(LINKER_SYMBOL_PREFIX)" "$(ASTTOPDIR)"
|
|
endif
|
|
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
|
|
$(CMD_PREFIX) $(CC) -o $@ $(CC_LDFLAGS_SO) $^ $(CC_LIBS)
|
|
|
|
%.so: %.oo
|
|
ifeq ($(GNU_LD),1)
|
|
$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_version_script $* "$(LINKER_SYMBOL_PREFIX)" "$(ASTTOPDIR)"
|
|
endif
|
|
$(ECHO_PREFIX) echo " [LDXX] $^ -> $@"
|
|
$(CMD_PREFIX) $(CXX) -o $@ $(CXX_LDFLAGS_SO) $^ $(CXX_LIBS)
|
|
|
|
%: %.o
|
|
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
|
|
$(CMD_PREFIX) $(CXX) -o $@ $(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $^ $(CXX_LIBS) $(ASTLDFLAGS)
|
|
|
|
dist-clean:: clean
|