sbsv1/buildsystem/extension/base/bootstrap.mk
changeset 599 fa7a3cc6effd
equal deleted inserted replaced
596:9f25be3da657 599:fa7a3cc6effd
       
     1 # Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 # All rights reserved.
       
     3 # This component and the accompanying materials are made available
       
     4 # under the terms of "Eclipse Public License v1.0"
       
     5 # which accompanies this distribution, and is available
       
     6 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 #
       
     8 # Initial Contributors:
       
     9 # Nokia Corporation - initial contribution.
       
    10 #
       
    11 # Contributors:
       
    12 #
       
    13 # Description:
       
    14 #
       
    15 
       
    16 # To ensure that EPOCROOT always ends with a forward slash. 
       
    17 TMPROOT:=$(subst \,/,$(EPOCROOT))
       
    18 EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
       
    19 
       
    20 ifndef CPU
       
    21 CPU := arm
       
    22 endif
       
    23 
       
    24 ifndef LINKBASE
       
    25 LINKBASE := 0x00000000
       
    26 endif
       
    27 
       
    28 include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
       
    29 
       
    30 PROCEED:=build
       
    31 ifneq "$(PBUILDPID)" ""
       
    32         ifneq "$(CFG)" "UREL"
       
    33                 PROCEED:=skip
       
    34         endif
       
    35 endif
       
    36 
       
    37 COPY := $(call ecopy)
       
    38 
       
    39 ifeq "$(CPU)" "x86"
       
    40         ifeq "$(MEMMODEL)" "direct"
       
    41                 BLDSGL:=s
       
    42         else
       
    43                 ifeq "$(MEMMODEL)" "flexible"
       
    44                         BLDSGL:=f
       
    45                 else
       
    46                         BLDSGL:=
       
    47                 endif
       
    48         endif
       
    49         ifdef SMP
       
    50                 BLDSMP:=smp
       
    51         else
       
    52                 BLDSMP:=
       
    53         endif
       
    54         EPOCROOT:=$(subst /,\,$(EPOCROOT))
       
    55         EPOCBLDABS := $(EPOCROOT)epoc32\build\tasm$(PBUILDPID)\$(BLDSGL)$(VNAME)$(BLDSMP)
       
    56 else
       
    57         DRIVELETTER := $(shell cd 2>NUL)
       
    58         DRIVELETTER_2 := $(word 1,$(subst \, ,$(DRIVELETTER)))
       
    59         EPOCBLDABS_1 := $(subst $(TO_ROOT),,$(EPOCBLD))
       
    60         EPOCBLDABS_2 := $(subst $(DRIVELETTER_2),,$(EPOCBLDABS_1))
       
    61         
       
    62         EPOCBLDABS := $(call epocbldabs,$(DRIVELETTER_2),$(EPOCBLDABS_2))/$(NAME)
       
    63 endif
       
    64 
       
    65 EPOCINC := $(INC_PATH)
       
    66 EPOCKERNINC := $(EPOCINC)/kernel
       
    67 EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
       
    68 EPOCMMINC := $(INC_PATH)/memmodel/epoc/$(MEMMODEL)/$(CPU)
       
    69 EPOCTRG := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
       
    70 TRG := $(EPOCTRG)/$(NAME).bin
       
    71 TEMPTRG := $(EPOCBLDABS)/$(NAME).bin
       
    72 
       
    73 ifdef EXTRA_INC_PATH
       
    74 ASMINCPATH := $(EXTRA_INC_PATH)
       
    75 endif
       
    76 
       
    77 ifeq "$(CPU)" "arm"
       
    78 ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC)
       
    79 ARMASM_OUT := $(shell armasm 2>&1)
       
    80 ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
       
    81 ARMASM_OUT_6 := $(word 6,$(ARMASM_OUT))
       
    82 
       
    83 # Use GCC toolchain if no other is available
       
    84 TOOLVER := GCC
       
    85 
       
    86 RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
       
    87 ifeq "$(RVCTSTR)" "RVCT"
       
    88         TOOLVER := RVCT
       
    89         OP := --
       
    90 endif
       
    91 ifeq "$(ARMASM_OUT_6)" "2.37"
       
    92         TOOLVER := 211
       
    93 endif
       
    94 endif
       
    95 
       
    96 ifeq "$(MEMMODEL)" "direct"
       
    97 CFG_MM := CFG_MMDirect
       
    98 endif
       
    99 ifeq "$(MEMMODEL)" "moving"
       
   100 CFG_MM := CFG_MMMoving
       
   101 endif
       
   102 ifeq "$(MEMMODEL)" "multiple"
       
   103 CFG_MM := CFG_MMMultiple
       
   104 endif
       
   105 ifeq "$(MEMMODEL)" "flexible"
       
   106 CFG_MM := CFG_MMFlexible
       
   107 endif
       
   108 ifndef CFG_MM
       
   109 $(error Memory model unknown)
       
   110 endif
       
   111 
       
   112 ASM_MACROS += $(CFG_MM)
       
   113 ifdef SMP
       
   114         ASM_MACROS += SMP
       
   115 endif
       
   116 
       
   117 ifeq "$(CPU)" "x86"
       
   118         ifndef BASEINCLUDES
       
   119                 BASEINCLUDES := bootcpu.inc bootmacr.inc
       
   120         endif
       
   121         ifndef BASESOURCES
       
   122                 BASESOURCES := bootmain.asm bootcpu.asm bootutil.asm
       
   123         endif
       
   124         GENINCLUDES := $(GENINCLUDES) x86boot.h
       
   125         ASMINCPATH := . 
       
   126         ASM := tasm
       
   127         LINK := tlink
       
   128         EXE2BIN := exe2bin
       
   129         SRCEXT := asm
       
   130         INCEXT := inc
       
   131         OBJEXT := obj
       
   132         EXEEXT := exe
       
   133         
       
   134         ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join /i,$(call slash2generic,$(dir))))   
       
   135         ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),/d$(macro)=1)
       
   136         AFLAGS := /l /m3 /ML /W-PDC $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
       
   137         LFLAGS := /m /s /n /3 /c
       
   138         ASMTYP := TASM
       
   139         LINKFILE :=
       
   140         define do_asm
       
   141                 cd $(EPOCBLDABS) && $(CP) $(call slash2generic,$<) .
       
   142                 cd $(EPOCBLDABS) && $(ASM) $(AFLAGS) $(notdir $<)
       
   143         endef
       
   144         define do_link
       
   145                 cd $(EPOCBLDABS) && $(LINK) $(LFLAGS) $(filter %.$(OBJEXT),$(foreach obj,$^,$(notdir $(obj)))), temp.exe
       
   146                 cd $(EPOCBLDABS) && $(COPY) temp.exe $@
       
   147                 cd $(EPOCBLDABS) && $(ERASE) temp.exe
       
   148         endef
       
   149         define do_strip
       
   150                 cd $(EPOCBLDABS) && $(COPY) $< temp.exe
       
   151                 cd $(EPOCBLDABS) && $(EXE2BIN) temp.exe temp.bin
       
   152                 cd $(EPOCBLDABS) && $(COPY) temp.bin $@
       
   153                 cd $(EPOCBLDABS) && $(ERASE) temp.exe temp.bin
       
   154         endef
       
   155 endif
       
   156 ifeq "$(CPU)" "arm"
       
   157         ifeq "$(TOOLVER)" "211"
       
   158                 ASM := armasm
       
   159                 LINK := armlink
       
   160                 SRCEXT := s
       
   161                 INCEXT := inc
       
   162                 OBJEXT := o
       
   163                 EXEEXT := in
       
   164                 ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
       
   165                 ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),-predefine "$(macro) SETL {TRUE}")
       
   166                 AFLAGS := $(ASM_ARM211_VARIANTFLAGS) -apcs 3/32bit/nosw -Length 0 -Width 200 $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
       
   167                 LFLAGS := -Base $(LINKBASE) -Data 0xf0000000 -Entry $(LINKBASE) -Bin -map
       
   168                 SYMOPT := -symbols
       
   169                 ASMTYP := ARMASM
       
   170                 LINKFILE :=
       
   171                 define do_asm
       
   172                         $(ASM) $(AFLAGS) -o $@ -LIST $(join $(basename $@),.lst) $<
       
   173                 endef
       
   174                 define do_link
       
   175                         $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
       
   176                 endef
       
   177                 define do_strip
       
   178                         @if exist $@ $(ERASE) $(call slash2generic,$@) 
       
   179                         $(COPY) $< $@
       
   180                 endef
       
   181         endif
       
   182         ifeq "$(TOOLVER)" "RVCT"
       
   183                 ASM_MACROS += USE_CXSF
       
   184                 ASM := armasm
       
   185                 LINK := armlink
       
   186                 FROMELF := fromelf
       
   187                 SRCEXT := s
       
   188                 INCEXT := inc
       
   189                 OBJEXT := o
       
   190                 EXEEXT := in
       
   191                 ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
       
   192                 ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
       
   193                 AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(ASM_RVCT_VARIANTFLAGS)
       
   194                 LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
       
   195                 SYMOPT := $(OP)symdefs
       
   196                 ASMTYP := ARMASM
       
   197                 LINKFILE :=
       
   198                 define do_asm
       
   199                         $(ASM) $(AFLAGS) -o $@ $(OP)LIST $(join $(basename $@),.lst) $<
       
   200                 endef
       
   201                 define do_link
       
   202                         $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
       
   203                         $(COPY) $@ $(join $(basename $(TRG)),.sym)
       
   204                 endef
       
   205                 define do_strip
       
   206                         $(FROMELF) $(OP)bin $(OP)output $@ $<
       
   207                 endef
       
   208         endif
       
   209         ifeq "$(TOOLVER)" "GCC"
       
   210                 ASM_MACROS += USE_CXSF GNU_ASM
       
   211                 ASM := as
       
   212                 LINK := ld
       
   213                 STRIP := strip
       
   214                 SRCEXT := s
       
   215                 INCEXT := ginc
       
   216                 OBJEXT := o
       
   217                 EXEEXT := in
       
   218                 ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
       
   219                 ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--defsym $(macro)=1 )
       
   220                 AFLAGS := -mapcs-32 -R -n $(ASM_MACRO_CMD) -I- $(ASMINCPATHCMD)
       
   221                 LFLAGS := -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
       
   222                 SYMOPT := -symdefs
       
   223                 ASMTYP := AS
       
   224                 PROCESS_INCLUDES := 1
       
   225                 ifndef LINKFILE
       
   226                         LINKFILE := bootstrap.lnk
       
   227                 endif
       
   228                 define do_asm
       
   229                         perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.ss)
       
   230                         $(ASM) $(AFLAGS) -acdhlms=$(join $(basename $@),.lst) -o $@ $(join $(basename $@),.ss)
       
   231                 endef
       
   232                 define do_link
       
   233                         if exist $(join $(basename $@),.lnk) $(ERASE) $(call slash2generic,$(join $(basename $@),.lnk)) 
       
   234                         $(COPY) $(subst /,\,$(filter %.lnk,$^)) $(join $(basename $@),.lnk)
       
   235                         $(LINK) -M -o $@ $(filter %.$(OBJEXT),$^) $(LFLAGS) --script=$(join $(basename $@),.lnk) >$(join $(basename $@),.map)
       
   236                 endef
       
   237                 define do_strip
       
   238                         $(STRIP) -O binary -o $(TEMPTRG) $<
       
   239                         $(COPY) $(TEMPTRG) $@
       
   240                         $(ERASE) $(call slash2generic,$(TEMPTRG)) 
       
   241                 endef
       
   242         endif
       
   243 endif
       
   244 
       
   245 
       
   246 
       
   247 # Generic source files
       
   248 ifndef BASESOURCES
       
   249 BASESOURCES := bootmain.s bootcpu.s bootutils.s
       
   250 endif
       
   251 
       
   252 # Path for generic source files
       
   253 ifndef BASESRCPATH
       
   254 BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
       
   255 endif
       
   256 
       
   257 
       
   258 # Generated include files
       
   259 GENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
       
   260 GENINCLUDES := $(GENINCLUDES) e32rom.$(INCEXT) kernboot.$(INCEXT)
       
   261 GENINCLUDES := $(GENINCLUDES) bootdefs.$(INCEXT)
       
   262 ifneq "$(MEMMODEL)" "direct"
       
   263 GENINCLUDES := $(GENINCLUDES) mmboot.$(INCEXT)
       
   264 endif
       
   265 
       
   266 # Headers from which GENINCLUDES are generated
       
   267 GENHEADERS = $(foreach inc,$(GENINCLUDES),$(basename $(inc)).h)
       
   268 
       
   269 # Non-generated generic include files
       
   270 ifndef BASEINCLUDES
       
   271 BASEINCLUDES := bootcpu.inc bootmacro.inc
       
   272 endif
       
   273 BASEINCLUDES := $(foreach f,$(BASEINCLUDES),$(basename $(f)).$(INCEXT))
       
   274 INCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
       
   275 
       
   276 # Generic object files
       
   277 BASEOBJECTS = $(foreach src, $(BASESOURCES), $(basename $(src)).$(OBJEXT))
       
   278 
       
   279 # Platform specific object files
       
   280 OBJECTS = $(foreach src, $(SOURCES), $(basename $(src)).$(OBJEXT))
       
   281 
       
   282 # Object files with paths
       
   283 FULLBASEOBJECTS = $(addprefix $(EPOCBLDABS)/,$(BASEOBJECTS))
       
   284 FULLOBJECTS = $(addprefix $(EPOCBLDABS)/,$(OBJECTS))
       
   285 LINKOBJECTS = $(FULLBASEOBJECTS) $(FULLOBJECTS)
       
   286 
       
   287 # Generated include files with paths
       
   288 FULLGENINCLUDES = $(addprefix $(EPOCBLDABS)/,$(GENINCLUDES))
       
   289 
       
   290 # Tell make where to look for things
       
   291 vpath %.h . $(EXTRA_INC_PATH) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC)
       
   292 vpath %.inc . $(EXTRA_INC_PATH) $(EXTENSION_ROOT) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC) $(EPOCBLDABS)
       
   293 vpath %.ginc $(EPOCBLDABS)
       
   294 vpath %.$(SRCEXT) . $(EXTRA_SRC_PATH) $(EXTENSION_ROOT) $(BASESRCPATH)
       
   295 vpath %.$(OBJEXT) $(EPOCBLDABS)
       
   296 vpath %.lnk . $(EXTENSION_ROOT) $(EPOCCPUINC)
       
   297 
       
   298 # How to link the object files 
       
   299 $(EPOCBLDABS)/$(NAME).$(EXEEXT): $(LINKOBJECTS) $(LINKFILE) $(call pipe,$(EPOCBLDABS)) 
       
   300 	$(do_link)
       
   301 
       
   302 # How to strip linked object to binary
       
   303 $(TRG): $(EPOCBLDABS)/$(NAME).$(EXEEXT)
       
   304 	$(do_strip)
       
   305 
       
   306 # How to assemble the source files
       
   307 ifdef PROCESS_INCLUDES
       
   308 FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
       
   309 FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
       
   310 
       
   311 $(FULLBASEINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
       
   312 	perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
       
   313 
       
   314 $(FULLINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
       
   315 	perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
       
   316 
       
   317 $(FULLBASEOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
       
   318 	$(do_asm)
       
   319 
       
   320 $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
       
   321 	$(do_asm)
       
   322 
       
   323 else
       
   324 
       
   325 ifeq "$(CPU)" "x86"
       
   326 FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
       
   327 FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
       
   328 
       
   329 $(FULLBASEINCLUDES) $(FULLINCLUDES) : $(EPOCBLDABS)/%.inc : %.inc
       
   330 	$(CP) $(call slash2generic,$<) $(call slash2generic,$@) 
       
   331 
       
   332 $(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(FULLINCLUDES)
       
   333 	$(do_asm)
       
   334 
       
   335 else
       
   336 $(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES) $(call pipe,$(EPOCBLDABS))
       
   337 	$(do_asm)
       
   338 
       
   339 endif
       
   340 endif
       
   341 
       
   342 # How to translate the .h files to .inc
       
   343 $(FULLGENINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.h $(call pipe,$(EPOCBLDABS))
       
   344 	perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ $(ASMTYP)
       
   345 
       
   346 
       
   347 # How to make the working directories
       
   348 $(EPOCBLDABS) $(EPOCTRG) :
       
   349 	$(call ifnotexistd,$(call slash2generic,$@))
       
   350 
       
   351 # Makmake targets
       
   352 .PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
       
   353 .PHONY : build skip
       
   354 
       
   355 MAKMAKE :
       
   356 	echo Nothing to do
       
   357 	echo $(BASESRCPATH)
       
   358 
       
   359 FREEZE :
       
   360 	echo Nothing to do
       
   361 	echo $(BASESRCPATH)
       
   362 
       
   363 LIB :
       
   364 	echo Nothing to do
       
   365 	echo $(BASESRCPATH)
       
   366 
       
   367 CLEANLIB :
       
   368 	echo Nothing to do
       
   369 	echo $(BASESRCPATH)
       
   370 
       
   371 RESOURCE :
       
   372 	echo Nothing to do
       
   373 	echo $(BASESRCPATH)
       
   374 
       
   375 FINAL :
       
   376 	echo Nothing to do
       
   377 
       
   378 BLD SAVESPACE : $(PROCEED)
       
   379 
       
   380 RELEASABLES :
       
   381 	@echo $(TRG)
       
   382 
       
   383 CLEAN :
       
   384 	-$(ERASE) $(call slash2generic,$(TRG)) 
       
   385 	-$(ERASE) $(call slash2generic,$(EPOCBLDABS)/*.*) 
       
   386 
       
   387 build: $(EPOCTRG) $(EPOCBLDABS) $(TRG)
       
   388 	echo Bootstrap built for $(PLATFORM) $(CFG)
       
   389 
       
   390 skip:
       
   391 	echo Bootstrap build skipped for $(PLATFORM) $(CFG)