author | William Roberts <williamr@symbian.org> |
Sun, 27 Jun 2010 13:33:42 +0100 | |
branch | GCC_SURGE |
changeset 56 | 626366955efb |
parent 55 | 59148e28d9f6 |
child 57 | e69da8462916 |
permissions | -rw-r--r-- |
# 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 ifeq (linux,$(HOST_PLATFORM)) EXE_SUFFIX := else EXE_SUFFIX := .exe endif ifdef SBS_GCCE432BIN GCCEBIN := $(SBS_GCCE432BIN) else ifdef SBS_GCCE433BIN GCCEBIN := $(SBS_GCCE433BIN) else ifdef SBS_GCCE441BIN GCCEBIN := $(SBS_GCCE441BIN) 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 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) -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) $(SYMOPT)=$(join $(basename $@),.sym) -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 $(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 $< $(EPOCBLDABS)/$(notdir $@) $(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)