#
#  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
