diff -r 22486c9c7b15 -r 378360dbbdba sbsv1/buildsystem/extension/base/bootstrap.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv1/buildsystem/extension/base/bootstrap.mk Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,391 @@ +# 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))/ + +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" +ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC) +ARMASM_OUT := $(shell armasm 2>&1) +ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT)) +ARMASM_OUT_6 := $(word 6,$(ARMASM_OUT)) + +# Use GCC toolchain if no other is available +TOOLVER := GCC + +RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4))) +ifeq "$(RVCTSTR)" "RVCT" + TOOLVER := RVCT + OP := -- +endif +ifeq "$(ARMASM_OUT_6)" "2.37" + TOOLVER := 211 +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 +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 $(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)