sbsv1/buildsystem/extension/tools/x86tool.mk
changeset 599 fa7a3cc6effd
equal deleted inserted replaced
596:9f25be3da657 599:fa7a3cc6effd
       
     1 # Copyright (c) 2008-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 # /epoc32/tools/makefile_templates/tools/x86tool.mk
       
    15 # SBSv2 issues and differences from SBSv1
       
    16 # 1/ The shell is different
       
    17 # 2/ The msys shell can't handle absolute paths from root without the drive letter e.g. it can't find /epoc32 but it can find x:/epoc32
       
    18 # workaround is to go back to TO_ROOT
       
    19 # 3/ The current directory is at the bld.inf rather than /epoc32/build
       
    20 # 4/ Backslash is problematic
       
    21 # 5/ Path variables include the drive letter x: which causes problems for make when used in targets due to :
       
    22 # 6/ TO_ROOT is not defined
       
    23 # 7/ Some tool compatibility is problematic e.g. createdir doesn't work with paths containing forward slash
       
    24 # 
       
    25 #
       
    26 
       
    27 # If this environment variable is defined we're definitely building for win32
       
    28 ifdef ComSpec
       
    29 WIN32:=1
       
    30 endif
       
    31 
       
    32 space:=
       
    33 space+=
       
    34 LETTERS:=a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
       
    35 
       
    36 # If win32 isn't defined yet - then we're probably building on sbsv2
       
    37 # So see if EPOCROOT starts with a drive letter to work out if we're building for win32
       
    38 ifndef WIN32
       
    39   ifneq ($(subst $(space),,$(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),1,))),)
       
    40     WIN32:=1
       
    41   endif
       
    42 endif
       
    43 
       
    44 # To guarantee there is a slash at the end of EPOCROOT in case there is not.
       
    45 # This is needed to ensure compatibility with SBSv1.
       
    46 TMPROOT:=$(subst \,/,$(EPOCROOT))
       
    47 EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
       
    48 
       
    49 # Get standard shell definitions
       
    50 include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
       
    51 
       
    52 # Raptor includes the drive letter on paths - this makefile can't handle the drive letter
       
    53 # If we don't do this we get "multiple target patterns" errors in sbsv2
       
    54 TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),$(subst $(let):,,$(EPOCROOT)))))
       
    55 ifneq ($(TMPROOT),)
       
    56   EPOCROOT:=$(TMPROOT)
       
    57 endif
       
    58 TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EXTENSION_ROOT)),$(subst $(let):,,$(EXTENSION_ROOT)))))
       
    59 ifneq ($(TMPROOT),)
       
    60   EXTENSION_ROOT:=$(TMPROOT)
       
    61 endif
       
    62 
       
    63 # Make up for raptor not defining TO_ROOT properly
       
    64 # This might get broken if they change the current directory (which should really be in /epoc32/build)
       
    65 # We're using TO_ROOT to handle the fact that the msys shell doesn't seem to handle absolute paths
       
    66 ifdef WIN32
       
    67   ifeq ($(TO_ROOT),)
       
    68     TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(TO_BLDINF)),$(subst $(let):,,$(TO_BLDINF)))))
       
    69     TO_ROOT:=.$(subst $(space),,$(foreach word,$(subst /,$(space),$(TMPROOT)),/..))
       
    70   endif
       
    71 endif
       
    72 
       
    73 # Handle inconsistent case for build variant
       
    74 CFG_PATH:=$(CFG)
       
    75 ifeq ($(CFG_PATH),DEB)
       
    76   CFG_PATH:=deb
       
    77 endif
       
    78 ifeq ($(CFG_PATH),REL)
       
    79   CFG_PATH:=rel
       
    80 endif
       
    81 
       
    82 # Set the following to enable code coverage stats
       
    83 CODE_COVERAGE:=
       
    84 
       
    85 # Build
       
    86 ifdef WIN32
       
    87   TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/rel/
       
    88   TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/deb/
       
    89   GCOVDIR:=$(if $(CODE_COVERAGE),$(EPOCROOT)epoc32/gcc_mingw/libgcc/mingw32/3.4.5/)
       
    90 else
       
    91   TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/linux-i386/rel/
       
    92   TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/linux-i386/deb/
       
    93 endif
       
    94 
       
    95 # The root to the source code - paths are relative to bld.inf if NOT specified
       
    96 # If SOURCE_ROOT specified then it's relative to EPOCROOT
       
    97 ifndef SOURCE_ROOT
       
    98   ROOT:=$(subst \,/,$(EXTENSION_ROOT))
       
    99   OBJSUBST:=/
       
   100 else
       
   101   ROOT:=$(EPOCROOT)$(subst $(space)/,/,$(SOURCE_ROOT))
       
   102   OBJSUBST:=$(EPOCROOT)
       
   103 endif
       
   104 
       
   105 # ***
       
   106 # STATIC LIBRARY
       
   107 #
       
   108 ifeq ($(TARGET_TYPE),lib)
       
   109   TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
       
   110   TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
       
   111 
       
   112   ifeq ($(CFG_PATH),deb)
       
   113     TARGET_LIB:=$(TARGET_FULLNAME_DEB)
       
   114   endif
       
   115   ifeq ($(CFG_PATH),rel)
       
   116     TARGET_LIB:=$(TARGET_FULLNAME_REL)
       
   117   endif
       
   118   TARGET_LIB?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
       
   119 endif
       
   120 
       
   121 # ***
       
   122 # EXE
       
   123 #
       
   124 ifeq ($(TARGET_TYPE),exe)
       
   125   TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
       
   126   TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
       
   127 
       
   128   ifeq ($(CFG_PATH),deb)
       
   129     TARGET_BLD:=$(TARGET_FULLNAME_DEB)
       
   130   endif
       
   131   ifeq ($(CFG_PATH),rel)
       
   132     TARGET_BLD:=$(TARGET_FULLNAME_REL)
       
   133   endif
       
   134   TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
       
   135 
       
   136   LIBS+=symexestub
       
   137   ifdef STLPORT
       
   138     LIBS+=-lstlport.5.1
       
   139   endif
       
   140 endif
       
   141 
       
   142 # ***
       
   143 # DLL/SO
       
   144 #
       
   145 ifeq ($(TARGET_TYPE),dll)
       
   146 
       
   147   TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
       
   148   TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
       
   149 
       
   150   ifeq ($(CFG_PATH),deb)
       
   151     TARGET_BLD:=$(TARGET_FULLNAME_DEB)
       
   152   endif
       
   153   ifeq ($(CFG_PATH),rel)
       
   154     TARGET_BLD:=$(TARGET_FULLNAME_REL)
       
   155   endif
       
   156   TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
       
   157 
       
   158   ifdef STLPORT
       
   159     LIBS+=-lstlport.5.1
       
   160   endif
       
   161 endif
       
   162 
       
   163 # Pick up MINGW compiler from epoc32 on Windows
       
   164 ifdef WIN32
       
   165   AR:=$(EPOCROOT)epoc32/gcc_mingw/bin/ar
       
   166   CXX:=$(EPOCROOT)epoc32/gcc_mingw/bin/g++
       
   167 endif
       
   168 
       
   169 # Product include files are different for S60
       
   170 ifdef S60_BUILD
       
   171   PRODUCT_INCLUDE:=$(EPOCROOT)epoc32/include/oem/bldvariant.hrh
       
   172 else
       
   173   PRODUCT_INCLUDE:=$(EPOCROOT)epoc32/include/variant/Symbian_OS.hrh
       
   174 endif
       
   175 
       
   176 # Define macros we need
       
   177 CXXDEFS_COMMON:=$(foreach def,$(MACROS),-D$(def)) -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__X86__ -D_UNICODE -D__SUPPORT_CPP_EXCEPTIONS__ -D__TOOLS2__ -D'__PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)"'
       
   178 CXXDEFS_DEB:=$(CXXDEFS_COMMON) -D_DEBUG
       
   179 CXXDEFS_REL:=$(CXXDEFS_COMMON)
       
   180 
       
   181 # Setup the command line options for the compiler
       
   182 PREINC=$(EPOCROOT)epoc32/include/x86tool/x86tool.h
       
   183 CXXOPT_DEB:=-fshort-wchar -x c++ -O0 -g3 -Wall -c -fmessage-length=0 -include $(PREINC) -masm=intel
       
   184 OPTIMISE:=-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping
       
   185 CXXOPT_REL:=-fshort-wchar -x c++ -Wall -c -fmessage-length=0 -include $(PREINC) $(if $(CODE_COVERAGE),-O0,$(OPTIMISE)) -masm=intel
       
   186 
       
   187 # Allow specification of additional build include file
       
   188 ifdef BUILDINC
       
   189   CXXOPT_DEB+= -include $(BUILDINC)
       
   190   CXXOPT_REL+= -include $(BUILDINC)
       
   191 endif
       
   192 
       
   193 # Extra options needed for cia files
       
   194 ASMOPT:=-fomit-frame-pointer
       
   195 
       
   196 # Linker options for DLL
       
   197 ifndef DLL_WIN_LINKER_OPTS
       
   198   DLL_WIN_LINKER_OPTS:= $(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols
       
   199 endif
       
   200 ifndef DLL_LIN_LINKER_OPTS
       
   201   DLL_LIN_LINKER_OPTS:= -Wl,-export-all-symbols $(if $(CODE_COVERAGE),-lgcov) -ldl
       
   202 endif
       
   203 
       
   204 # Source files to scan for in a directory
       
   205 # Note that CPP and cpp will match on the same files - so a sort is necessary on wildcard results
       
   206 SOURCE_EXT:=CPP cpp c cia
       
   207 
       
   208 # Source code assumed to be all cpp/cia files in supplied directories
       
   209 SOURCE_FILES:=$(foreach dir,$(SOURCE_DIRS),$(sort $(foreach ext,$(SOURCE_EXT),$(wildcard $(ROOT)/$(dir)/*.$(ext))))) \
       
   210   $(foreach src,$(SOURCE),$(ROOT)/$(if $(SOURCE_FOLDER),$(SOURCE_FOLDER)/)$(src)) \
       
   211   $(foreach src,$(SOURCE_MOD),$(subst \,/,$(EXTENSION_ROOT))/$(src)) \
       
   212   $(foreach id,$(SOURCE_IDS),$(foreach src,$($(id)_SOURCE),$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT))/$(src))))
       
   213 
       
   214 # Include folders
       
   215 CXXINC:=$(foreach inc,$(INCLUDES) $(SOURCE_DIRS),-I$(ROOT)/$(inc)) \
       
   216   $(foreach inc,$(SYS_INCLUDES),-I$(EPOCROOT)$(inc)) -I$(ROOT) \
       
   217   $(foreach id,$(SOURCE_IDS),$(foreach inc,$($(id)_SOURCE_INC),-I$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT)))/$(inc)))
       
   218 
       
   219 # Add standard include paths?
       
   220 ifndef NO_STD_INCLUDE
       
   221   CXXINC+= -I$(EPOCROOT)epoc32/include/x86tool -I$(EPOCROOT)epoc32/include
       
   222   ifdef S60_BUILD
       
   223     CXXINC+= -I$(EPOCROOT)epoc32/include/oem
       
   224   endif
       
   225 endif
       
   226 
       
   227 # Support for building JNI
       
   228 ifdef JAVA_JNI
       
   229   CXXINC+= -I"$(JAVA_HOME)/include"
       
   230   ifdef WIN32
       
   231     CXXINC+= -I"$(JAVA_HOME)/include/win32"
       
   232   else
       
   233     CXXINC+= -I"$(JAVA_HOME)/include/linux"
       
   234   endif
       
   235 endif
       
   236 
       
   237 
       
   238 # STL Port support needed? Note STL and Symbian won't mix!
       
   239 ifdef STLPORT
       
   240   CXXINC+= -I$(EPOCROOT)epoc32/include/tools/stlport 
       
   241 endif
       
   242 
       
   243 # ***
       
   244 # DEBUG
       
   245 #
       
   246 
       
   247 # Object files are the same name as the source files with a .o extension
       
   248 OBJECTFILES_DEB:=$(foreach src,$(SOURCE_FILES),deb$(src).o)
       
   249 
       
   250 # Compile
       
   251 $(OBJECTFILES_DEB) : $(PREINC) $(SOURCE_FILES)
       
   252 	@echo ***
       
   253 	@echo Making: $@
       
   254 	$(call createdir,$(dir $@))
       
   255 	$(CXX) $(CXXDEFS_DEB) $(CXXINC) -I$(subst deb$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_DEB) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst deb$(OBJSUBST),$(OBJSUBST),$(basename $@))
       
   256 
       
   257 # Link
       
   258 $(TARGET_FULLNAME_DEB) : $(OBJECTFILES_DEB) $(foreach lib,$(LIBS),$(TARGET_DIR_DEB)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_DEB)lib$(lib)$(if $(WIN32),.a,.so))
       
   259 ifeq ($(TARGET_TYPE),lib)
       
   260 	@echo ***
       
   261 	@echo Creating lib: $@
       
   262 	$(AR) -r $(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB)
       
   263 endif
       
   264 ifeq ($(TARGET_TYPE),exe)
       
   265 	@echo ***
       
   266 	@echo Creating exe: $@
       
   267 	$(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
       
   268 		-o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
       
   269 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   270 		$(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
       
   271 endif
       
   272 ifeq ($(TARGET_TYPE),dll)
       
   273   ifdef WIN32
       
   274 	@echo ***
       
   275 	@echo Creating Windows dll: $@
       
   276 	$(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
       
   277 		-shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
       
   278 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   279 		-Wl,-out-implib,$(@D)/$(basename $(@F)).a \
       
   280 		$(DLL_WIN_LINKER_OPTS)
       
   281   else
       
   282 	@echo ***
       
   283 	@echo Creating Linux shared object: $@
       
   284 	$(CXX) -L$(TARGET_DIR_DEB) \
       
   285 		-shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
       
   286 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   287 		$(DLL_LIN_LINKER_OPTS)
       
   288   endif
       
   289 endif
       
   290 
       
   291 # ***
       
   292 # RELEASE
       
   293 #
       
   294 
       
   295 # Object files are the same name as the source files with a .o extension
       
   296 OBJECTFILES_REL:=$(foreach src,$(SOURCE_FILES),rel$(src).o)
       
   297 
       
   298 # Compile
       
   299 $(OBJECTFILES_REL) : $(PREINC) $(SOURCE_FILES)
       
   300 	@echo ***
       
   301 	@echo Making: $@
       
   302 	$(call createdir,$(dir $@))
       
   303 	$(CXX) $(CXXDEFS_REL) $(CXXINC) -I$(subst rel$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_REL) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst rel$(OBJSUBST),$(OBJSUBST),$(basename $@))
       
   304 
       
   305 # Link
       
   306 $(TARGET_FULLNAME_REL) : $(OBJECTFILES_REL) $(foreach lib,$(LIBS),$(TARGET_DIR_REL)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_REL)lib$(lib)$(if $(WIN32),.a,.so))
       
   307 ifeq ($(TARGET_TYPE),lib)
       
   308 	@echo ***
       
   309 	@echo Creating lib: $@
       
   310 	$(AR) -r $(TARGET_FULLNAME_REL) $(OBJECTFILES_REL)
       
   311 endif
       
   312 ifeq ($(TARGET_TYPE),exe)
       
   313 	@echo ***
       
   314 	@echo Creating exe: $@
       
   315 	$(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
       
   316 		-o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
       
   317 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   318 		$(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
       
   319 endif
       
   320 ifeq ($(TARGET_TYPE),dll)
       
   321   ifdef WIN32
       
   322 	@echo ***
       
   323 	@echo Creating Windows dll: $@	
       
   324 	$(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
       
   325 		-shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
       
   326 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   327 		-Wl,-out-implib,$(@D)/$(basename $(@F)).a \
       
   328 		$(DLL_WIN_LINKER_OPTS)
       
   329   else
       
   330 	@echo ***
       
   331 	@echo Creating Linux shared object: $@
       
   332 	$(CXX) -L$(TARGET_DIR_REL) \
       
   333 		-shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
       
   334 		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
       
   335 		$(DLL_LIN_LINKER_OPTS)
       
   336   endif
       
   337 endif
       
   338 
       
   339 do_nothing:
       
   340 
       
   341 #
       
   342 # The targets invoked by abld...
       
   343 #
       
   344 
       
   345 MAKMAKE : do_nothing
       
   346 FREEZE : do_nothing
       
   347 RESOURCE : do_nothing
       
   348 CLEANLIB : do_nothing
       
   349 FINAL : do_nothing
       
   350 
       
   351 SAVESPACE :
       
   352 ifeq ($(CFG_PATH),deb)
       
   353 	$(call remove,$(OBJECTFILES_DEB))
       
   354 endif
       
   355 ifeq ($(CFG_PATH),rel)
       
   356 	$(call remove,$(OBJECTFILES_REL))
       
   357 endif
       
   358 
       
   359 LIB : $(TARGET_LIB)
       
   360 
       
   361 BLD : $(TARGET_BLD)
       
   362 
       
   363 CLEAN :
       
   364 	$(call remove,$(foreach file,$(TARGET_LIB) $(TARGET_BLD),$(TO_ROOT)$(file)))
       
   365 ifeq ($(CFG_PATH),deb)
       
   366 	$(call remove,$(OBJECTFILES_DEB))
       
   367 endif
       
   368 ifeq ($(CFG_PATH),rel)
       
   369 	$(call remove,$(OBJECTFILES_REL))
       
   370 endif
       
   371 
       
   372 RELEASABLES :
       
   373 	@echo $(TARGET_LIB) $(TARGET_BLD)