Skip to content
Snippets Groups Projects
  • Corey Farrell's avatar
    a10a3aff
    Build System: Improve ccache matching for different menuselect options. · a10a3aff
    Corey Farrell authored
    Changing any Menuselect option in the `Compiler Flags` section causes a
    full rebuild of the Asterisk source tree.  Every enabled option causes
    a #define to be added to buildopts.h, thus breaking ccache caching for
    every source file that includes "asterisk.h".  In most cases each option
    only applies to one or two files.  Now we only define those options for
    the specific sources which use them, this causes much better cache
    matching when working with multiple builds.  For example testing code
    with an without MALLOC_DEBUG will now use just over half the ccache
    size, only main/astmm.o will have two builds cached instead of every
    file.
    
    Reorder main/Makefile so _ASTCFLAGS set on specific object files are all
    together, sorted by filename.  Stop adding -DMALLOC_DEBUG to CFLAGS of
    bundled pjproject, this define is no longer used by any header so only
    serves to break cache.
    
    The only code change is a slight adjustment to how main/astmm.c is
    initialized.  Initialization functions always exist so main/asterisk.c
    can call them unconditionally.  Additionally rename the astmm
    initialization functions so they are not exported.
    
    Change-Id: Ie2085237a964f6e1e6fff55ed046e2afff83c027
    a10a3aff
    History
    Build System: Improve ccache matching for different menuselect options.
    Corey Farrell authored
    Changing any Menuselect option in the `Compiler Flags` section causes a
    full rebuild of the Asterisk source tree.  Every enabled option causes
    a #define to be added to buildopts.h, thus breaking ccache caching for
    every source file that includes "asterisk.h".  In most cases each option
    only applies to one or two files.  Now we only define those options for
    the specific sources which use them, this causes much better cache
    matching when working with multiple builds.  For example testing code
    with an without MALLOC_DEBUG will now use just over half the ccache
    size, only main/astmm.o will have two builds cached instead of every
    file.
    
    Reorder main/Makefile so _ASTCFLAGS set on specific object files are all
    together, sorted by filename.  Stop adding -DMALLOC_DEBUG to CFLAGS of
    bundled pjproject, this define is no longer used by any header so only
    serves to break cache.
    
    The only code change is a slight adjustment to how main/astmm.c is
    initialized.  Initialization functions always exist so main/asterisk.c
    can call them unconditionally.  Additionally rename the astmm
    initialization functions so they are not exported.
    
    Change-Id: Ie2085237a964f6e1e6fff55ed046e2afff83c027
Makefile.rules 6.33 KiB
#
# 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

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