sbsv2/raptor/lib/flm/e32abiv2.flm
changeset 625 a1925fb7753a
parent 616 24e4ef208cca
child 630 31ef8a13d4f4
equal deleted inserted replaced
624:f70b728ea30c 625:a1925fb7753a
     9 # Nokia Corporation - initial contribution.
     9 # Nokia Corporation - initial contribution.
    10 #
    10 #
    11 # Contributors:
    11 # Contributors:
    12 #
    12 #
    13 # Description:
    13 # Description:
    14 # ARMv5 EXE/DLL ABIv2 Function Like Makefile (FLM)
    14 # E32 EXE/DLL ABIv2 Function Like Makefile (FLM)
    15 # Knows how to build all possible ABIV2 executables for ARM
    15 # Knows how to build all possible ABIV2 executables for ARM
    16 #
    16 #
    17 #
    17 #
    18 
    18 
    19 # Feature/Binary Variation
    19 # Feature/Binary Variation
    78 INTERMEDIATE_PLATFORM_PATH:=$(OUTPUTPATH)/$(VARIANTPLATFORM)
    78 INTERMEDIATE_PLATFORM_PATH:=$(OUTPUTPATH)/$(VARIANTPLATFORM)
    79 TRACE_MARKER_PATH:=$(OUTPUTPATH)
    79 TRACE_MARKER_PATH:=$(OUTPUTPATH)
    80 IMPORTLIBPATH:=$(RUNTIME_LIBS_PATH)
    80 IMPORTLIBPATH:=$(RUNTIME_LIBS_PATH)
    81 
    81 
    82 # LOCALLY USED VARIABLES
    82 # LOCALLY USED VARIABLES
       
    83 ADDITIONAL_LIBS:=
    83 CLEANTARGETS:=
    84 CLEANTARGETS:=
    84 WHATRELEASE:=
    85 WHATRELEASE:=
       
    86 
       
    87 LIBRARIES:=$(patsubst %.dso,%.$(IMPLIB_EXTENSION),$(LIBRARY))
       
    88 LIBRARIES_DEBUG:=$(patsubst %.dso,%.$(IMPLIB_EXTENSION),$(LIBRARY_DEBUG))
    85 
    89 
    86 # Work out which new/delete library to use for binaries.
    90 # Work out which new/delete library to use for binaries.
    87 CHECKLIB_TYPE:=symc++
    91 CHECKLIB_TYPE:=symc++
    88 STDCPPTAGFILE:=
    92 STDCPPTAGFILE:=
    89 ifeq ($(NOSTDCPP),1)
    93 ifeq ($(NOSTDCPP),1)
   162 
   166 
   163   # ABIv2 .dso
   167   # ABIv2 .dso
   164   IMPORTLIBTARGET_DSO:=
   168   IMPORTLIBTARGET_DSO:=
   165   IMPORTLIBTARGETVERSIONED_DSO:=
   169   IMPORTLIBTARGETVERSIONED_DSO:=
   166 
   170 
   167   BUILDMARKER_IMPORTLIBTARGET_DSO:=TARGET_$(subst :,,$(VER_E32IMPORTLIBBASE)).dso
   171   BUILDMARKER_IMPORTLIBTARGET_DSO:=TARGET_$(subst :,,$(VER_E32IMPORTLIBBASE)).$(IMPLIB_EXTENSION)
   168   WHATRELEASE:=$(WHATRELEASE) $(if $(EXPLICITVERSION),,$(TMP_IMPORTLIBTARGET_ROOT).dso)
   172   WHATRELEASE:=$(WHATRELEASE) $(if $(EXPLICITVERSION),,$(TMP_IMPORTLIBTARGET_ROOT).$(IMPLIB_EXTENSION))
   169   WHATRELEASE:=$(WHATRELEASE) $(VER_E32IMPORTLIBBASE).dso
   173   WHATRELEASE:=$(WHATRELEASE) $(VER_E32IMPORTLIBBASE).$(IMPLIB_EXTENSION)
   170   ifeq ($($(BUILDMARKER_IMPORTLIBTARGET_DSO)),)
   174   ifeq ($($(BUILDMARKER_IMPORTLIBTARGET_DSO)),)
   171     IMPORTLIBTARGET_DSO:=$(TMP_IMPORTLIBTARGET_ROOT).dso
   175     IMPORTLIBTARGET_DSO:=$(TMP_IMPORTLIBTARGET_ROOT).$(IMPLIB_EXTENSION)
   172     IMPORTLIBTARGETVERSIONED_DSO:=$(VER_E32IMPORTLIBBASE).dso
   176     IMPORTLIBTARGETVERSIONED_DSO:=$(VER_E32IMPORTLIBBASE).$(IMPLIB_EXTENSION)
   173   endif
   177   endif
   174 
   178 
   175   # ABIv1 .lib (for specific kits and toolchains only)
   179   # ABIv1 .lib (for specific kits and toolchains only)
   176   IMPORTLIBTARGET_LIB:=
   180   IMPORTLIBTARGET_LIB:=
   177   IMPORTLIBTARGETVERSIONED_LIB:=
   181   IMPORTLIBTARGETVERSIONED_LIB:=
   245 ifneq ($(findstring .,$(TARGET)),)
   249 ifneq ($(findstring .,$(TARGET)),)
   246 	DSODEFFILENAMEBASE:=$(E32SOME){$(VERSIONHEX)}.$(E32VAR2)
   250 	DSODEFFILENAMEBASE:=$(E32SOME){$(VERSIONHEX)}.$(E32VAR2)
   247 else
   251 else
   248 	DSODEFFILENAMEBASE:=$(TARGET){$(VERSIONHEX)}
   252 	DSODEFFILENAMEBASE:=$(TARGET){$(VERSIONHEX)}
   249 endif
   253 endif
   250 GENERATED_DSO:=$(call dblquote,$(INTERMEDIATEPATH)/$(DSODEFFILENAMEBASE).dso)
   254 GENERATED_DSO:=$(call dblquote,$(INTERMEDIATEPATH)/$(DSODEFFILENAMEBASE).$(IMPLIB_EXTENSION))
   251 GENERATED_DEFFILE:=$(INTERMEDIATEPATH)/$(DSODEFFILENAMEBASE).def
   255 GENERATED_DEFFILE:=$(INTERMEDIATEPATH)/$(DSODEFFILENAMEBASE).def
   252 
   256 
   253 ## IMPORT LIBRARY  ###########################################################
   257 ## IMPORT LIBRARY  ###########################################################
   254 
   258 
   255 # Static libraries will be postlinked when they are used so don't try to postlink them
   259 # Static libraries will be postlinked when they are used so don't try to postlink them
       
   260 ifeq ($(e32importlib_mk),)
       
   261   e32importlib_mk:=1
       
   262   include $(FLMHOME)/e32importlib.mk
       
   263 endif
   256 
   264 
   257 ifneq ($(IMPORTLIBRARYREQUIRED),)
   265 ifneq ($(IMPORTLIBRARYREQUIRED),)
   258 ifneq ($(or $(DEFFILE),$(EXPORTUNFROZEN)),)
   266 ifneq ($(or $(DEFFILE),$(EXPORTUNFROZEN)),)
   259 # Both ABIv2 .dso and ABIv1 .lib import library generation require a processed .def file,
   267 # Both ABIv2 .dso and ABIv1 .lib import library generation require a processed .def file,
   260 # unless EXPORTUNFROZEN is being used
   268 # unless EXPORTUNFROZEN is being used
   261 PREPPEDDEFFILE:=
   269 PREPPEDDEFFILE:=
   262 ifneq ($(DEFFILE),)
   270 ifneq ($(DEFFILE),)
   263   ifeq ($(EXPORTUNFROZEN),)
   271   ifeq ($(EXPORTUNFROZEN),)
   264     PREPPEDDEFFILE:=$(INTERMEDIATEPATH)/$(TARGET).prep
   272     PREPPEDDEFFILE:=$(INTERMEDIATEPATH)/$(TARGET).prep
   265     CLEANTARGETS:=$(CLEANTARGETS) $(PREPPEDDEFFILE)
   273     CLEANTARGETS:=$(CLEANTARGETS) $(PREPPEDDEFFILE)
   266     define importlibtarget_prepfile
   274     $(eval $(importlibtarget_prepfile_$(BASE_ARCH)))
   267       $(PREPPEDDEFFILE): $(DEFFILE)
       
   268 		$(call startrule,importlibtarget_prepfile,FORCESUCCESS) \
       
   269 		$(PREPDEF) $(call dblquote,$(DEFFILE)) $(call dblquote,$(PREPPEDDEFFILE)) \
       
   270 		$(call endrule,importlibtarget_prepfile)
       
   271     endef
       
   272     $(eval $(importlibtarget_prepfile))
       
   273   endif
   275   endif
   274 endif
   276 endif
   275 
   277 
   276 # ABIv2 .dso
   278 # ABIv2 .dso
   277 ifneq ($(IMPORTLIBTARGET_DSO),) # check that we haven't tried to specify this target already
   279 ifneq ($(IMPORTLIBTARGET_DSO),) # check that we haven't tried to specify this target already
   296     $(ALLTARGET):: $(IMPORTLIBTARGETVERSIONED_DSO) $(IMPORTLIBTARGET_DSO)
   298     $(ALLTARGET):: $(IMPORTLIBTARGETVERSIONED_DSO) $(IMPORTLIBTARGET_DSO)
   297     TARGET:: $(IMPORTLIBTARGETVERSIONED_DSO) $(IMPORTLIBTARGET_DSO)
   299     TARGET:: $(IMPORTLIBTARGETVERSIONED_DSO) $(IMPORTLIBTARGET_DSO)
   298 
   300 
   299 
   301 
   300   endif
   302   endif
   301 
       
   302 
       
   303 
   303 
   304   ifneq ($(EXPORTUNFROZEN),) # Unfrozen  - warn and create .dso as side-effect of the final postlink
   304   ifneq ($(EXPORTUNFROZEN),) # Unfrozen  - warn and create .dso as side-effect of the final postlink
   305     $(info <warning project='$(PROJECT_META)' component='$(COMPONENT_META)'>EXPORTUNFROZEN present in $(PROJECT_META) - unfrozen exports will be represented in import library.</warning> )
   305     $(info <warning project='$(PROJECT_META)' component='$(COMPONENT_META)'>EXPORTUNFROZEN present in $(PROJECT_META) - unfrozen exports will be represented in import library.</warning> )
   306     define importlibtarget_unfrozen
   306     define importlibtarget_unfrozen
   307       $(IMPORTLIBTARGET_DSO): $(IMPORTLIBTARGETVERSIONED_DSO)
   307       $(IMPORTLIBTARGET_DSO): $(IMPORTLIBTARGETVERSIONED_DSO)
   337           # Generate the general dso if we aren't
   337           # Generate the general dso if we aren't
   338           # being asked to make just the specific version.
   338           # being asked to make just the specific version.
   339           $(eval $(importlibtarget_func))
   339           $(eval $(importlibtarget_func))
   340       endif
   340       endif
   341 
   341 
   342       define importlibtargetversioned_func
   342       $(eval $(importlibtargetversioned_$(BASE_ARCH)))
   343         $(IMPORTLIBTARGETVERSIONED_DSO): $(ELF2E32) $(PREPPEDDEFFILE)
       
   344 	      $(call startrule,importlibversioned,FORCESUCCESS) \
       
   345 	      $(ELF2E32) --sid=0x$(if $(SID),$(SID),$(if $(UID3),$(UID3),0))  --version=$(VERSION)  	   \
       
   346 	 	  --definput="$(PREPPEDDEFFILE)" 				   \
       
   347 	 	  --dso=$$(call dblquote,$$@) 				   \
       
   348 	 	  --linkas=$(call dblquote,$(LINKASVERSIONED)) \
       
   349 	      $(call endrule,importlibversioned)
       
   350       endef
       
   351       $(eval $(importlibtargetversioned_func))
       
   352     endif #  ifneq ($(DEFFILE),)
   343     endif #  ifneq ($(DEFFILE),)
   353   endif #  ifneq ($(EXPORTUNFROZEN),)
   344   endif #  ifneq ($(EXPORTUNFROZEN),)
   354 endif #  ifneq ($(IMPORTLIBTARGET_DSO),)
   345 endif #  ifneq ($(IMPORTLIBTARGET_DSO),)
   355 
   346 
   356 # ABIv1 .lib
   347 # ABIv1 .lib
   443 TARGET_$(EXPTARGET):=1
   434 TARGET_$(EXPTARGET):=1
   444 
   435 
   445 EXPTARGETASMFILE:=$(INTERMEDIATE_PLATFORM_PATH)/$(notdir $(VER_E32IMPORTLIBBASE)).s
   436 EXPTARGETASMFILE:=$(INTERMEDIATE_PLATFORM_PATH)/$(notdir $(VER_E32IMPORTLIBBASE)).s
   446 
   437 
   447 define e32expgen_func
   438 define e32expgen_func
   448 $(EXPTARGET): $(DEFFILE) $(ELF2E32)
   439 $(EXPTARGET): $(DEFFILE) $(POSTLINKER)
   449 	$(call startrule,expgen) \
   440 	$(call startrule,expgen) \
   450 	$(ELF2E32) \
   441 	$(POSTLINKER) \
   451 	   --definput=$$(call dblquote,$(DEFFILE)) \
   442 	   --definput=$$(call dblquote,$(DEFFILE)) \
   452 	   --dump=a \
   443 	   --dump=a $(if $(POSTLINKER_SUPPORTS_ASMTYPE),$(POSTLINKER_ASM_OPTION),) \
   453 	   --output=$(call dblquote,$(EXPTARGETASMFILE)) && \
   444 	   --output=$(call dblquote,$(EXPTARGETASMFILE)) && \
   454 	$(ASM) $(TARGET_ARCH_OPTION) $(AAPCS_OPTION) $(ASM_OUTPUT_OPTION) $$(call dblquote, $$@) $(EXPTARGETASMFILE) \
   445 	$(ASM) $(TARGET_ARCH_OPTION) $(AAPCS_OPTION) $(ASM_OUTPUT_OPTION) $$(call dblquote, $$@) $(EXPTARGETASMFILE) \
   455 	$(call endrule,expgen)
   446 	$(call endrule,expgen)
   456 endef
   447 endef
   457 
   448 
   571 $(ARTARGET): $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT),$(LINKOBJECTS)) $(STDCPPTAGFILE)
   562 $(ARTARGET): $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT),$(LINKOBJECTS)) $(STDCPPTAGFILE)
   572 	$(if $(MULTIFILE_ENABLED),,@echo "$(STDCPPTAGFILE)" > $(VIAFILE);
   563 	$(if $(MULTIFILE_ENABLED),,@echo "$(STDCPPTAGFILE)" > $(VIAFILE);
   573 	$(call groupin10,$(LINKOBJECTS)) ;)
   564 	$(call groupin10,$(LINKOBJECTS)) ;)
   574 	$(call startrule,ar,FORCESUCCESS) \
   565 	$(call startrule,ar,FORCESUCCESS) \
   575 	$$(call dblquote,$(AR)) $(ARCHIVER_CREATE_OPTION) $$@ $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT),$(COMMANDFILE_OPTION)$(VIAFILE)) \
   566 	$$(call dblquote,$(AR)) $(ARCHIVER_CREATE_OPTION) $$@ $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT),$(COMMANDFILE_OPTION)$(VIAFILE)) \
   576 	$(if $(DUMPBCINFO),&& $(FROMELF) -v $$@  > $$@.elfdump,)  \
       
   577 	$(call endrule,ar)
   567 	$(call endrule,ar)
   578 endef
   568 endef
   579 $(eval $(artarget_func))
   569 $(eval $(artarget_func))
   580 
   570 
   581 CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) $(if $(DUMPBCINFO),$(ARTARGET).elfdump,)
   571 CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE)
   582 endif
   572 endif
   583 
   573 
   584 
   574 
   585 
   575 
   586 # Targettype is some type of DLL or EXE (or derivative)
   576 # Targettype is some type of DLL or EXE (or derivative)
   597 ifneq ($(findstring $(TARGET).dso,$(RUNTIME_LIBS_LIST)),)
   587 ifneq ($(findstring $(TARGET).dso,$(RUNTIME_LIBS_LIST)),)
   598 # (almost) ARM RUNTIME LIBS
   588 # (almost) ARM RUNTIME LIBS
   599 REDUCED_RUNTIME_LIBS_LIST:=$(subst $(TARGET).dso,,$(RUNTIME_LIBS_LIST))
   589 REDUCED_RUNTIME_LIBS_LIST:=$(subst $(TARGET).dso,,$(RUNTIME_LIBS_LIST))
   600 
   590 
   601 ifeq ($(VARIANTTYPE),udeb)
   591 ifeq ($(VARIANTTYPE),udeb)
   602   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
   592   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES_DEBUG)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
   603 else
   593 else
   604   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
   594   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES)) $(addprefix $(RUNTIME_LIBS_PATH)/,$(REDUCED_RUNTIME_LIBS_LIST)) $(located_ARMLIBS)
   605 endif
   595 endif
   606 
   596 
   607 else
   597 else
   608 # NORMAL
   598 # NORMAL
   609 #
   599 #
   610 ifeq ($(VARIANTTYPE),udeb)
   600 ifeq ($(VARIANTTYPE),udeb)
   611   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG))
   601   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES_DEBUG))
   612 else
   602 else
   613   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY))
   603   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES))
   614 endif
   604 endif
   615 ifeq ($(HAS_DEDICATED_OP_NEWDEL_LIB),1)
   605 ifeq ($(HAS_DEDICATED_OP_NEWDEL_LIB),1)
   616   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(NEWLIB))
   606   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(NEWLIB))
   617 endif
   607 endif
   618 e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(RUNTIME_LIBS_LIST)) $(addprefix $(STATIC_LIBS_PATH)/,$(STATIC_LIBS_LIST)) $(located_ARMLIBS)
   608 e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(RUNTIME_LIBS_PATH)/,$(RUNTIME_LIBS_LIST)) $(addprefix $(STATIC_LIBS_PATH)/,$(STATIC_LIBS_LIST)) $(located_ARMLIBS)
   619 
   609 
   620 endif
   610 endif
   621 else
   611 else
   622 # ARM RUNTIME LIBS
   612 # ARM RUNTIME LIBS
   623 ifeq ($(VARIANTTYPE),udeb)
   613 ifeq ($(VARIANTTYPE),udeb)
   624   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY_DEBUG)) $(located_ARMLIBS)
   614   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES_DEBUG)) $(located_ARMLIBS)
   625 else
   615 else
   626   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARY)) $(located_ARMLIBS)
   616   e32abiv2_LIBS:=$(e32abiv2_LIBS) $(addprefix $(IMPORTLIBPATH)/,$(LIBRARIES)) $(located_ARMLIBS)
   627 endif
   617 endif
   628 endif
   618 endif
   629 
   619 
   630 # NOTE: the groupin10 macro must be used before a call to the "startrule" macro
   620 # NOTE: the groupin10 macro must be used before a call to the "startrule" macro
   631 # because the code between startrule and endrule is packaged up into one
   621 # because the code between startrule and endrule is packaged up into one
   632 # commandline which would defeat the purpose of groupin10.
   622 # commandline which would defeat the purpose of groupin10.
   633 # This is undesirable because viafile generation commands appear
   623 # This is undesirable because viafile generation commands appear
   634 # outside the relevant tags but it is also unavoidable.
   624 # outside the relevant tags but it is also unavoidable.
       
   625 
       
   626 ifeq ($(e32link_mk),)
       
   627   e32link_mk:=1
       
   628   include $(FLMHOME)/e32link.mk
       
   629 endif
       
   630 
       
   631 # Some configurations inject exports into the final binary by creating a .lib.exp file that is then fed to
       
   632 # the linker.  How this .lib.exp is generated depends on whether a .def file is listed to control the build
       
   633 # or not.  Either way, the .lib.exp is guarded so as to only be generated once.
       
   634 ifneq ($(FIX_EXPORTS_USING_EXP_FILE),)
       
   635   BUILDMARKER_EXPFILE:=$(call sanitise,EXPFILE_$(TARGET).lib.exp)
       
   636   ifeq ($(DEFFILE),)
       
   637     ifneq ($(AUTOEXPORTS),)     
       
   638       ifeq ($($(BUILDMARKER_EXPFILE)),)
       
   639         $(eval $(call e32link_genlibexpfile,exports))
       
   640         $(eval $(BUILDMARKER_EXPFILE):=$(INTERMEDIATEPATH)/$(TARGET).lib.exp)
       
   641       endif
       
   642     endif
       
   643   else
       
   644     ifeq ($($(BUILDMARKER_EXPFILE)),)
       
   645       $(eval $(call e32link_genlibexpfile,deffile))
       
   646       $(eval $(BUILDMARKER_EXPFILE):=$(INTERMEDIATEPATH)/$(TARGET).lib.exp)
       
   647     endif
       
   648   endif
       
   649   ADDITIONAL_LIBS:=$($(BUILDMARKER_EXPFILE))
       
   650 endif
       
   651 
       
   652 ifeq ($(e32postlink_mk),)
       
   653   e32postlink_mk:=1
       
   654   include $(FLMHOME)/e32postlink.mk
       
   655 endif
       
   656 
   635 define linktarget_func
   657 define linktarget_func
   636 ## The actual link target, dependencies and build step
   658 ## The actual link target, dependencies and build step
   637 $(E32TARGET): $(POSTLINKDEFFILE) $(ELF2E32) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(e32abiv2_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
   659 $(E32TARGET): $(POSTLINKDEFFILE) $(POSTLINKER) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(e32abiv2_LIBS) $(ADDITIONAL_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
   638 	$(if $(MULTIFILE_ENABLED),,@echo -n "" > $(VIAFILE);
   660 	$(if $(MULTIFILE_ENABLED),,@echo -n "" > $(VIAFILE);
   639 	$(call groupin10,$(LINKOBJECTS)) ;)
   661 	$(call groupin10,$(LINKOBJECTS)) ;)
   640 	$(call startrule,linkandpostlink) \
   662 	$(call startrule,linkandpostlink) \
   641 	$(if $(PERTURBSTARTTIME),$(RANSLEEP) $(PERTURBMSECS) ;,) \
   663 	$(if $(PERTURBSTARTTIME),$(RANSLEEP) $(PERTURBMSECS) ;,) \
   642 	$(if $(SUPPORTS_STDCPP_NEWLIB),$(if $(located_STATICLIBRARIES),$(CHECKLIB) $(CHECKLIB_TYPE) --elf $(call dblquote,$(located_STATICLIBRARIES)) &&,),) \
   664 	$(if $(SUPPORTS_STDCPP_NEWLIB),$(if $(located_STATICLIBRARIES),$(CHECKLIB) $(CHECKLIB_TYPE) --elf $(call dblquote,$(located_STATICLIBRARIES)) &&,),) \
   643 	$(LD) $(LINKER_MISC_FLAGS) $(LINKER_DEFAULT_LIB_PATHS) $(SYMBIAN_LINK_FLAGS) $(if $(DEBUG_INFO),$(LINKER_DEBUG_OPTION),$(LINKER_NODEBUG_OPTION)) \
   665 	$(LD) $(LINKER_MISC_FLAGS) $(LINKER_DEFAULT_LIB_PATHS) $(SYMBIAN_LINK_FLAGS) $(if $(DEBUG_INFO),$(LINKER_DEBUG_OPTION),$(LINKER_NODEBUG_OPTION)) \
   644 	  $(if $(ARMLIBS),$(LD_WARNINGS_SUPPRESSION_ARMLIBS),) \
   666 	  $(if $(ARMLIBS),$(LD_WARNINGS_SUPPRESSION_ARMLIBS),) \
   645 	  $(SHARED_OBJECT_OPTION) $(SPLIT_OPTION) \
   667 	  $(if $(findstring EXE,$(POSTLINKTARGETTYPE)),$(if $(TREAT_EXES_AS_SHARED),$(SHARED_OBJECT_OPTION),),$(SHARED_OBJECT_OPTION)) \
       
   668 	  $(SPLIT_OPTION) \
   646 	  $(RW_BASE) \
   669 	  $(RW_BASE) \
   647 	  $(LINKER_ARCH_OPTION) \
   670 	  $(LINKER_ARCH_OPTION) \
   648 	  $(SYMVER_OPTION) $(SO_NAME_OPTION)=$(call dblquote,$(LINKASVERSIONED)) \
   671 	  $(SYMVER_OPTION) \
   649 	  $(LINKER_ENTRYPOINT_SETTING) \
   672 	  $(if $(SO_NAME_OPTION),$(SO_NAME_OPTION)=$(call dblquote,$(LINKASVERSIONED)),) \
       
   673 	  $(LINKER_ENTRY_OPTION)=$(LINKER_ENTRYPOINT_SETTING) \
       
   674 	  $(if $(NEED_ENTRYPOINT_LIBRARY),$(LINKER_ENTRYPOINT_LIBDEP),) \
       
   675 	  $(if $(ADDITIONAL_LIBS),$(call dblquote,$(ADDITIONAL_LIBS)),) \
   650 	  -o $$(call dblquote,$(LINK_TARGET)) \
   676 	  -o $$(call dblquote,$(LINK_TARGET)) \
   651 	  $(if $(LTCG),$(LTCG_OPTION),) \
   677 	  $(if $(LTCG),$(LTCG_OPTION),) \
   652 	  $(LINKER_SYMBOLS_OPTION) $(LINKER_SYMBOLS_FILE_OPTION)=$(call dblquote,$(MAPFILE)) \
   678 	  $(LINKER_SYMBOLS_OPTION) $(LINKER_SYMBOLS_FILE_OPTION)=$(call dblquote,$(MAPFILE)) \
   653   	  $(LINKEROPTION) \
   679   	  $(LINKEROPTION) \
   654 	  $(if $(MULTIFILE_ENABLED),$(call dblquote,$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS)),$(COMMANDFILE_OPTION)$(call dblquote,$(VIAFILE))) \
   680 	  $(if $(MULTIFILE_ENABLED),$(call dblquote,$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS)),$(COMMANDFILE_OPTION)$(call dblquote,$(VIAFILE))) \
   655       $(if $(GENERATELINKERFEEDBACK),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
   681       $(if $(GENERATELINKERFEEDBACK),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
   656 	  $(if $(LINKER_ADD_STATIC_RUNTIME),$(if $(STATIC_RUNTIME_LIB),$(LINKER_GROUP_START_OPTION) $(STATIC_RUNTIME_DIR)/$(STATIC_RUNTIME_LIB) $(LINKER_GROUP_END_OPTION),)) \
   682 	  $(if $(LINKER_ADD_STATIC_RUNTIME),$(if $(STATIC_RUNTIME_LIB),$(LINKER_GROUP_START_OPTION) $(STATIC_RUNTIME_DIR)/$(STATIC_RUNTIME_LIB) $(LINKER_GROUP_END_OPTION),)) \
   657 	  $(call dblquote,$(e32abiv2_LIBS)) $(LINKER_DEFAULT_LIBS) && \
   683 	  $(call dblquote,$(e32abiv2_LIBS)) $(LINKER_DEFAULT_LIBS) && \
   658 	  $(ELF2E32) \
   684 	$(call e32postlink_$(BASE_ARCH)) \
   659 	  --sid=0x$(if $(SID),$(SID),$(if $(UID3),$(UID3),0)) \
       
   660 	  --version=$(VERSION) \
       
   661 	  --capability=$(FINAL_CAPABILITIES) \
       
   662 	  --linkas=$(call dblquote,$(LINKASVERSIONED)) \
       
   663 	  --fpu=$(POSTLINKER_FPU) \
       
   664 	  --targettype=$(POSTLINKTARGETTYPE) \
       
   665 	  --output=$$(call dblquote,$$@) \
       
   666 	  --elfinput=$(call dblquote,$(LINK_TARGET)) \
       
   667 	  $(if $(UID1),--uid1=0x$(UID1),) \
       
   668 	  $(if $(UID2),--uid2=0x$(UID2),) \
       
   669 	  $(if $(UID3),--uid3=0x$(UID3),) \
       
   670 	  $(if $(VENDORID),--vid=0x$(VENDORID),) \
       
   671 	  $(if $(EXPTARGET),--customdlltarget,) \
       
   672 	  $(if $(ARMLIBS),--excludeunwantedexports,) \
       
   673 	  $(if $(EPOCALLOWDLLDATA),--dlldata,) \
       
   674 	  $(if $(EPOCPROCESSPRIORITY),--priority=$(EPOCPROCESSPRIORITY),) \
       
   675 	  $(if $(EPOCSTACKSIZE),--stack=0x$(EPOCSTACKSIZE),) \
       
   676 	  $(if $(EPOCHEAPSIZEMIN),--heap=0x$(EPOCHEAPSIZEMIN)$(CHAR_COMMA)0x$(EPOCHEAPSIZEMAX),) \
       
   677 	  $(if $(EPOCFIXEDPROCESS),--fixedaddress,) \
       
   678 	  $(if $(EPOCDATALINKADDRESS),--datalinkaddress=$(EPOCDATALINKADDRESS),) \
       
   679 	  $(if $(NAMEDSYMLKUP),--namedlookup,) \
       
   680 	  $(if $(SMPSAFE),--smpsafe,) \
       
   681 	  $(if $(POSTLINKDEFFILE),--definput=$(POSTLINKDEFFILE),) \
       
   682 	  $(if $(EXPORTUNFROZEN),--unfrozen,) \
       
   683 	  $(if $(AUTOEXPORTS),--sysdef=$(call dblquote,$(AUTOEXPORTS)),) \
       
   684 	  $(if $(CANIGNORENONCALLABLE), \
       
   685 	    $(if $(IMPORTLIBRARYREQUIRED),,--ignorenoncallable),) \
       
   686 	  $(if $(CANHAVEEXPORTS), --defoutput=$(call dblquote,$(GENERATED_DEFFILE)) --dso=$(GENERATED_DSO)) \
       
   687 	  $(if $(filter $(VARIANTTYPE),$(DEBUGGABLE)),--debuggable,) \
       
   688 	  $(if $(POSTLINKER_SUPPORTS_WDP), \
       
   689 	    --codepaging=$(PAGEDCODE_OPTION) --datapaging=$(PAGEDDATA_OPTION), \
       
   690 	    $(POSTLINKER_PAGEDOPTION)) \
       
   691 	  $(if $(NOCOMPRESSTARGET),--uncompressed, \
       
   692 	    $(if $(INFLATECOMPRESSTARGET),--compressionmethod=inflate, \
       
   693 	      $(if $(BYTEPAIRCOMPRESSTARGET),--compressionmethod=bytepair, \
       
   694 	        --compressionmethod=$(POSTLINKER_COMPRESSION_DEFAULT)))) \
       
   695 	  --libpath="$(call concat,$(PATHSEP)$(CHAR_SEMIC),$(strip $(RUNTIME_LIBS_PATH) $(STATIC_LIBS_PATH)))" \
       
   696 	  $(if $(SAVESPACE),$(if $(EXPORTUNFROZEN),,&& { $(GNURM) -rf $(INTERMEDIATEPATH); true; })) \
   685 	  $(if $(SAVESPACE),$(if $(EXPORTUNFROZEN),,&& { $(GNURM) -rf $(INTERMEDIATEPATH); true; })) \
   697 	$(call endrule,linkandpostlink)
   686 	$(call endrule,linkandpostlink)
   698 
   687 
   699 $(MAPFILE): $(E32TARGET)
   688 $(MAPFILE): $(E32TARGET)
   700 $(LINK_TARGET): $(E32TARGET)
   689 $(LINK_TARGET): $(E32TARGET)
   733 ifneq ($(USE_TRACE_COMPILER),)
   722 ifneq ($(USE_TRACE_COMPILER),)
   734   # TARGETEXT is already set
   723   # TARGETEXT is already set
   735   include $(FLMHOME)/tracecompiler.mk
   724   include $(FLMHOME)/tracecompiler.mk
   736   WHATRELEASE:=$(WHATRELEASE) $(TRACE_DICTIONARY) $(AUTOGEN_HEADER)
   725   WHATRELEASE:=$(WHATRELEASE) $(TRACE_DICTIONARY) $(AUTOGEN_HEADER)
   737 endif
   726 endif
   738 
   727 ###################################################################
       
   728 
       
   729 
       
   730 ##
   739 CC_CPPONLY_ARGS:=$(SYMBIAN_CCFLAGS) $(if $(DEBUG_INFO),-g) $(DEBUG_FORMAT) \
   731 CC_CPPONLY_ARGS:=$(SYMBIAN_CCFLAGS) $(if $(DEBUG_INFO),-g) $(DEBUG_FORMAT) \
   740   $(RUNTIME_SYMBOL_VISIBILITY_OPTION) $(EXCEPTIONS) \
   732   $(RUNTIME_SYMBOL_VISIBILITY_OPTION) $(EXCEPTIONS) \
   741   $(CC_WARNINGS_CONTROL_OPTION) $(CC_ERRORS_CONTROL_OPTION) \
   733   $(CC_WARNINGS_CONTROL_OPTION) $(CC_ERRORS_CONTROL_OPTION) \
   742   $(TARGET_ARCH_OPTION) $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) \
   734   $(TARGET_ARCH_OPTION) $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) \
   743   $(EXPORT_VTBL_OPTION) $(NO_UNALIGNED_ACCESS) $(VFE_OPTION) $(AAPCS_OPTION) \
   735   $(EXPORT_VTBL_OPTION) $(NO_UNALIGNED_ACCESS) $(VFE_OPTION) $(AAPCS_OPTION) \
   956   # that lists the current exports - FREEZE can therefore be dependent on the final post-linked binary,
   948   # that lists the current exports - FREEZE can therefore be dependent on the final post-linked binary,
   957   # with the side-effect that a build is triggered if someone tries to freeze without having built.
   949   # with the side-effect that a build is triggered if someone tries to freeze without having built.
   958   #
   950   #
   959   # However, there's one case where we don't want to be dependent on the post-linked binary in this way,
   951   # However, there's one case where we don't want to be dependent on the post-linked binary in this way,
   960   # and that's when (a) there are missing exports, (b) the user's aware of them and (c) they're deliberately freezing to
   952   # and that's when (a) there are missing exports, (b) the user's aware of them and (c) they're deliberately freezing to
   961   # remove them using EFREEZE's remove option.  Being dependent on the post-linked binary in this case, where ELF2E32
   953   # remove them using EFREEZE's remove option.  Being dependent on the post-linked binary in this case, where POSTLINKER
   962   # actually fails to generate a final binary, would mean that the freeze would never happen and post-linking would
   954   # actually fails to generate a final binary, would mean that the freeze would never happen and post-linking would
   963   # just be continually re-attempted (to fail each time).
   955   # just be continually re-attempted (to fail each time).
   964   #
   956   #
   965   # So, as a special case, if the user is explicitly attempting to freeze and perform removals, we make FREEZE dependent
   957   # So, as a special case, if the user is explicitly attempting to freeze and perform removals, we make FREEZE dependent
   966   # on the temporary .def file instead.  This has no rule to actually make it, but gives a hint as to what is wrong if
   958   # on the temporary .def file instead.  This has no rule to actually make it, but gives a hint as to what is wrong if
  1102 
  1094 
  1103 endif # ifneq ($(TARGETTYPE),implib)
  1095 endif # ifneq ($(TARGETTYPE),implib)
  1104 
  1096 
  1105 
  1097 
  1106 ########################## Build ROMFILE target ############################
  1098 ########################## Build ROMFILE target ############################
  1107 EPOC_ROOT:=$(patsubst %/,%,$(EPOCROOT))
       
  1108 TOBLDINF:=$(dir $(subst :,,$(subst $(EPOC_ROOT)/,,$(COMPONENT_META))))
       
  1109 
  1099 
  1110 # Only build ROMFILE if asked
  1100 # Only build ROMFILE if asked
  1111 ifneq ($(filter ROMFILE,$(call uppercase,$(MAKECMDGOALS))),)
  1101 ifneq ($(filter ROMFILE,$(call uppercase,$(MAKECMDGOALS))),)
  1112     ifeq ($(ROMFILE_$(call sanitise,$(TARGET).$(REQUESTEDTARGETEXT))),)
  1102   include $(FLMHOME)/romfile.mk
  1113         ROMFILE_$(call sanitise,$(TARGET).$(REQUESTEDTARGETEXT)):=1
       
  1114         ROMDIR:=$(EPOC_ROOT)/epoc32/rom/$(TOBLDINF)
       
  1115 
       
  1116         # Default values
       
  1117         ROMFILETYPE:=file
       
  1118         ROMFILE:=$(TARGET).$(REQUESTEDTARGETEXT)
       
  1119         ROMPATH:=$(if $(TARGETPATH),$(TARGETPATH)/,sys/bin/)
       
  1120         ROMDECORATIONS:=
       
  1121         ROMFILETYPE_RAM:=data
       
  1122         ROMFILE_RAM:=$(TARGET).$(REQUESTEDTARGETEXT)
       
  1123         ROMPATH_RAM:=sys/bin/
       
  1124         BUILDROMTARGET:=1
       
  1125         ABIDIR:=MAIN
       
  1126 
       
  1127         $(eval $(call DoRomSet))
       
  1128 
       
  1129         ifneq ($(EPOCFIXEDPROCESS),)
       
  1130             ROMDECORATIONS:=$(ROMDECORATIONS) fixed
       
  1131         endif
       
  1132         ifeq ($(PAGED),1)
       
  1133             ROMDECORATIONS:=$(ROMDECORATIONS) paged
       
  1134         endif
       
  1135         ifeq ($(PAGED),0)
       
  1136             ROMDECORATIONS:=$(ROMDECORATIONS) unpaged
       
  1137         endif
       
  1138 
       
  1139 
       
  1140         DATATEXT:=
       
  1141         ifeq ($(TESTCODE),TRUE)
       
  1142         	# Add 'TEST' to the .iby filename
       
  1143         	ROMTEST:=test
       
  1144             ifeq ($(TEST_OPTION),BOTH)
       
  1145                 DATATEXT:="data=/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).auto.bat test/$(MODULE).auto.bat"\n"data=/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).manual.bat test/$(MODULE).manual.bat"
       
  1146             else
       
  1147                 ifneq ($(TEST_OPTION),NONE)
       
  1148                     DATATEXT:="data=/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).$(TEST_OPTION).bat test/$(MODULE).$(TEST_OPTION).bat"
       
  1149                 endif
       
  1150             endif
       
  1151         endif
       
  1152 
       
  1153         # ROMTARGET
       
  1154         ifneq ($(ROMTARGET),)
       
  1155             ifneq ($(words $(ROMTARGET)),1)
       
  1156                 ROMTARGETALL:=$(ROMTARGET)
       
  1157                 ROMTARGET:=$(word 1,$(ROMTARGET))
       
  1158             endif
       
  1159 
       
  1160             ifeq ($(ROMTARGET),<none>)
       
  1161                 BUILDROMTARGET:=
       
  1162             else
       
  1163                 ifneq ($(ROMTARGET),+)
       
  1164                     ifneq ($(notdir $(ROMTARGET)),)
       
  1165                         ROMFILE:=$(notdir $(ROMTARGET))
       
  1166                     endif
       
  1167                     ifneq ($(dir $(ROMTARGET)),./)
       
  1168                         ROMPATH:=$(dir $(ROMTARGET))
       
  1169                     endif
       
  1170                 endif
       
  1171             endif
       
  1172         endif
       
  1173     endif
       
  1174 
       
  1175     ROMFILENAME:=$(ROMDIR)$(PLATFORM)$(ROMTEST).iby
       
  1176 
       
  1177     # RAMTARGET
       
  1178     ifneq ($(RAMTARGET),)
       
  1179         ROMDECORATIONS_RAM:=" attrib=r"
       
  1180         ifneq ($(RAMTARGET),+)
       
  1181             ifneq ($(notdir $(RAMTARGET)),)
       
  1182                 ROMFILE_RAM:=$(notdir $(RAMTARGET))
       
  1183             endif
       
  1184             ifneq ($(dir $(RAMTARGET)),./)
       
  1185                 ROMPATH_RAM:=$(dir $(RAMTARGET))
       
  1186             endif
       
  1187         endif
       
  1188     endif
       
  1189 
       
  1190     define BuildRomfileTarget
       
  1191         $(ALLTARGET)::ROMFILE
       
  1192         ROMFILE::
       
  1193 	        $(call startrule,rombuild)	\
       
  1194 	        $(GNUMKDIR) -p $(ROMDIR) \
       
  1195             $(if $(ROMFILE_CREATED_$(TOBLDINF)),,&& echo -e "// $(subst $(EPOC_ROOT)/,,$(ROMFILENAME))\n//\n$(DATATEXT)" > $(ROMFILENAME)) \
       
  1196             $(if $(BUILDROMTARGET),&& echo "$(ROMFILETYPE)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET)$(if $(EXPLICITVERSION),{$(VERSIONHEX)},).$(REQUESTEDTARGETEXT)   $(1)$(ROMDECORATIONS)" >> $(ROMFILENAME))	\
       
  1197 	        $(if $(RAMTARGET),&& echo "$(ROMFILETYPE_RAM)=/epoc32/release/##$(ABIDIR)##/##BUILD##/$(TARGET)$(if $(EXPLICITVERSION),{$(VERSIONHEX)},).$(REQUESTEDTARGETEXT)   $(ROMPATH_RAM)$(ROMFILE_RAM)$(ROMDECORATIONS_RAM)" >> $(ROMFILENAME))	\
       
  1198 	        $(call endrule,buildromfiletarget)
       
  1199     endef
       
  1200 
       
  1201     # When VARIANTTYPE changes, romfile is finished,
       
  1202     # apart from if this is a new component......
       
  1203     ifneq ($(PREVIOUSVARIANTTYPE),)
       
  1204         ifneq ($(VARIANTTYPE),$(PREVIOUSVARIANTTYPE))
       
  1205             ifneq ($(ROMFILE_CREATED_$(TOBLDINF)),)
       
  1206                 ROMFILEFINISHED:=1
       
  1207             else
       
  1208                 ROMFILEFINISHED:=
       
  1209             endif
       
  1210         endif
       
  1211     endif
       
  1212 
       
  1213     # When romfile is finished, don't continue to add to it
       
  1214     ifeq ($(ROMFILEFINISHED),)
       
  1215         $(eval $(call BuildRomfileTarget,$(ROMPATH)$(ROMFILE)))
       
  1216     endif
       
  1217 
       
  1218     # Don't allow romfile to be recreated for every MMP
       
  1219     ifeq ($(ROMFILE_CREATED_$(TOBLDINF)),)
       
  1220         ROMFILE_CREATED_$(TOBLDINF):=1
       
  1221     endif
       
  1222 
       
  1223     # Build other ROMTARGETs if there is more than one
       
  1224     ifneq ($(ROMTARGETALL),)
       
  1225         RAMTARGET:=
       
  1226         $(foreach ROMTARGET,$(wordlist 2,$(words $(ROMTARGETALL)),$(ROMTARGETALL)),$(eval $(call BuildRomfileTarget,$(ROMTARGET))))
       
  1227         ROMTARGETALL:=
       
  1228     endif
       
  1229 
       
  1230     # Keep track of variant type while romfile is being created
       
  1231     PREVIOUSVARIANTTYPE:=$(VARIANTTYPE)
       
  1232 
       
  1233     WHATRELEASE:=$(WHATRELEASE) $(ROMFILENAME)
       
  1234 endif
  1103 endif
  1235 
  1104 
  1236 # Deal with test code batch files generation.
  1105 # Deal with test code batch files generation.
  1237 ifneq ($(TESTPATH),)
  1106 ifneq ($(TESTPATH),)
  1238 
  1107