Subversion Repositories DevTools

Rev

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 OPTIONS

ifneq "$(findstring purify,$(OPTIONS))" ""      # Enable purify
CC_PRE          += purify
else
ifneq "$(findstring purecov,$(OPTIONS))" ""     # Enable pure coverage
CC_PRE          += purecov
endif
endif

ifneq "$(findstring metrics,$(OPTIONS))" ""     # Build source metrixs
USE_METRICS     = 1
endif

ifneq "$(findstring checker,$(OPTIONS))" ""
USE_CHECKER     = 1
endif

ifneq "$(findstring profile,$(OPTIONS))" ""
USE_PROFILE     = 1
endif

ifneq "$(findstring ccdepend,$(OPTIONS))" ""    # Build depends using gcc
USE_GCCDEPEND   = 1
endif
ifneq "$(findstring gccdepend,$(OPTIONS))" ""
USE_GCCDEPEND   = 1
endif
ifneq "$(findstring mkdepend,$(OPTIONS))" ""
USE_GCCDEPEND   = 0
endif

ifneq "$(findstring wall,$(OPTIONS))" ""        # Enable all warnings
USE_WALL        = 1
endif

endif   #OPTIONS

###############################################################################
#..     C and C++ Compiler warning filter
#
cc_filter_name  := warnings.gcc
cc_filter       := "$(notdir $(wildcard $(GBE_ROOT)/$(cc_filter_name)))"

ifeq ($(strip $(cc_filter)),"$(cc_filter_name)")
    cc_filter      := $(GBE_ROOT)/$(cc_filter_name)
else
    cc_filter  :=
endif

ifdef cc_filter
cc_redirect_stderr = 1
cc_error_filter = $(awk) -f $(cc_filter)
endif

###############################################################################
#..     C Compiler definition
#

        # Standard defines
        #
        #..
ifdef GCC_DEFINES
gcc_defines     += $(GCC_DEFINES)
endif

gcc_defines     += -D_REENTRANT

ifeq "$(DEBUG)" "1"
gcc_defines     += -DDEBUG
else
gcc_defines     +=
endif

ifdef ALVL
gcc_defines     += -DALVL=$(ALVL)
endif

ifdef DLVL
gcc_defines     += -DDLVL=$(DLVL)
endif

gcc_defines     += -D__SOURCE__=\"$(notdir $<)\"

        # Standard flags
        #
        #  -Wall implies:
        #       -Wimplicit, -Wreturn-type, -Wunused, -Wswitch
        #       -Wformat, -Wchar-subscripts, -Wparentheses
        #       -Wmissing-braces
        #..
gcc_flags       += -c
gcc_flags       += -Wall
ifdef USE_WALL
#gcc_flags      += -Wuninitialized              # only makes sense with `-O'
gcc_flags       += -Wwrite-strings
gcc_flags       += -Wcast-qual
gcc_flags       += -Wbad-function-cast
gcc_flags       += -Wpointer-arith
gcc_flags       += -Wstrict-prototypes
gcc_flags       += -Wmissing-prototypes
gcc_flags       += -Wmissing-declarations
gcc_flags       += -Wnested-externs
gcc_flags       += -Wtraditional
gcc_flags       += -Wconversion
gcc_flags       += -Wcomment
gcc_flags       += -Wcast-align
#gcc_flags      += -Winline
gcc_flags       += -Wshadow
gcc_flags       += -Wredundant-decls
#gcc_flags      += -Wid-clash-31
endif

ifdef GCC_CFLAGS
gcc_flags       += $(GCC_CFLAGS)
endif

ifdef FORCE_C_COMPILE
endif

ifdef FORCE_CC_COMPILE
endif

ifdef USE_OPTIMISE                              # default for production
else
endif

ifdef USE_DEBUGINFO                             # default for debug
gcc_flags       += -g3 -ggdb
else
gcc_flags       += -g3 -ggdb
endif

ifeq "$(DEBUG)" "1"                             # debug/prod specific
ifdef GCC_CFLAGSD
gcc_flags       += $(GCC_CFLAGSD)
endif
else
ifdef GCC_CFLAGSP
gcc_flags       += $(GCC_CFLAGSP)
endif
endif

ifdef USE_STRICT_ANSI                   # default NO
gcc_flags       += -ansi
endif

ifdef USE_PROFILE                               # default NO
gcc_flags       += -pg
endif

ifdef LEAVETMP                                  # default NO
gcc_flags       += -save-temps
endif

ifdef WARNINGS_AS_ERRORS
gcc_flags       += -Werror
endif

ifdef GEN_PIC
gcc_flags       += -fPIC
endif

SHCFLAGS        += -fpic
SHCXXFLAGS      += -fpic

        # Standard includes
        #
        #..
gcc_includes    +=

ifdef GCC_INCLUDES
gcc_includes    += $(GCC_INCLUDES)
endif

        # Command
        #
        #..
ifdef USE_CHECKER
cc              = @checkergcc
else
cc              = $(CC_PRE) $(GCC_CC)
endif
cc_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..
endef

ifdef USE_METRICS
define cc_post
        $(cc) -E $(cc_flags) $(cc_source) | mcstrip | cyclo -c > $(basename $@).met
endef
else
define cc_post
endef
endif

###############################################################################
#..     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_TARGET
                ifneq "$(findstring Linux,$(GCC_TARGET))" ""
                        gcc_depend      += -Dunix -D__unix -D__unix__
                        gcc_depend      += -Dlinux -D__linux -D__linux__
                endif
                ifneq "$(findstring i386,$(GCC_TARGET))" ""
                        gcc_depend      += -Di386 -D__i386 -D__i386__
                endif
                ifneq "$(findstring armv4,$(GCC_TARGET))" ""
                        gcc_depend      += -Darm -D__arm -D__arm__
                        gcc_depend      += -D__ARM_ARCH__=4
                endif
                ifneq "$(findstring armv9,$(GCC_TARGET))" ""
                        gcc_depend      += -Darm -D__arm -D__arm__
                        gcc_depend      += -D__ARM_ARCH__=9
                endif
        endif
endif

ifdef GCC_DEPEND
gcc_depend      += $(GCC_DEPEND)
endif

        # Command
        #
        #..
ifeq ($(USE_GCCDEPEND),0)
ccdep           = $(XX_PRE) $(GBE_BIN)/mkdepend
ccdep_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.err
else
ccdep           = -$(XX_PRE) $(GCC_CC)
ccdep_init      =
ccdep_o_switch  =
ccdep_flags     = -E -MM -MG
ccdep_source    = $(filter %.c %.cc %.cpp, $+) > $(subst /,/,$@).tmp 2> $(OBJDIR)/depend.err
endif

ccdep_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 SHNAMES
ccdep_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))
endif

ifndef LEAVETMP
define ccdep_post
        @$(ccdep_sed)
        @rm $(subst /,/,$@).tmp
endef
else
define ccdep_post
        @$(ccdep_sed)
endef
endif

#..     C++ Compiler definition
#
ifdef USE_CHECKER
cxx             = @checkergcc
else
cxx             = $(CC_PRE) $(GCC_CC)
endif
cxx_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..
endef

define cxx_post
endef

###############################################################################
#..     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 -c
ifeq "$(DEBUG)" "1"
gas_flags       += -g -DDEBUG
endif
ifdef DLVL
gas_flags       += -DDLVL=$(DLVL)
endif
ifdef ALVL
gas_flags       += -DALVL=$(ALVL)
endif
as_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..
endef

define as_post
endef


###############################################################################
#..     Archiver definition
#

#..     Archiver
#
ar              = $(XX_PRE) $(GCC_AR)
ar_o_switch     =
ar_flags        = -scr $@ \
                $(patsubst %,%,$^)

define ar_pre
        @echo [$@] Create archive..
endef

define ar_post
endef

#..     Archive Merge
#
armerge         = $(XX_PRE) $(GBE_TOOLS)/armerge
armerge_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 -fPIC
shld_flags      += -Wl,-z,defs,--warn-unresolved-symbols
shld_flags      += -Xlinker -h'$(SHNAME)'
shld_flags      += -Xlinker -Map '$(LIBDIR)/$(SHBASE).map'

ifeq "$(DEBUG)" "1"
shld_flags      += -g
endif
shld_flags      += \
                $(patsubst %,%,$(LDFLAGS)) \
                $(patsubst %,%,$(GCC_LDFLAGS)) \
                $(patsubst %,-L%,$(wildcard $(LIBDIRS))) \
                $($(notdir $(SHBASE))_shld)

define shld_pre
        @echo [$@] Linking shared library..; \
        $(touch) $(LIBDIR)/$(SHBASE).map
endef

define shld_post
endef

define SHLDDEPEND
        $(AA_PRE)export GCC_LIB; \
                GCC_LIB="$(subst $(space),;,$(wildcard $(LIBDIRS)))"; \
        $(cmdfile) -wo$@ "@(vlibgcc,$(GCC_CC))$($(DPLIST))"
endef


#..     Linker
#
ifdef USE_CHECKER
ld              = @checkergcc
else
ld              = $(CC_PRE) $(GCC_CC)
endif
ld_init         =
ld_o_switch     = -o $@

ld_flags        += -Xlinker -Map '$(basename $@).map'

ifeq "$(DEBUG)" "1"
ld_flags        += -g
endif
ifdef USE_PROFILE
ld_flags        += -pg
endif

ld_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 $@).map
endef

define ld_post
endef

define 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 file
define 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 $2

endef