blob: 06ee2fed75a46ed70ff56fc57a4b097cd90a6886 [file] [log] [blame]
#
# Top level Makerules
# it uses Makerules.env for build env vars and optional branding.inc
#
# Copyright (C) 1999-2010, 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.69.30.3.2.6 2009/05/15 23:06:59 Exp $
# 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
SDK=/Developer/SDKs/MacOSX10.4u.sdk
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/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
ifeq ($(TARGETENV), linuxarm_omap)
TARGET_PREFIX = arm-none-linux-gnueabi-
else
TARGET_PREFIX =
endif
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
ifeq ($(TARGETENV), linuxarm_omap)
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