Rev 5726 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
################################################################################ File: TOOLSET/gcc.rul[e]# Contents: GCC rules################################################################################################################################################################.. Remove "undef" warnings#cc_includes +=cc_defines +=cxx_includes +=cxx_defines +=as_includes +=as_defines +=################################################################################.. Toolset defaults# mkdepend is a lot faster that gcc#USE_GCCDEPEND = 0################################################################################.. Parse user options# Global options already parsed# These options extend the global options#ifdef OPTIONSifneq "$(findstring purify,$(OPTIONS))" "" # Enable purifyCC_PRE += purifyelseifneq "$(findstring purecov,$(OPTIONS))" "" # Enable pure coverageCC_PRE += purecovendifendififneq "$(findstring metrics,$(OPTIONS))" "" # Build source metrixsUSE_METRICS = 1endififneq "$(findstring checker,$(OPTIONS))" ""USE_CHECKER = 1endififneq "$(findstring profile,$(OPTIONS))" ""USE_PROFILE = 1endififneq "$(findstring ccdepend,$(OPTIONS))" "" # Build depends using gccUSE_GCCDEPEND = 1endififneq "$(findstring gccdepend,$(OPTIONS))" ""USE_GCCDEPEND = 1endififneq "$(findstring mkdepend,$(OPTIONS))" ""USE_GCCDEPEND = 0endififneq "$(findstring wall,$(OPTIONS))" "" # Enable all warningsUSE_WALL = 1endifendif #OPTIONS################################################################################.. C and C++ Compiler warning filter#cc_filter_name := warnings.gcccc_filter := "$(notdir $(wildcard $(GBE_ROOT)/$(cc_filter_name)))"ifeq ($(strip $(cc_filter)),"$(cc_filter_name)")cc_filter := $(GBE_ROOT)/$(cc_filter_name)elsecc_filter :=endififdef cc_filtercc_redirect_stderr = 1cc_error_filter = $(awk) -f $(cc_filter)endif################################################################################.. C Compiler definition## Standard defines##..ifdef GCC_DEFINESgcc_defines += $(GCC_DEFINES)endifgcc_defines += -D_REENTRANTifeq "$(DEBUG)" "1"gcc_defines += -DDEBUGelsegcc_defines +=endififdef ALVLgcc_defines += -DALVL=$(ALVL)endififdef DLVLgcc_defines += -DDLVL=$(DLVL)endifgcc_defines += -D__SOURCE__=\"$(notdir $<)\"# Standard flags## -Wall implies:# -Wimplicit, -Wreturn-type, -Wunused, -Wswitch# -Wformat, -Wchar-subscripts, -Wparentheses# -Wmissing-braces#..gcc_flags += -cgcc_flags += -Wallifdef USE_WALL#gcc_flags += -Wuninitialized # only makes sense with `-O'gcc_flags += -Wwrite-stringsgcc_flags += -Wcast-qualgcc_flags += -Wbad-function-castgcc_flags += -Wpointer-arithgcc_flags += -Wstrict-prototypesgcc_flags += -Wmissing-prototypesgcc_flags += -Wmissing-declarationsgcc_flags += -Wnested-externsgcc_flags += -Wtraditionalgcc_flags += -Wconversiongcc_flags += -Wcommentgcc_flags += -Wcast-align#gcc_flags += -Winlinegcc_flags += -Wshadowgcc_flags += -Wredundant-decls#gcc_flags += -Wid-clash-31endififdef GCC_CFLAGSgcc_flags += $(GCC_CFLAGS)endififdef FORCE_C_COMPILEendififdef FORCE_CC_COMPILEendififdef USE_OPTIMISE # default for productionelseendififdef USE_DEBUGINFO # default for debuggcc_flags += -g3 -ggdbelsegcc_flags += -g3 -ggdbendififeq "$(DEBUG)" "1" # debug/prod specificifdef GCC_CFLAGSDgcc_flags += $(GCC_CFLAGSD)endifelseifdef GCC_CFLAGSPgcc_flags += $(GCC_CFLAGSP)endifendififdef USE_STRICT_ANSI # default NOgcc_flags += -ansiendififdef USE_PROFILE # default NOgcc_flags += -pgendififdef LEAVETMP # default NOgcc_flags += -save-tempsendififdef WARNINGS_AS_ERRORSgcc_flags += -Werrorendififdef GEN_PICgcc_flags += -fPICendifSHCFLAGS += -fpicSHCXXFLAGS += -fpic# Standard includes##..gcc_includes +=ifdef GCC_INCLUDESgcc_includes += $(GCC_INCLUDES)endif# Command##..ifdef USE_CHECKERcc = @checkergccelsecc = $(CC_PRE) $(GCC_CC)endifcc_init =cc_o_switch = -o $@cc_source = $<cc_flags = \$(patsubst %,%,$(CFLAGS)) \$(patsubst %,%,$(gcc_flags)) \$(patsubst %,%,$(gcc_defines)) \$(patsubst %,-D%,$(cc_defines)) \$(patsubst %,-I %,$(INCDIRS)) \$(patsubst %,-I %,$(cc_includes)) \$(patsubst %,-I %,$(gcc_includes))cc_term =define cc_pre@echo [$<] compiling..endefifdef USE_METRICSdefine cc_post$(cc) -E $(cc_flags) $(cc_source) | mcstrip | cyclo -c > $(basename $@).metendefelsedefine cc_postendefendif################################################################################.. C/C++ dependencies## Additional defines##..gcc_depend +=ifeq ($(USE_GCCDEPEND),0)# Build GCC predefs and default include paths#..GCC_MACHINE := $(shell test -f $(GCC_CC) && $(GCC_CC) -dumpmachine)GCC_VERSION := $(shell test -f $(GCC_CC) && $(GCC_CC) -dumpversion)GCC_CPATH := $(shell $(GCC_CC) -v -dM -E - </dev/null 2>&1 | sed -e '/^\#include <\.\.\.>/,/End of search list\./!d;//d')gcc_depend += -D__GNUC__=$(word 1,$(subst .,$(space),$(GCC_VERSION)))gcc_depend += -D__GNUC_MINOR__=$(word 2,$(subst .,$(space),$(GCC_VERSION)))gcc_depend += -D__STDC__ -D__STDC_HOSTED__ifdef GCC_TARGETifneq "$(findstring Linux,$(GCC_TARGET))" ""gcc_depend += -Dunix -D__unix -D__unix__gcc_depend += -Dlinux -D__linux -D__linux__endififneq "$(findstring i386,$(GCC_TARGET))" ""gcc_depend += -Di386 -D__i386 -D__i386__endififneq "$(findstring armv4,$(GCC_TARGET))" ""gcc_depend += -Darm -D__arm -D__arm__gcc_depend += -D__ARM_ARCH__=4endififneq "$(findstring armv9,$(GCC_TARGET))" ""gcc_depend += -Darm -D__arm -D__arm__gcc_depend += -D__ARM_ARCH__=9endifendifendififdef GCC_DEPENDgcc_depend += $(GCC_DEPEND)endif# Command##..ifeq ($(USE_GCCDEPEND),0)ccdep = $(XX_PRE) $(GBE_BIN)/mkdependccdep_init =ccdep_o_switch = -f -ccdep_flags = -MM -b -We -p '$$(OBJDIR)/' -o ".$(o)"ccdep_source = $(filter %.c %.cc %.cpp, $+) > $(subst /,/,$@).tmp 2> $(OBJDIR)/depend.errelseccdep = -$(XX_PRE) $(GCC_CC)ccdep_init =ccdep_o_switch =ccdep_flags = -E -MM -MGccdep_source = $(filter %.c %.cc %.cpp, $+) > $(subst /,/,$@).tmp 2> $(OBJDIR)/depend.errendifccdep_flags += \$(patsubst %,%,$(CFLAGS)) \$(patsubst %,%,$(gcc_depend)) \$(patsubst %,%,$(gcc_defines)) \$(patsubst %,-D%,$(cc_defines)) \$(patsubst %,-Y %,$(GCC_CPATH)) \$(patsubst %,-I %,$(INCDIRS)) \$(patsubst %,-I %,$(cc_includes))ifeq ($(USE_GCCDEPEND),0)ccdep_flags += \$(patsubst %,-Y %,$(gcc_includes))endif## Parse the depend output:## s/^.*/\(.*\.${o}\:\)/$(OBJDIR)/\1/g# replace all object rules which contain / seperated# subdirs with a stripped prefixed object name.## eg. subdir/dir/object.o: $(OBJDIR)/object.o## s/^\([^/].*\.${o}\:\)/$(OBJDIR)/\1/g# prefix all object rules without subdirs.## eg. object.o: $(OBJDIR)/object.o#..ccdep_pre =ccdep_sed = \-sed -e 's/^.*\/\(.*\.${o}\:\)/\$$\(OBJDIR\)\/\1/g' \-e 's/^\([^/]*\.${o}\:\)/\$$\(OBJDIR\)\/\1/g' \$(subst /,/,$@).tmp > $@ 2> $(OBJDIR)/depend.err;ifdef SHNAMESccdep_sedsh = \sed -e 's/^.*\/\(.*\.${o}\:\)/\$$\(OBJDIR\)\/$(shname)\/\1/g' \-e 's/^\([^/]*\.${o}\:\)/\$$\(OBJDIR\)\/$(shname)\/\1/g' \$(subst /,/,$@).tmp >> $@ 2>> $(OBJDIR)/depend.err;ccdep_sed += \$(foreach shname,$(SHNAMES),$(ccdep_sedsh))endififndef LEAVETMPdefine ccdep_post@$(ccdep_sed)@rm $(subst /,/,$@).tmpendefelsedefine ccdep_post@$(ccdep_sed)endefendif#.. C++ Compiler definition#ifdef USE_CHECKERcxx = @checkergccelsecxx = $(CC_PRE) $(GCC_CC)endifcxx_init =cxx_o_switch = -o $@cxx_source = $<cxx_flags = \$(patsubst %,%,$(GCC_CXXFLAGS)) \$(patsubst %,%,$(CXXFLAGS)) \$(patsubst %,%,$(gcc_flags)) \$(patsubst %,%,$(gcc_defines)) \$(patsubst %,-d%,$(cxx_defines)) \$(patsubst %,-I %,$(INCDIRS)) \$(patsubst %,-I %,$(cxx_includes)) \$(patsubst %,-I %,$(gcc_includes))define cxx_pre@echo [$<] compiling..endefdefine cxx_postendef################################################################################.. Assembler definition##.. Assembler (GCC)#as = $(CC_PRE) $(GCC_CC)as_init =as_i_switch = -I$(space)as_o_switch =as_object = -o $@as_source = $<gas_flags = -Wall -x assembler-with-cpp -cifeq "$(DEBUG)" "1"gas_flags += -g -DDEBUGendififdef DLVLgas_flags += -DDLVL=$(DLVL)endififdef ALVLgas_flags += -DALVL=$(ALVL)endifas_defines := $(addprefix -D,$(as_defines))as_defines += $(gas_flags)as_flags = \$(ASFLAGS) \$(as_defines) \$(patsubst %,$(as_i_switch)%,$(INCDIRS)) \$(patsubst %,$(as_i_switch)%,$(as_includes)) \$(as_object)define as_pre@echo [$<] compiling..endefdefine as_postendef################################################################################.. Archiver definition##.. Archiver#ar = $(XX_PRE) $(GCC_AR)ar_o_switch =ar_flags = -scr $@ \$(patsubst %,%,$^)define ar_pre@echo [$@] Create archive..endefdefine ar_postendef#.. Archive Merge#armerge = $(XX_PRE) $(GBE_TOOLS)/armergearmerge_init =armerge_flags = -d $(MLIBDIR) -t unix -a $(GCC_AR)armerge_o_switch= $@ $^armerge_pre = -$(rm) -f $@armerge_post =################################################################################.. Linker definition##.. Linked (shared library support)## The following are detailed within the context of TARGET definition:## SHNAME Defines the shared library name (eg lib.so.1.1)# SHBASE Defines the base library name (eg lib.so)#shld = $(CC_PRE) $(GCC_CC)shld_o_switch = -o $@shld_flags += -shared -fPICshld_flags += -Wl,-z,defs,--warn-unresolved-symbolsshld_flags += -Xlinker -h'$(SHNAME)'shld_flags += -Xlinker -Map '$(LIBDIR)/$(SHBASE).map'ifeq "$(DEBUG)" "1"shld_flags += -gendifshld_flags += \$(patsubst %,%,$(LDFLAGS)) \$(patsubst %,%,$(GCC_LDFLAGS)) \$(patsubst %,-L%,$(wildcard $(LIBDIRS))) \$($(notdir $(SHBASE))_shld)define shld_pre@echo [$@] Linking shared library..; \$(touch) $(LIBDIR)/$(SHBASE).mapendefdefine shld_postendefdefine SHLDDEPEND$(AA_PRE)export GCC_LIB; \GCC_LIB="$(subst $(space),;,$(wildcard $(LIBDIRS)))"; \$(cmdfile) -wo$@ "@(vlibgcc,$(GCC_CC))$($(DPLIST))"endef#.. Linker#ifdef USE_CHECKERld = @checkergccelseld = $(CC_PRE) $(GCC_CC)endifld_init =ld_o_switch = -o $@ld_flags += -Xlinker -Map '$(basename $@).map'ifeq "$(DEBUG)" "1"ld_flags += -gendififdef USE_PROFILEld_flags += -pgendifld_flags += \$(patsubst %,%,$(LDFLAGS)) \$(patsubst %,%,$(GCC_LDFLAGS)) \$(patsubst %,-L%,$(wildcard $(LIBDIRS))) \$(patsubst %,-Xlinker -rpath-link %,$(wildcard $(LIBDIRS))) \$($(notdir $(basename $@))_ld)define ld_pre@echo [$@] Linking..; \$(touch) $(basename $@).mapendefdefine ld_postendefdefine LDDEPEND$(AA_PRE)export GCC_LIB; \GCC_LIB="$(subst $(space),;,$(wildcard $(LIBDIRS)))"; \$(cmdfile) -wo$@ "@(vlibgcc,$(GCC_CC))$($(DPLIST))"endef## LDSTRIP# $1 - Full name of the output# $2 - Full name of debug filedefine LDSTRIP$(GCC_OBJCOPY) --only-keep-debug $1 $2 || rm -f $1 $2$(GCC_OBJCOPY) --strip-debug $1 || rm -f $1 $2$(GCC_OBJCOPY) --add-gnu-debuglink=$2 $1 || rm -f $1 $2endef