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)