I can't ever recall actually needing the intermediate files or the checking that a double compile produces. What I CAN remember is every DONT_OPTIMIZE build needing 3 invocations of gcc instead of 1 just to do the checks and produce those intermediate files. Having said that, Richard pointed out that the reason for the double compile was that there were cases in the past where a submitted patch failed to compile because the submitter never tried it with the optimizations turned on. To get the best of both worlds, COMPILE_DOUBLE has been split into its own option. If DONT_OPTIMIZE is turned on, COMPILE_DOUBLE will also be selected BUT you can then turn it off if all you need are the debugging symbols. This way you have to make an informed decision about disabling COMPILE_DOUBLE. To allow COMPILE_DOUBLE to be both auto-selected and turned off, a new feature was added to menuselect. The <use> element can now contain an "autoselect" attribute which will turn the used member on but not create a hard dependency. The cflags.xml implementation for COMPILE_DOUBLE looks like this... <member name="DONT_OPTIMIZE" displayname="Disable Optimizations ..."> <use autoselect="yes">COMPILE_DOUBLE</use> <support_level>core</support_level> </member> <member name="COMPILE_DOUBLE" displayname="Pre-compile with ...> <depend>DONT_OPTIMIZE</depend> <support_level>core</support_level> </member> When DONT_OPTIMIZE is turned on, COMPILE_DOUBLE is turned on because of the use. When DONT_OPTIMIZE is turned off, COMPILE_DOUBLE is turned off because of the depend. When COMPILE_DOUBLE is turned on, DONT_OPTIMIZE is turned on because of the depend. When COMPILE_DOUBLE is turned off, DONT_OPTIMIZE is left as is because it only uses COMPILE_DOUBLE, it doesn't depend on it. I also made a few tweaks to the ncurses implementation to move things left a bit to allow longer descriptions. Change-Id: Id49ca930ac4b5ec4fc2d8141979ad888da7b1611
201 lines
6.5 KiB
Makefile
201 lines
6.5 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
|
|
|
|
.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) $(STATIC_BUILD) -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) $(STATIC_BUILD) -o $@ $(CXX_LDFLAGS_SO) $^ $(CXX_LIBS)
|
|
|
|
%.eo: %.o
|
|
$(ECHO_PREFIX) echo " [EMBED] $< -> $@"
|
|
$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_eo_script $* > .$@.ld
|
|
$(CMD_PREFIX) $(LD) -r -T .$@.ld -o $@ $<
|
|
$(CMD_PREFIX) rm -f .$@.ld
|
|
|
|
%.eo: %.oo
|
|
$(ECHO_PREFIX) echo " [EMBED] $< -> $@"
|
|
$(CMD_PREFIX) $(ASTTOPDIR)/build_tools/make_linker_eo_script $* > .$@.ld
|
|
$(CMD_PREFIX) $(LD) -r -T .$@.ld -o $@ $<
|
|
$(CMD_PREFIX) rm -f .$@.ld
|
|
|
|
%: %.o
|
|
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
|
|
$(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $^ $(CXX_LIBS) $(ASTLDFLAGS)
|
|
|
|
dist-clean:: clean
|