# # Top level Makerules # it uses Makerules.env for build env vars and optional branding.inc # # Copyright (C) 1999-2011, Broadcom Corporation # # Unless you and Broadcom execute a separate written software license # agreement governing use of this software, this software is licensed to you # under the terms of the GNU General Public License version 2 (the "GPL"), # available at http://www.broadcom.com/licenses/GPLv2.php, with the # following added to such license: # # As a special exception, the copyright holders of this software give you # permission to link this software with independent modules, and to copy and # distribute the resulting executable under terms of your choice, provided that # you also meet, for each linked independent module, the terms and conditions of # the license of that module. An independent module is a module which is not # derived from this software. The special exception does not apply to any # modifications of the software. # # Notwithstanding the above, under no circumstances may you combine this # software in any way with any other Broadcom software provided under a license # other than the GPL, without Broadcom's express prior written consent. # # $Id: Makerules,v 2.78.42.1 2010-05-11 17:55:55 $ # This is the TOP level makefile rules, which is used by many makefiles. # Please be cautious on changes, especially compatibilities. # e.g. new gcc compile option should be protected with version check # or "check_gcc" trick # first rule (default) all: # SRCBASE should be set by the Makefile that includes this. ifndef SRCBASE SRCBASE = . endif # Set up the build environment variables include ${SRCBASE}/Makerules.env # Define space to be a single space character. Using " " gets the quotes # as well, which we don't want. empty := space := $(empty) $(empty) ifeq ($(HOSTOS), Windows_NT) # force use of bash, otherwise you will get the broken sh.exe. SHELL=bash endif # # Setup make variables depending on target # ifeq ($(TARGETOS), unix) # The environment for native unix builds EXEEXT = OBJEXT = .o GCINCS = -I$(SRCBASE)/include GCDEFS = -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) -DTARGETARCH_$(TARGETARCH) ifeq ($(TARGETARCH), x86_mmx) GCDEFS := $(GCDEFS) -D_X86_ -D_MMX_ endif ifeq ($(TARGETARCH), x86) GCDEFS := $(GCDEFS) -D_X86_ endif ifeq ($(TARGETARCH), mips) GCDEFS := $(GCDEFS) -D_MIPS_ endif ifeq ($(TARGETARCH), mips_be) GCDEFS := $(GCDEFS) -D_MIPS_ -DIL_BIGENDIAN endif ifeq ($(TARGETARCH), arm) GCDEFS := $(GCDEFS) -D_ARM_ -DIL_BIGENDIAN endif ifeq ($(TARGETARCH), arm_le) GCDEFS := $(GCDEFS) -D_ARM_ endif ifeq ($(TARGETARCH), arm_android) GCDEFS := $(GCDEFS) -D_ARM_ endif ifeq ($(TARGETENV), freebsd) GCINCS := $(GCINCS) -I/usr/local/include endif ifeq ($(TARGETENV), sun4) GCDEFS := $(GCDEFS) -D_SPARC_ endif ifeq ($(TARGETENV), macos) MACOS_VER := $(shell sw_vers -productVersion) ifneq (,$(findstring 10.5,$(MACOS_VER))) SDK=/Developer/SDKs/MacOSX10.5.sdk else ifneq (,$(findstring 10.6,$(MACOS_VER))) SDK=/Developer/SDKs/MacOSX10.6.sdk else SDK=/Developer/SDKs/MacOSX10.4u.sdk endif endif GCDEFS := $(GCDEFS) -DMACOSX GCDEFS := $(GCDEFS) -pipe -fpascal-strings -fasm-blocks -fmessage-length=0 GCDEFS := $(GCDEFS) -fvisibility=hidden -isysroot $(SDK) ifeq ($(TARGETARCH), PPC) GCDEFS := $(GCDEFS) -arch ppc -mtune=G4 GLDFLAGS = -arch ppc -Wl,-syslibroot,$(SDK) endif ifeq ($(TARGETARCH), x86) GCDEFS := $(GCDEFS) -arch i386 GLDFLAGS = -arch i386 -Wl,-syslibroot,$(SDK) endif endif GCOPTS = GCFLAGS = -g -Wall CC_TARGET =-o $@ LINK_TARGET =-o $@ ifeq ($(TARGETENV), linuxmips) TARGET_PREFIX = mipsel-linux- else ifeq ($(TARGETENV), linuxmips_be) TARGET_PREFIX = mips-linux- else ifeq ($(TARGETENV), linuxarm) TARGET_PREFIX = armeb-linux- else ifeq ($(TARGETENV), linuxarm_le) TARGET_PREFIX = arm-linux- else ifeq ($(TARGETENV), android) TARGET_PREFIX = arm-eabi- GCFLAGS += -Dlinux GCFLAGS += -I/projects/hnd/tools/linux/hndtools-arm-eabi-4.2.1/android-ndk-r3/build/platforms/android-3/arch-arm/usr/include # GCFLAGS += -I/projects/hnd/tools/linux/hndtools-arm-eabi-4.2.1/arm-eabi/include/bionic/libc/include # GCFLAGS += -I/projects/hnd/tools/linux/hndtools-arm-eabi-4.2.1/arm-eabi/include/bionic/libc/arch-arm/include/ GCFLAGS += -I/tools/linux/src/linux-2.6.25-01843-gfea26b0/include/ else TARGET_PREFIX = endif endif endif endif endif CC = $(TARGET_PREFIX)gcc AS = $(TARGET_PREFIX)as LD = $(TARGET_PREFIX)ld AR = $(TARGET_PREFIX)ar INSTALL = install -c TCFLAGS = ifeq ($(TARGETENV), freebsd) GLDFLAGS = -static endif ifeq ($(TARGETENV), linuxarm) GLDFLAGS = -static endif ifeq ($(TARGETENV), linuxarm_le) GLDFLAGS = -static endif ifeq ($(TARGETENV), android) GLDFLAGS = -static endif GLDLIBS = -lgcc endif # $(TARGETOS) == unix ifeq ($(TARGETOS), Windows_NT) # The environment for windows builds EXEEXT = .exe ifeq ($(TARGETENV), win32) # standard win32 using MS compiler OBJEXT = .obj GCINCS = /I$(SRCBASE)/include GCDEFS = /DTARGETENV_$(TARGETENV) /DTARGETOS_$(TARGETOS) \ /DTARGETARCH_$(TARGETARCH) /D_X86_ ifeq ($(TARGETARCH), x86_mmx) GCDEFS += /D_MMX_ endif GCOPTS = /nologo GCFLAGS = /GM /W3 /Z7 CC_TARGET =-Fo$@ LINK_TARGET =-out:$@ CC = cl AS = cl LD = cl TCFLAGS = GLDFLAGS = /nologo /link /nologo /INCREMENTAL:NO GLDLIBS = else # cygwin32 based environment OBJEXT = .o GCINCS = -I$(SRCBASE)/include GCDEFS = -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) \ -DTARGETARCH_$(TARGETARCH) -D_X86_ ifeq ($(TARGETARCH), x86_mmx) GCDEFS += -D_MMX_ endif GCOPTS = GCFLAGS = -g -Wall CC_TARGET =-o $@ LINK_TARGET =-o $@ CC = gcc AS = gcc LD = gcc INSTALL = install -c TCFLAGS = GLDFLAGS = GLDLIBS = -liberty -lgcc endif # Tools common to cygwin/win32 INSTALL = install -c BUILD = build -ceZ # RELEASE_TARGET is a the directory under RELEASE_DIR where # target dependant files go. It is composed of the OS and # the CPU, some examples are: winnt40/i386, win98 ... # # NEEDSWORK: For now only NT 4.0 stuff uses it. ifneq ($(findstring $(TARGETPLATFORM), "Wdm wdm"), ) RELEASE_TARGET = wdm/i386 else RELEASE_TARGET = winnt40/i386 endif # RELEASE_TOOLS_DIR is a the directory under RELEASE_DIR where # common tools go. # For compatability with previous installs &test scripts, old # tools still go in "yosemite". RELEASE_YOS_DIR = yosemite RELEASE_TOOLS_DIR = tools endif # $(TARGETOS) == Windows_NT ifeq ($(TARGETOS), vxWorks) WIND_REGISTRY = sol ifndef WIND_BASE ifeq ($(HOSTOS), unix) WIND_BASE = /dfs/tools/vxWorks else WIND_BASE = z:/tools/vxWorks endif endif include $(WIND_BASE)/target/h/make/defs.default ifeq ($(HOSTENV), Windows_NT) WIND_HOST_TYPE = x86-win32 else ifeq ($(HOSTENV), sun4) WIND_HOST_TYPE = sun4-solaris2 else WIND_HOST_TYPE = i386-freebsd endif endif ifeq ($(TARGETENV), vxsim) CPU = SIMSPARCSOLARIS else ifeq ($(TARGETENV), vx386) CPU = i386 else CPU = R4650 VXFLAGS = -DCPU_VAR=$(CPU) endif endif include $(WIND_BASE)/target/h/make/make.$(CPU)$(TOOL) include $(WIND_BASE)/target/h/make/defs.$(WIND_HOST_TYPE) GCINCS = -I$(WIND_BASE)/target/h -I$(SRCBASE)/include GCDEFS = $(DEFINE_CC) -DCPU=$(CPU) -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) -DTARGETARCH_$(TARGETARCH) GCOPTS = -g -O2 GCFLAGS = -Wall $(CC_ARCH_SPEC) LDFLAGS = $(GLDFLAGS) $(LLDFLAGS) GLDLIBS = $(LIBS) WIND_BIN = $(WIND_BASE)/host/$(WIND_HOST_TYPE)/bin AR := $(WIND_BIN)/$(AR) AS := $(WIND_BIN)/$(AS) BINHEX := $(WIND_BIN)/$(BINHEX) CC := $(WIND_BIN)/$(CC) CF := $(WIND_BIN)/$(CF) LD := $(CC) NM := $(WIND_BIN)/$(NM) RANLIB := $(WIND_BIN)/$(RANLIB) BINXSYM_NAME := $(WIND_BIN)/$(BINXSYM) endif # $(TARGETOS) == vxWorks ifeq ($(TARGETENV), nucleusarm) # The environment for nucleus builds ifeq ($(BSP_BASE_DIR),) BSP_BASE_DIR := $(SRCBASE)/../bsp endif ifeq ($(NUCLEUS_INC_DIR),) NUCLEUS_INC_DIR := $(BSP_BASE_DIR)/rtos/nucleus/inc endif EXEEXT := OBJEXT := .o GCINCS := -I$(SRCBASE)/include -I$(NUCLEUS_INC_DIR) GCDEFS := -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) -DTARGETARCH_$(TARGETARCH) GCOPTS := ifeq ($(OBJDIR),) OBJDIR := $(TARGETENV)/ endif # --md: This option compiles the source and writes make file dependency lines # to a file. The output file is suitable for use by a make utility. # -c: Compiles but does not perform the link phase. # -O2: High optimization. # ---memaccess -UL41: This option tells the compiler that the memory in the # target system has slightly restricted or expanded capabilities. # Disables unaligned mode for code that uses pre-ARMv6 unaligned # access behavior. # "/adsabi" is added to "--apcs /interwork/$(SWST)" so that objects created # under ADS 1.2 can be linked with objects compiled under RVCT 2.2. # --diag_suppress 2084,1658 = blocks the diagnostic warning "Warning: C2084W: support for --apcs /adsabi is deprecated" # 1293: Suppress "Assignment in condition" warning. GCFLAGS := --md \ -c \ -O2 \ --memaccess -UL41 \ --apcs /adsabi/interwork/NOSWST \ --diag_suppress 2084,1658,1293 \ --li # --cpu 'name': This option generates code for a specific ARM processor or architecture. ifeq ($(TARGETCPU),2153) GCFLAGS += --cpu ARM1136J-S else $(error "Unknown target CPU type!") endif #CPPFLAGS := -embeddedcplusplus CC_TARGET =-o $@ CPP_TARGET =-o $@ LINK_TARGET =-o $@ CC := tcc CPP := tcpp AS := armasm LD := armlink AR := armar -c -r --create INSTALL := install -c TCFLAGS := GLDFLAGS := GLDLIBS := --ELF --symbols --debug --map --info sizes,totals --errors link.err --list link.map --verbose # Convert windows style directories to cygwin style. # It should be used in situations where the host environment is cygwin, and # the host compiler is a native Win32 app (non-cygwin). It will convert the # Windows style directories in the dependencies list to cygwin style. This is # necessary for the dependency files to be included by cygwin make. ifeq ($(HOSTOS),Windows_NT) FILTER_DEPENDS_IN_C_TO_OBJ_RULE := 1 endif endif # $(TARGETENV) == nucleusarm ifeq ($(TARGETENV), bcmmips) OBJEXT = .o GCINCS = -I$(SRCBASE)/include GCDEFS = -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) \ -DTARGETARCH_$(TARGETARCH) -D__mips__ GCOPTS = -g -O2 GCFLAGS = -Wall GLDFLAGS = -Wl,-tidt.dld AS = bcmas CC = bcmgcc LD = $(CC) NM = bcmnm RANLIB = bcmranlib endif # $(TARGETENV) == bcmmips ifeq ($(TARGETENV), klsi) OBJEXT = .obj GCINCS = -I$(SRCBASE)/include GCDEFS = -DTARGETENV_$(TARGETENV) -DTARGETOS_$(TARGETOS) \ -DTARGETARCH_$(TARGETARCH) -D__klsi__ AS = qtasm GASFLAGS = -m20 CC = qtcc TCFLAGS = -w asm=$(GASFLAGS) +c -Vcdv -w cc=+reginfo endif # $(TARGETENV) == klsi CFLAGS = $(LCINCS) $(GCINCS) $(GCDEFS) $(GCOPTS) $(GCFLAGS) $(TCFLAGS) $(HCFLAGS) \ $(LCDEFS) $(LCOPTS) $(LCFLAGS) $(CENV) ASFLAGS = $(GASFLAGS) $(LASFLAGS) $(ASENV) LDFLAGS = $(GLDFLAGS) $(LLDFLAGS) $(LDENV) LDLIBS = $(LLDLIBS) $(GLDLIBS) # dependency files including the .d file itself. # note the example in GNU documentation seems to have a bug: # two backslashes where one is correct. %.d: %.c ifeq ($(findstring s, $(MAKEFLAGS) ),) @ echo making $@ endif @ $(SHELL) -ec '$(CC) -MM $(CFLAGS) $(CPPFLAGS) $< \ | sed '\''s/$*\.o[ :]*/$@ &/g'\'' >$@' ifeq ($(TARGETENV), win32) # win32 needs different command line args %.s: %.c $(CC) /FAs $(CFLAGS) $(CPPFLAGS) /Fa$@ /c $< %.i: %.c $(CC) /E $(CFLAGS) $(CPPFLAGS) $< > $@ else # !win32 %.s: %.c $(CC) -S $(CFLAGS) $(CPPFLAGS) -o $@ $< %.i: %.c $(CC) -o $@ -E -dD $(CFLAGS) $(CPPFLAGS) $< endif # win32 ifeq ($(TARGETENV), klsi) %$(OBJEXT): %.c $(CC) $(CFLAGS) $*.c %$(OBJEXT): %.asm $(AS) $(ASFLAGS) $*.asm %.asm: %.c $(CC) $(CFLAGS) -asm $*.c %.i: %.c $(CC) $(CFLAGS) -cc -peep -asm $*.c mv $*.pp $*.i else # This command sequence will: # - Convert back-slashes to foward-slashes # - Convert long filenames to 8.3 format (e.g. Program Files --> PROGRA~1) # - Convert windows-style drive letters to cygwin style. # # It should be used in situations where the host environment is cygwin, and # the host compiler is a native Win32 app (non-cygwin). It will convert the # Windows style directories in the dependencies list to cygwin style. This is # necessary for the dependency files to be included by cygwin make. define FILTER_DEPENDS sed -e 's/\\/\//g' \ -e 's/Program Files/PROGRA~1/g' \ -e 's/\([A-Za-z]\):\//\/cygdrive\/\1\//' < $(notdir $(@:.o=.d)) > $(@:.o=.d) && \ rm -f $(notdir $(@:.o=.d)) endef $(OBJDIR)%$(OBJEXT): %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $(CC_TARGET) $< ifeq ($(FILTER_DEPENDS_IN_C_TO_OBJ_RULE),1) ${FILTER_DEPENDS} endif $(OBJDIR)%$(OBJEXT): %.cpp $(CPP) -c $(CFLAGS) $(CPPFLAGS) $(CPP_TARGET) $< ifeq ($(FILTER_DEPENDS_IN_C_TO_OBJ_RULE),1) ${FILTER_DEPENDS} endif endif # klsi %.h: %.x rpcgen -C -h $< > $@ %_xdr.c: %.x @ (if [ ! -f `basename $<` ] ; then ln -s $< . ; fi; true) rpcgen -C -c -i 0 `basename $<` > $@ # Makefile debugging rule env: printenv # if the user mistakenly specified RELEASE_DIR in unix-style notation, # convert it to Win32 notation for them. # # RELEASE_DIR is assumed to be in windows-style notation if it has both # backslashes ('\') and colons (':'). # ifneq ("$(subst \,,$(RELEASE_DIR))", "$(RELEASE_DIR)") ifneq ("$(subst :,,$(RELEASE_DIR))", "$(RELEASE_DIR)") RELEASE_DIR := $(subst :,,$(RELEASE_DIR)) RELEASE_DIR := $(subst \,/,$(RELEASE_DIR)) RELEASE_DIR := //$(RELEASE_DIR) endif endif # all release rules depend on a valid RELEASE_DIR release: check_release_dir check_release_dir: @if [ "x$(RELEASE_DIR)" = "x" ]; then \ echo "RELEASE_DIR is not set!"; \ exit 1; \ fi; include ${SRCBASE}/branding.inc