sbsv1/buildsystem/extension/base/bootstrap.mk
author Mike Kinghan <mikek@symbian.org>
Thu, 25 Nov 2010 13:59:07 +0000
changeset 40 68f68128601f
permissions -rw-r--r--
1) Add the sbsv1 components from sftools/dev/build to make the linux_build package independent of the obsolete buildtools package. 2) Enhance romnibus.pl so that it generate the symbol file for the built rom when invoked by Raptor 3) Make the maksym.pl tool portable for Linux as well as Windows. 4) Remove the of armasm2as.pl from the e32tools component in favour of the copy now exported from sbsv1/e32util.

# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Nokia Corporation - initial contribution.
#
# Contributors:
#
# Description:
#

# To ensure that EPOCROOT always ends with a forward slash.
TMPROOT:=$(subst \,/,$(EPOCROOT))
EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/

HOST_PLATFORM := $(patsubst linux%,linux,$(HOSTPLATFORM_DIR))
ifeq (linux,$(HOST_PLATFORM))
INC_PATH := $(EPOCROOT)epoc32/include/platform
endif

ifndef CPU
CPU := arm
endif

ifndef LINKBASE
LINKBASE := 0x00000000
endif

include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk

PROCEED:=build
ifneq "$(PBUILDPID)" ""
        ifneq "$(CFG)" "UREL"
                PROCEED:=skip
        endif
endif

COPY := $(call ecopy)

ifeq "$(CPU)" "x86"
        ifeq "$(MEMMODEL)" "direct"
                BLDSGL:=s
        else
                ifeq "$(MEMMODEL)" "flexible"
                        BLDSGL:=f
                else
                        BLDSGL:=
                endif
        endif
        ifdef SMP
                BLDSMP:=smp
        else
                BLDSMP:=
        endif
        EPOCROOT:=$(subst /,\,$(EPOCROOT))
        EPOCBLDABS := $(EPOCROOT)epoc32\build\tasm$(PBUILDPID)\$(BLDSGL)$(VNAME)$(BLDSMP)
else
        DRIVELETTER := $(shell cd 2>NUL)
        DRIVELETTER_2 := $(word 1,$(subst \, ,$(DRIVELETTER)))
        EPOCBLDABS_1 := $(subst $(TO_ROOT),,$(EPOCBLD))
        EPOCBLDABS_2 := $(subst $(DRIVELETTER_2),,$(EPOCBLDABS_1))
        
        EPOCBLDABS := $(call epocbldabs,$(DRIVELETTER_2),$(EPOCBLDABS_2))/$(NAME)
endif

EPOCINC := $(INC_PATH)
EPOCKERNINC := $(EPOCINC)/kernel
EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
EPOCMMINC := $(INC_PATH)/memmodel/epoc/$(MEMMODEL)/$(CPU)
EPOCTRG := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
TRG := $(EPOCTRG)/$(NAME).bin
TEMPTRG := $(EPOCBLDABS)/$(NAME).bin

ifdef EXTRA_INC_PATH
ASMINCPATH := $(EXTRA_INC_PATH)
endif

ifeq "$(CPU)" "arm"

ifdef ARMCC
ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC)
ARMASM_OUT := $(shell armasm 2>&1)
ARMASM_OUT_RVCT := $(wordlist 1,6,$(ARMASM_OUT))
ARMASM_OUT_6 := $(word 6,$(ARMASM_OUT))

# Use GCC toolchain if no other is available
TOOLVER := GCC

# ARM/Thumb Macro Assembler, RVCT2.2 [Build 616]
# ARM Assembler, RVCT4.0 [Build 529]
RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_RVCT)))
ifeq "$(RVCTSTR)" "RVCT"
        TOOLVER := RVCT
        OP := --
endif
ifeq "$(ARMASM_OUT_6)" "2.37"
        TOOLVER := 211
endif
endif

ifdef GCCE
TOOLVER := GCCE
ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC)
ifeq (linux,$(HOST_PLATFORM))
EXE_SUFFIX :=
else
EXE_SUFFIX := .exe
endif
ifdef SBS_GCCE441BIN
GCCEBIN := $(SBS_GCCE441BIN)
else ifdef SBS_GCCE433BIN
GCCEBIN := $(SBS_GCCE433BIN)
else ifdef SBS_GCCE432BIN
GCCEBIN := $(SBS_GCCE432BIN)
endif
GCCEASM := $(GCCEBIN)/arm-none-symbianelf-as$(EXE_SUFFIX)
GCCELD := $(GCCEBIN)/arm-none-symbianelf-ld$(EXE_SUFFIX)
GCCESTRIP := $(GCCEBIN)/arm-none-symbianelf-strip$(EXE_SUFFIX)
endif

endif

ifeq "$(MEMMODEL)" "direct"
CFG_MM := CFG_MMDirect
endif
ifeq "$(MEMMODEL)" "moving"
CFG_MM := CFG_MMMoving
endif
ifeq "$(MEMMODEL)" "multiple"
CFG_MM := CFG_MMMultiple
endif
ifeq "$(MEMMODEL)" "flexible"
CFG_MM := CFG_MMFlexible
endif
ifndef CFG_MM
$(error Memory model unknown)
endif

ASM_MACROS += $(CFG_MM)
ifdef SMP
        ASM_MACROS += SMP
endif

ifeq "$(CPU)" "x86"
        ifndef BASEINCLUDES
                BASEINCLUDES := bootcpu.inc bootmacr.inc
        endif
        ifndef BASESOURCES
                BASESOURCES := bootmain.asm bootcpu.asm bootutil.asm
        endif
        GENINCLUDES := $(GENINCLUDES) x86boot.h
        ASMINCPATH := . 
        ASM := tasm
        LINK := tlink
        EXE2BIN := exe2bin
        SRCEXT := asm
        INCEXT := inc
        OBJEXT := obj
        EXEEXT := exe
        
        ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join /i,$(call slash2generic,$(dir))))   
        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),/d$(macro)=1)
        AFLAGS := /l /m3 /ML /W-PDC $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
        LFLAGS := /m /s /n /3 /c
        ASMTYP := TASM
        LINKFILE :=
        define do_asm
                cd $(EPOCBLDABS) && $(CP) $(call slash2generic,$<) .
                cd $(EPOCBLDABS) && $(ASM) $(AFLAGS) $(notdir $<)
        endef
        define do_link
                cd $(EPOCBLDABS) && $(LINK) $(LFLAGS) $(filter %.$(OBJEXT),$(foreach obj,$^,$(notdir $(obj)))), temp.exe
                cd $(EPOCBLDABS) && $(COPY) temp.exe $@
                cd $(EPOCBLDABS) && $(ERASE) temp.exe
        endef
        define do_strip
                cd $(EPOCBLDABS) && $(COPY) $< temp.exe
                cd $(EPOCBLDABS) && $(EXE2BIN) temp.exe temp.bin
                cd $(EPOCBLDABS) && $(COPY) temp.bin $@
                cd $(EPOCBLDABS) && $(ERASE) temp.exe temp.bin
        endef
endif
ifeq "$(CPU)" "arm"
        ifeq "$(TOOLVER)" "211"
                ASM := armasm
                LINK := armlink
                SRCEXT := s
                INCEXT := inc
                OBJEXT := o
                EXEEXT := in
                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),-predefine "$(macro) SETL {TRUE}")
                AFLAGS := $(ASM_ARM211_VARIANTFLAGS) -apcs 3/32bit/nosw -Length 0 -Width 200 $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
                LFLAGS := -Base $(LINKBASE) -Data 0xf0000000 -Entry $(LINKBASE) -Bin -map
                SYMOPT := -symbols
                ASMTYP := ARMASM
                LINKFILE :=
                define do_asm
                        $(ASM) $(AFLAGS) -o $@ -LIST $(join $(basename $@),.lst) $<
                endef
                define do_link
                        $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
                endef
                define do_strip
                        @if exist $@ $(ERASE) $(call slash2generic,$@) 
                        $(COPY) $< $@
                endef
        endif
        ifeq "$(TOOLVER)" "RVCT"
                ASM_MACROS += USE_CXSF
                ASM := armasm
                LINK := armlink
                FROMELF := fromelf
                SRCEXT := s
                INCEXT := inc
                OBJEXT := o
                EXEEXT := in
                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
                AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(ASM_RVCT_VARIANTFLAGS)
                LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
                SYMOPT := $(OP)symdefs
                ASMTYP := ARMASM
                LINKFILE :=
                define do_asm
                        $(ASM) $(AFLAGS) -o $@ $(OP)LIST $(join $(basename $@),.lst) $<
                endef
                define do_link
                        $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
                        $(COPY) $@ $(join $(basename $(TRG)),.sym)
                endef
                define do_strip
                        $(FROMELF) $(OP)bin $(OP)output $@ $<
                endef
        endif
        ifeq "$(TOOLVER)" "GCC"
                ASM_MACROS += USE_CXSF GNU_ASM
                ASM := as
                LINK := ld
                STRIP := strip
                SRCEXT := s
                INCEXT := ginc
                OBJEXT := o
                EXEEXT := in
                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--defsym $(macro)=1 )
                AFLAGS := -mapcs-32 -R -n $(ASM_MACRO_CMD) -I- $(ASMINCPATHCMD)
                LFLAGS := -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
                SYMOPT := -symdefs
                ASMTYP := AS
                PROCESS_INCLUDES := 1
                ifndef LINKFILE
                        LINKFILE := bootstrap.lnk
                endif
                define do_asm
                        perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.ss)
                        $(ASM) $(AFLAGS) -acdhlms=$(join $(basename $@),.lst) -o $@ $(join $(basename $@),.ss)
                endef
                define do_link
                        if exist $(join $(basename $@),.lnk) $(ERASE) $(call slash2generic,$(join $(basename $@),.lnk)) 
                        $(COPY) $(subst /,\,$(filter %.lnk,$^)) $(join $(basename $@),.lnk)
                        $(LINK) -M -o $@ $(filter %.$(OBJEXT),$^) $(LFLAGS) --script=$(join $(basename $@),.lnk) >$(join $(basename $@),.map)
                endef
                define do_strip
                        $(STRIP) -O binary -o $(TEMPTRG) $<
                        $(COPY) $(TEMPTRG) $@
                        $(ERASE) $(call slash2generic,$(TEMPTRG)) 
                endef
        endif
        ifeq "$(TOOLVER)" "GCCE"
                ASM_MACROS += USE_CXSF GNU_ASM
                ASM := $(GCCEASM)
				ASM_LIST_OPTS := -acdhlms
                LINK := $(GCCELD)
                STRIP := $(GCCESTRIP)
                SRCEXT := s
                INCEXT := ginc
                OBJEXT := o
                EXEEXT := in
                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--defsym $(macro)=1 )
				AFLAGS := -g --keep-locals $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
				LFLAGS := -Ttext $(LINKBASE) --entry $(LINKBASE) --print-map
                ASMTYP := AS
                PROCESS_INCLUDES := 1
                ifndef LINKFILE
                        LINKFILE := bootstrap.lnk
                endif
                define do_asm
                        perl $(EPOCROOT)/epoc32/tools/armasm2as.pl $< $(join $(basename $@),.ss)
                        $(ASM) $(AFLAGS) -o $@ $(ASM_LIST_OPTS)=$(join $(basename $@),.lst) $(join $(basename $@),.ss)
                endef
                define do_link
                        $(call ifexistf,$(join $(basename $@),.lnk),$(ERASE) $(call slash2generic,$(join $(basename $@),.lnk)) )
                        $(COPY) $(call normalise_path,$(filter %.lnk,$^)) $(join $(basename $@),.lnk)
                        $(LINK) $(LFLAGS) -o $@ $(filter %.$(OBJEXT),$^)
                        $(COPY) $@ $(join $(basename $(TRG)),.sym)
                endef
                define do_strip
                        $(STRIP) -O binary -o $(TEMPTRG) $<
                        $(COPY) $(TEMPTRG) $@
                        $(ERASE) $(call slash2generic,$(TEMPTRG)) 
                endef
        endif
endif



# Generic source files
ifndef BASESOURCES
BASESOURCES := bootmain.s bootcpu.s bootutils.s
endif

# Path for generic source files
ifndef BASESRCPATH
BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
endif


# Generated include files
GENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
GENINCLUDES := $(GENINCLUDES) e32rom.$(INCEXT) kernboot.$(INCEXT)
GENINCLUDES := $(GENINCLUDES) bootdefs.$(INCEXT)
ifneq "$(MEMMODEL)" "direct"
GENINCLUDES := $(GENINCLUDES) mmboot.$(INCEXT)
endif

# Headers from which GENINCLUDES are generated
GENHEADERS = $(foreach inc,$(GENINCLUDES),$(basename $(inc)).h)

# Non-generated generic include files
ifndef BASEINCLUDES
BASEINCLUDES := bootcpu.inc bootmacro.inc
endif
BASEINCLUDES := $(foreach f,$(BASEINCLUDES),$(basename $(f)).$(INCEXT))
INCLUDES := $(foreach f,$(INCLUDES),$(basename $(notdir $(f))).$(INCEXT))

# Generic object files
BASEOBJECTS = $(foreach src, $(BASESOURCES), $(basename $(src)).$(OBJEXT))

# Platform specific object files
OBJECTS = $(foreach src, $(SOURCES), $(basename $(src)).$(OBJEXT))

# Object files with paths
FULLBASEOBJECTS = $(addprefix $(EPOCBLDABS)/,$(BASEOBJECTS))
FULLOBJECTS = $(addprefix $(EPOCBLDABS)/,$(OBJECTS))
LINKOBJECTS = $(FULLBASEOBJECTS) $(FULLOBJECTS)

# Generated include files with paths
FULLGENINCLUDES = $(addprefix $(EPOCBLDABS)/,$(GENINCLUDES))

# Tell make where to look for things
vpath %.h . $(EXTRA_INC_PATH) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC)
vpath %.inc . $(EXTRA_INC_PATH) $(EXTENSION_ROOT) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC) $(EPOCBLDABS)
vpath %.ginc $(EPOCBLDABS)
vpath %.$(SRCEXT) . $(EXTRA_SRC_PATH) $(EXTENSION_ROOT) $(BASESRCPATH)
vpath %.$(OBJEXT) $(EPOCBLDABS)
vpath %.lnk . $(EXTENSION_ROOT) $(EPOCCPUINC)

# How to link the object files 
$(EPOCBLDABS)/$(NAME).$(EXEEXT): $(LINKOBJECTS) $(LINKFILE) $(call pipe,$(EPOCBLDABS))
	$(do_link)

# How to strip linked object to binary
$(TRG): $(EPOCBLDABS)/$(NAME).$(EXEEXT)
	$(do_strip)

# How to assemble the source files
ifdef PROCESS_INCLUDES
FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))

$(FULLBASEINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
	perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@

$(FULLINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
	perl $(EPOCROOT)/epoc32/tools/armasm2as.pl $< $@

$(FULLBASEOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
	$(do_asm)

$(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
	$(do_asm)

else

ifeq "$(CPU)" "x86"
FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))

$(FULLBASEINCLUDES) $(FULLINCLUDES) : $(EPOCBLDABS)/%.inc : %.inc
	$(CP) $(call slash2generic,$<) $(call slash2generic,$@) 

$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(FULLINCLUDES)
	$(do_asm)

else
$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES) $(call pipe,$(EPOCBLDABS))
	$(do_asm)

endif
endif

# How to translate the .h files to .inc
$(FULLGENINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.h $(call pipe,$(EPOCBLDABS))
	perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ $(ASMTYP)


# How to make the working directories
$(EPOCBLDABS) $(EPOCTRG) :
	$(call ifnotexistd,$(call slash2generic,$@))

# Makmake targets
.PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
.PHONY : build skip

MAKMAKE :
	echo Nothing to do
	echo $(BASESRCPATH)

FREEZE :
	echo Nothing to do
	echo $(BASESRCPATH)

LIB :
	echo Nothing to do
	echo $(BASESRCPATH)

CLEANLIB :
	echo Nothing to do
	echo $(BASESRCPATH)

RESOURCE :
	echo Nothing to do
	echo $(BASESRCPATH)

FINAL :
	echo Nothing to do

BLD SAVESPACE : $(PROCEED)

RELEASABLES :
	@echo $(TRG)

CLEAN :
	-$(ERASE) $(call slash2generic,$(TRG)) 
	-$(ERASE) $(call slash2generic,$(EPOCBLDABS)/*.*) 

build: $(EPOCTRG) $(EPOCBLDABS) $(TRG)
	echo Bootstrap built for $(PLATFORM) $(CFG)

skip:
	echo Bootstrap build skipped for $(PLATFORM) $(CFG)