--- a/sbsv2/raptor/RELEASE-NOTES.txt Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/RELEASE-NOTES.txt Thu Jan 14 16:29:37 2010 +0000
@@ -1,6 +1,17 @@
Release Notes for Symbian Build System v2
+Next version
+
+Other Changes:
+Combine Linking and Postlinking into a single step
+New 'Patchable Constants' target type: TARGETTYPE pdll
+Support exit codes from next version of the trace compiler which will issue them
+New (experimental) FilterWhatComp filter. Simulates abld log output for use with parse_what.pl for packing up zips by component.
+New graphical build visualisation tool (bin/timelines.py). Requires pygame and PyOpenGL.
+New a log analyser for recording the total time spent in each type of recipe in the build (recipestats.py).
+
+
version 2.11.3
Defect Fixes:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/bin/recipestats.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+#
+# display summary information about recipes from raptor logs
+# e.g. total times and so on.
+
+import time
+
+class RecipeStats(object):
+ STAT_OK = 0
+
+
+ def __init__(self):
+ self.stats = {}
+ self.failcount = 0
+ self.failtime = 0.0
+ self.failtypes = {}
+ self.retryfails = 0
+
+ def add(self, starttime, duration, name, status):
+ if status != RecipeStats.STAT_OK:
+ self.failcount += 1
+ if name in self.failtypes:
+ self.failtypes[name] += 1
+ else:
+ self.failtypes[name] = 1
+
+ if status == 128:
+ self.retryfails += 1
+ return
+
+ if name in self.stats:
+ (count, time) = self.stats[name]
+ self.stats[name] = (count + 1, time + duration)
+ else:
+ self.stats[name] = (1,duration)
+
+ def recipe_csv(self):
+ s = "# name, time, count\n"
+ for (name,(count,time)) in self.stats.iteritems():
+ s += '"%s",%s,%d\n' % (name, str(time), count)
+ return s
+
+
+
+import sys
+import re
+
+def main():
+
+ f = sys.stdin
+ st = RecipeStats()
+
+ recipe_re = re.compile(".*<recipe name='([^']+)'.*")
+ time_re = re.compile(".*<time start='([0-9]+\.[0-9]+)' *elapsed='([0-9]+\.[0-9]+)'.*")
+ status_re = re.compile(".*<status exit='(?P<exit>(ok|failed))'( *code='(?P<code>[0-9]+)')?.*")
+
+ alternating = 0
+ start_time = 0.0
+
+
+ for l in f.xreadlines():
+ l2 = l.rstrip("\n\r")
+ rm = recipe_re.match(l2)
+
+ if rm is not None:
+ rname = rm.groups()[0]
+ continue
+
+
+ tm = time_re.match(l2)
+ if tm is not None:
+ try:
+ s = float(tm.groups()[0])
+ elapsed = float(tm.groups()[1])
+
+ if start_time == 0.0:
+ start_time = s
+
+ s -= start_time
+
+ continue
+ except ValueError, e:
+ raise Exception("Parse problem: float conversion on these groups: %s\n%s" %(str(tm.groups()), str(e)))
+ else:
+ if l2.find("<time") is not -1:
+ raise Exception("unparsed timing status: %s\n"%l2)
+
+ sm = status_re.match(l2)
+
+ if sm is None:
+ continue
+
+ if sm.groupdict()['exit'] == 'ok':
+ status = 0
+ else:
+ status = int(sm.groupdict()['code'])
+
+ st.add(s, elapsed, rname, status)
+
+ print st.recipe_csv()
+
+
+if __name__ == '__main__': main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/bin/sbs_filter Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,91 @@
+#!/bin/bash
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# raptor script
+# add mingw to the PATH if we are running Cygwin on Windows
+#
+
+# If SBS_HOME is not set in the environment then work it out
+# from the path to this batch file
+if [ -z "$SBS_HOME" ] ; then
+ temp=$0
+ SBS_HOME=$(cd ${temp%/*} && echo $PWD)
+ export SBS_HOME=${SBS_HOME%/bin}
+fi
+
+# Ensure that the host type is set for Raptor:
+eval $($SBS_HOME/bin/gethost.sh -e)
+
+if [ -z "$HOSTPLATFORM" ]; then
+ echo "Error: HOSTPLATFORM could not be determined." 1>&2
+ exit 1
+fi
+
+if [ ! -d "$SBS_HOME/$HOSTPLATFORM_DIR" ]; then
+cat 1>&2 <<EOERROR
+Error: sbs has not been installed with support for your platform: "${HOSTPLATFORM}".
+EOERROR
+ exit 1
+fi
+
+if [ "$OSTYPE" == "cygwin" ]; then
+
+ SBS_HOME=${SBS_HOME//\\//}
+
+ __MINGW__=${SBS_MINGW:-$SBS_HOME/$HOSTPLATFORM_DIR/mingw}
+ __CYGWIN__=${SBS_CYGWIN:-$SBS_HOME/$HOSTPLATFORM_DIR/cygwin}
+ __PYTHON__=${SBS_PYTHON:-$SBS_HOME/$HOSTPLATFORM_DIR/python252/python.exe}
+ export PYTHONPATH=${SBS_PYTHONPATH:-$SBS_HOME/$HOSTPLATFORM_DIR/python252}
+
+ # Command for unifying path strings. For example, "c:\some\path" and
+ # "/cygdrive/c/some/path" will both be converted into "c:/some/path".
+ u="$__CYGWIN__/bin/cygpath.exe -m"
+
+ __MINGW__=$($u "$__MINGW__")
+ __CYGWIN__=$($u "$__MINGW__")
+ __PYTHON__=$($u "$__PYTHON__")
+
+ export SBS_HOME=$($u "$SBS_HOME")
+ export EPOCROOT=$($u "$EPOCROOT")
+
+ export PATH=${__MINGW__}/bin:${__CYGWIN__}/bin:$SBS_HOME/$HOSTPLATFORM_DIR/bin:$PATH
+
+ # Tell Cygwin not to map unix security attributes to windows to
+ # prevent raptor from potentially creating read-only files:
+ export CYGWIN='nontsec nosmbntsec'
+
+else
+ export PYTHONPATH=${SBS_PYTHONPATH:-$SBS_HOME/$HOSTPLATFORM_DIR/python262/lib}
+ PATH=$SBS_HOME/$HOSTPLATFORM_DIR/python262/bin:$SBS_HOME/$HOSTPLATFORM_DIR/bin:$PATH
+ LD_LIBRARY_PATH=$SBS_HOME/$HOSTPLATFORM_DIR/python262/lib:$SBS_HOME/$HOSTPLATFORM_DIR/bv/lib:$LD_LIBRARY_PATH
+
+ export PATH LD_LIBRARY_PATH
+ __PYTHON__=python
+fi
+
+
+# call sbs_filter.py with the arguments
+
+FILTER_START="$SBS_HOME/bin/sbs_filter.py"
+
+if [ -e "$FILTER_START" ]; then
+ # run the source version
+ ${__PYTHON__} "$FILTER_START" "$@"
+elif [ -e "$FILTER_START"c ]; then
+ # run the compiled version
+ ${__PYTHON__} "$FILTER_START"c "$@"
+else
+ echo "Cannot start sbs_filter - $FILTER_START not found." 1>&2
+ echo "Check your SBS_HOME environment variable." 1>&2
+fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/bin/sbs_filter.bat Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,47 @@
+@rem
+@rem Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of the License "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+
+@REM Automatically find SBS_HOME if it is not set
+@IF NOT "%SBS_HOME%"=="" goto foundhome
+@SET RAPTORBINDIR=%~dp0
+@SET WD=%cd%
+@cd %RAPTORBINDIR%\..
+@SET SBS_HOME=%cd%
+@cd %WD%
+:foundhome
+
+@REM Use the cygwin set by the environment if possible
+@SET __CYGWIN__=%SBS_CYGWIN%
+@IF "%__CYGWIN__%"=="" SET __CYGWIN__=%SBS_HOME%\win32\cygwin
+
+@REM add to the search path
+@SET PATH=%__CYGWIN__%\bin;%PATH%
+
+@REM Make sure that /tmp is not set incorrectly for sbs
+@umount -u /tmp >NUL 2>NUL
+@mount -u %TEMP% /tmp >NUL 2>NUL
+@umount -u / >NUL 2>NUL
+@mount -u %__CYGWIN__% / >NUL 2>NUL
+
+@REM Tell CYGWIN not to map unix security attributes to windows to
+@REM prevent raptor from potentially creating read-only files:
+@set CYGWIN=nontsec nosmbntsec
+
+@REM Run with all the arguments.
+@bash %SBS_HOME%\bin\sbs_filter %*
+
+@ENDLOCAL
+@cmd /c exit /b %ERRORLEVEL%
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/bin/timelines.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,224 @@
+#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+#
+# Raptor log visualisation program. Takes a raptor log as standard input
+# and displays timelines that represent build progress and
+# how much actual parallelism there is in the build.
+# This program requires the pygame and PyOpenGL modules.
+
+from OpenGL.GL import *
+from OpenGL.GLU import *
+import pygame
+from pygame.locals import *
+import time
+
+class Timeline(object):
+ """A bar representing a number of recipes which were executed in
+ time sequence. There is no guarantee about what host but in
+ theory they could have been executed on the same host."""
+
+ globalmax = 2.0
+
+ def __init__(self,ylevel):
+ self.maxtime = 0.0
+ self.recipes = []
+ self.ylevel = ylevel
+
+ def append(self, recipe):
+ "" add this recipe to this timeline if it happens after the latest recipe already in the timeline ""
+ if recipe.starttime + recipe.duration > self.maxtime:
+ self.maxtime = recipe.starttime + recipe.duration
+ if self.maxtime > Timeline.globalmax:
+ Timeline.globalmax = self.maxtime
+ else:
+ pass
+
+ self.recipes.append(recipe)
+
+ def draw(self):
+ glLoadIdentity()
+ self.xscale = 4.0 / Timeline.globalmax
+
+ glTranslatef(-2.0, -1.5, -6.0)
+ count = 0
+ for r in self.recipes:
+ if count % 2 == 0:
+ coloff=0.8
+ else:
+ coloff = 1.0
+
+ count += 1
+ r.draw(self.xscale, self.ylevel, coloff)
+
+class Recipe(object):
+ """Represents a task completed in a raptor build.
+ Drawn as a colour-coded bar with different
+ colours for the various recipe types."""
+ STAT_OK = 0
+ colours = {
+ 'compile': (0.5,0.5,1.0),
+ 'compile2object': (0.5,0.5,1.0),
+ 'win32compile2object': (0.5,0.5,1.0),
+ 'tools2linkexe': (0.5,1.0,0.5),
+ 'link': (0.5,1.0,0.5),
+ 'linkandpostlink': (0.5,1.0,0.5),
+ 'win32stageonelink': (0.5,1.0,0.5),
+ 'tools2lib': (0.5,1.0,1.0),
+ 'win32stagetwolink': (1.0,0.1,1.0),
+ 'postlink': (1.0,0.5,1.0)
+ }
+
+ def __init__(self, starttime, duration, name, status):
+ self.starttime = starttime
+ self.duration = duration
+ self.status = status
+ self.colour = (1.0, 1.0, 1.0)
+ if name in Recipe.colours:
+ self.colour = Recipe.colours[name]
+ else:
+ self.colour = (1.0,1.0,1.0)
+ self.name = name
+
+ def draw(self, scale, ylevel, coloff):
+ if self.status == Recipe.STAT_OK:
+ glColor4f(self.colour[0]*coloff, self.colour[1]*coloff, self.colour[2]*coloff,0.2)
+ else:
+ glColor4f(1.0*coloff, 0.6*coloff, 0.6*coloff,0.2)
+
+
+ x = self.starttime * scale
+ y = ylevel
+ x2 = x + self.duration * scale
+ y2 = ylevel + 0.2
+ glBegin(GL_QUADS)
+ glVertex3f(x, y, 0)
+ glVertex3f(x, y2, 0)
+ glVertex3f(x2, y2, 0)
+ glVertex3f(x2, y, 0)
+ glEnd()
+
+
+def resize((width, height)):
+ if height==0:
+ height=1
+ glViewport(0, 0, width, height)
+ glMatrixMode(GL_PROJECTION)
+ glLoadIdentity()
+ gluPerspective(45, 1.0*width/height, 0.1, 100.0)
+ glMatrixMode(GL_MODELVIEW)
+ glLoadIdentity()
+
+def init():
+ glShadeModel(GL_SMOOTH)
+ glClearColor(0.0, 0.0, 0.0, 0.0)
+ glClearDepth(1.0)
+ glEnable(GL_DEPTH_TEST)
+ glDepthFunc(GL_LEQUAL)
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
+
+
+import sys
+import re
+
+def main():
+
+ video_flags = OPENGL|DOUBLEBUF
+
+ pygame.init()
+ pygame.display.set_mode((800,600), video_flags)
+
+ resize((800,600))
+ init()
+
+ frames = 0
+ ticks = pygame.time.get_ticks()
+
+
+ lines = 4
+ timelines = []
+ ylevel = 0.0
+ for i in xrange(0,4):
+ ylevel += 0.6
+ timelines.append(Timeline(ylevel))
+
+ f = sys.stdin
+
+ recipe_re = re.compile(".*<recipe name='([^']+)'.*")
+ time_re = re.compile(".*<time start='([0-9]+\.[0-9]+)' *elapsed='([0-9]+\.[0-9]+)'.*")
+ status_re = re.compile(".*<status exit='([^']*)'.*")
+
+ alternating = 0
+ start_time = 0.0
+
+
+ for l in f.xreadlines():
+ l2 = l.rstrip("\n")
+ rm = recipe_re.match(l2)
+
+ if rm is not None:
+ rname = rm.groups()[0]
+ continue
+
+
+ tm = time_re.match(l2)
+ if tm is not None:
+ s = float(tm.groups()[0])
+ elapsed = float(tm.groups()[1])
+
+ if start_time == 0.0:
+ start_time = s
+
+ s -= start_time
+
+ continue
+
+ sm = status_re.match(l2)
+
+ if sm is None:
+ continue
+
+ if sm.groups()[0] == 'ok':
+ status = 0
+ else:
+ status = int(sm.groups()[0])
+
+ olddiff = 999999999.0
+ tnum = 0
+ for t in timelines:
+ newdiff = s - t.maxtime
+ if newdiff < 0.0:
+ continue
+ if olddiff > newdiff:
+ dest_timeline = t
+ olddiff = newdiff
+ tnum += 1
+
+ dest_timeline.append(Recipe(s, elapsed, rname, status))
+ event = pygame.event.poll()
+ if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
+ break
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
+ for t in timelines:
+ t.draw()
+ pygame.display.flip()
+
+ frames = frames+1
+
+ print "fps: %de" % ((frames*1000)/(pygame.time.get_ticks()-ticks))
+ event = pygame.event.wait()
+
+
+if __name__ == '__main__': main()
--- a/sbsv2/raptor/lib/config/interfaces.xml Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/config/interfaces.xml Thu Jan 14 16:29:37 2010 +0000
@@ -5,12 +5,13 @@
<var name="default.interfaces">
<!-- interfaces corresponding to target types -->
- <set name="INTERFACE_TYPES" value="exe stdexe ext_makefile dll stddll lib stdlib export extension ani plugin textnotifier2 implib var var2 exexp kexe kdll kext klib ldd pdd pdl fsy resource none stringtable bitmap"/>
+ <set name="INTERFACE_TYPES" value="exe stdexe ext_makefile dll stddll lib stdlib export extension ani plugin textnotifier2 implib var var2 exexp kexe kdll kext klib pdll ldd pdd pdl fsy resource none stringtable bitmap"/>
<set name="INTERFACE.exe" value="Symbian.exe"/>
<set name="INTERFACE.stdexe" value="Symbian.stdexe"/>
<set name="INTERFACE.stddll" value="Symbian.stddll"/>
<set name="INTERFACE.stdlib" value="Symbian.stdlib"/>
<set name="INTERFACE.dll" value="Symbian.dll"/>
+ <set name="INTERFACE.pdll" value="Symbian.pdll"/>
<set name="INTERFACE.lib" value="Symbian.lib"/>
<set name="INTERFACE.ani" value="Symbian.ani"/>
<set name="INTERFACE.plugin" value="Symbian.plugin"/>
--- a/sbsv2/raptor/lib/config/variants.xml Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/config/variants.xml Thu Jan 14 16:29:37 2010 +0000
@@ -187,7 +187,6 @@
<set name="OWN_LIBRARY_OPTION" value="--library_interface=aeabi_clib"/>
<set name="RELOCATABLE_IMAGE_OPTION" value=""/>
<set name="SPLIT_OPTION" value=""/>
- <set name="STDLIB_OPTION" value=""/>
<set name="PLATMACROS.VAR" value="ARMCC_4 ARMCC_4_0"/>
<set name="ARMMACROS.VAR" value="__ARMCC_4__ __ARMCC_4_0__"/>
<set name="SYMBIAN_LINK_FLAGS.VAR" value="--override_visibility"/>
--- a/sbsv2/raptor/lib/config/winscw.xml Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/config/winscw.xml Thu Jan 14 16:29:37 2010 +0000
@@ -26,6 +26,7 @@
<set name="INTERFACE.exe" value="Emulator.exe"/>
<set name="INTERFACE.stdexe" value="Emulator.stdexe"/>
<set name="INTERFACE.dll" value="Emulator.dll"/>
+ <set name="INTERFACE.pdll" value="Emulator.pdll"/>
<set name="INTERFACE.stddll" value="Emulator.stddll"/>
<set name="INTERFACE.exexp" value="Emulator.exexp"/>
<set name="INTERFACE.fsy" value="Emulator.fsy"/>
--- a/sbsv2/raptor/lib/flm/e32abiv2.flm Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/e32abiv2.flm Thu Jan 14 16:29:37 2010 +0000
@@ -384,7 +384,24 @@
# Generating the import library is enough if TARGETTYPE=implib #############
ifneq ($(DOPOSTLINK),)
-include $(FLMHOME)/e32postlink.mk
+# Capabilities
+ADDED_CAPABILITIES:=$(subst $(CHAR_SPACE),+,$(filter-out -%,$(CAPABILITY)))
+SUBTRACTED_CAPABILITIES:=$(subst $(CHAR_SPACE),,$(filter -%,$(CAPABILITY)))
+FINAL_CAPABILITIES:=$(if $(ADDED_CAPABILITIES),$(ADDED_CAPABILITIES)$(SUBTRACTED_CAPABILITIES),NONE)
+
+# Paging options for the old postlinker
+POSTLINKER_PAGEDOPTION:=--defaultpaged
+ifeq ($(PAGED),1)
+ POSTLINKER_PAGEDOPTION:=--paged
+endif
+ifeq ($(PAGED),0)
+ POSTLINKER_PAGEDOPTION:=--unpaged
+endif
+
+CLEANTARGETS:=$(CLEANTARGETS) $(E32TARGET)
+CLEANTARGETS:=$(CLEANTARGETS) $(GENERATED_DEFFILE)
+CLEANTARGETS:=$(CLEANTARGETS) $(GENERATED_DSO)
+
endif # ifneq ($(DOPOSTLINK),)
ifneq ($(TARGETTYPE),implib)
@@ -592,10 +609,10 @@
# outside the relevant tags but it is also unavoidable.
define linktarget_func
## The actual link target, dependencies and build step
-$(LINK_TARGET): $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(escaped_e32abiv2_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),)
+$(E32TARGET): $(POSTLINKDEFFILE) $(ELF2E32) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS),$(LINKOBJECTS)) $(escaped_e32abiv2_LIBS) $(LINKER_ENTRYPOINT_LIBDEP) $(if $(SUPPORTS_STDCPP_NEWLIB),$(CHECKLIB)) $(if $(LINKERFEEDBACK_STAGE2),$(FEEDBACKFILE),) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
$(if $(MULTIFILE_ENABLED),,@echo -n "" > $(VIAFILE);
$(call groupin10,$(LINKOBJECTS)) ;)
- $(call startrule,link) \
+ $(call startrule,linkandpostlink) \
$(if $(PERTURBSTARTTIME),$(RANSLEEP) $(PERTURBMSECS) ;,) \
$(if $(SUPPORTS_STDCPP_NEWLIB),$(if $(located_STATICLIBRARIES),$(CHECKLIB) $(CHECKLIB_TYPE) --elf $(call dblquote,$(located_STATICLIBRARIES)) &&,),) \
$(LD) $(LINKER_MISC_FLAGS) $(LINKER_DEFAULT_LIB_PATHS) $(SYMBIAN_LINK_FLAGS) $(if $(DEBUG_INFO),$(LINKER_DEBUG_OPTION),$(LINKER_NODEBUG_OPTION)) \
@@ -605,19 +622,61 @@
$(LINKER_ARCH_OPTION) \
$(SYMVER_OPTION) $(SO_NAME_OPTION)=$(call dblquote,$(LINKASVERSIONED)) \
$(LINKER_ENTRYPOINT_SETTING) \
- -o $$(call dblquote,$$@) \
+ -o $$(call dblquote,$(LINK_TARGET)) \
$(if $(LTCG),$(LTCG_OPTION),) \
$(LINKER_SYMBOLS_OPTION) $(LINKER_SYMBOLS_FILE_OPTION)=$(call dblquote,$(MAPFILE)) \
$(LINKEROPTION) \
$(if $(MULTIFILE_ENABLED),$(call dblquote,$(MULTIFILEOBJECT) $(CIAFILES_LINKOBJECTS)),$(COMMANDFILE_OPTION)$(call dblquote,$(VIAFILE))) \
- $(if $(GENERATELINKERFEEDBACK),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
+ $(if $(GENERATELINKERFEEDBACK),$(FEEDBACK_OPTION)$(call dblquote,$(FEEDBACKFILE))) \
$(if $(LINKER_ADD_STATIC_RUNTIME),$(if $(STATIC_RUNTIME_LIB),$(LINKER_GROUP_START_OPTION) $(STATIC_RUNTIME_DIR)/$(STATIC_RUNTIME_LIB) $(LINKER_GROUP_END_OPTION),)) \
- $(quoted_e32abiv2_LIBS) $(LINKER_DEFAULT_LIBS)\
- $(call endrule,link)
+ $(quoted_e32abiv2_LIBS) $(LINKER_DEFAULT_LIBS) && \
+ $(ELF2E32) \
+ --sid=0x$(if $(SID),$(SID),$(if $(UID3),$(UID3),0)) \
+ --version=$(VERSION) \
+ --capability=$(FINAL_CAPABILITIES) \
+ --linkas=$(call dblquote,$(LINKASVERSIONED)) \
+ --fpu=$(if $(ARMFPU),$(ARMFPU),$(POSTLINKER_FPU_DEFAULT)) \
+ --targettype=$(POSTLINKTARGETTYPE) \
+ --output=$$(call dblquote,$$@) \
+ --elfinput=$(call dblquote,$(LINK_TARGET)) \
+ $(if $(UID1),--uid1=0x$(UID1),) \
+ $(if $(UID2),--uid2=0x$(UID2),) \
+ $(if $(UID3),--uid3=0x$(UID3),) \
+ $(if $(VENDORID),--vid=0x$(VENDORID),) \
+ $(if $(EXPTARGET),--customdlltarget,) \
+ $(if $(ARMLIBS),--excludeunwantedexports,) \
+ $(if $(EPOCALLOWDLLDATA),--dlldata,) \
+ $(if $(EPOCPROCESSPRIORITY),--priority=$(EPOCPROCESSPRIORITY),) \
+ $(if $(EPOCSTACKSIZE),--stack=0x$(EPOCSTACKSIZE),) \
+ $(if $(EPOCHEAPSIZEMIN),--heap=0x$(EPOCHEAPSIZEMIN)$(CHAR_COMMA)0x$(EPOCHEAPSIZEMAX),) \
+ $(if $(EPOCFIXEDPROCESS),--fixedaddress,) \
+ $(if $(EPOCDATALINKADDRESS),--datalinkaddress=$(EPOCDATALINKADDRESS),) \
+ $(if $(NAMEDSYMLKUP),--namedlookup,) \
+ $(if $(SMPSAFE),--smpsafe,) \
+ $(if $(POSTLINKDEFFILE),--definput=$(POSTLINKDEFFILE),) \
+ $(if $(EXPORTUNFROZEN),--unfrozen,) \
+ $(if $(AUTOEXPORTS),--sysdef=$(call dblquote,$(AUTOEXPORTS)),) \
+ $(if $(CANIGNORENONCALLABLE), \
+ $(if $(IMPORTLIBRARYREQUIRED),,--ignorenoncallable),) \
+ $(if $(CANHAVEEXPORTS), --defoutput=$(call dblquote,$(GENERATED_DEFFILE)) --dso=$(GENERATED_DSO)) \
+ $(if $(filter $(VARIANTTYPE),$(DEBUGGABLE)),--debuggable,) \
+ $(if $(POSTLINKER_SUPPORTS_WDP), \
+ --codepaging=$(PAGEDCODE_OPTION) --datapaging=$(PAGEDDATA_OPTION), \
+ $(POSTLINKER_PAGEDOPTION)) \
+ $(if $(NOCOMPRESSTARGET),--uncompressed, \
+ $(if $(INFLATECOMPRESSTARGET),--compressionmethod=inflate, \
+ $(if $(BYTEPAIRCOMPRESSTARGET),--compressionmethod=bytepair, \
+ --compressionmethod=$(POSTLINKER_COMPRESSION_DEFAULT)))) \
+ --libpath="$(call concat,$(PATHSEP)$(CHAR_SEMIC),$(strip $(RUNTIME_LIBS_PATH) $(STATIC_LIBS_PATH)))" \
+ $(if $(SAVESPACE),$(if $(EXPORTUNFROZEN),,&& { $(GNURM) -rf $(INTERMEDIATEPATH); true; })) \
+ $(call endrule,linkandpostlink)
-$(MAPFILE): $(LINK_TARGET)
+$(MAPFILE): $(E32TARGET)
+$(LINK_TARGET): $(E32TARGET)
endef
+ifneq ($(DOPOSTLINK),)
$(eval $(linktarget_func))
+endif # ifneq ($(DOPOSTLINK),)
CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) $(if $(GENERATELINKERFEEDBACK),$(FEEDBACKFILE)) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT))
WHATRELEASE:=$(WHATRELEASE) $(MAPFILE)
--- a/sbsv2/raptor/lib/flm/e32abiv2defaults.mk Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/e32abiv2defaults.mk Thu Jan 14 16:29:37 2010 +0000
@@ -59,7 +59,7 @@
LINKER_ENTRYPOINT_ADORNMENT:=(uc_exe_.o)
endif
- ifeq ($(call isoneof,$(TARGETTYPE),ani textnotifier2 stddll plugin fsy pdl dll),1)
+ ifeq ($(call isoneof,$(TARGETTYPE),ani textnotifier2 stddll plugin fsy pdl dll pdll),1)
LINKER_ENTRYPOINT_ADORNMENT:=(uc_dll_.o)
endif
--- a/sbsv2/raptor/lib/flm/e32abiv2dll.flm Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/e32abiv2dll.flm Thu Jan 14 16:29:37 2010 +0000
@@ -55,6 +55,6 @@
$(call vrestore)
else
-$(error $e32abiv2dll.flm called with wrong TARGETTYPE (should be 'dll' but is '$(TARGETTYPE)'))
+$(error e32abiv2dll.flm called with wrong TARGETTYPE (should be 'dll' but is '$(TARGETTYPE)'))
endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/lib/flm/e32abiv2pdll.flm Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,61 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# ARMv5 PDLL ABIv2 Function Like Makefile (FLM)
+# Build an e32 PDLL (Patchable constants DLL)
+#
+#
+
+ifeq ($(TARGETTYPE),pdll)
+include $(FLMHOME)/e32abiv2defaults.mk
+
+# What we need to build a DLL
+ifeq ($(NOEXPORTLIBRARY),)
+IMPORTLIBRARYREQUIRED:=1
+endif
+POSTLINKDEFFILE:=$(DEFFILE)
+SUPPORT_FREEZE:=1
+
+# Default Linker settings for this target type
+LINKER_ENTRYPOINT_LIBDEP:=$(STATIC_RUNTIME_DIR)/edll.lib
+LINKER_ENTRYPOINT_SETTING:=$(LINKER_ENTRY_OPTION)=_E32Dll $(LINKER_ENTRYPOINT_DECORATION)$(LINKER_SEPARATOR)$(call dblquote,$(STATIC_RUNTIME_DIR)/edll.lib$(LINKER_ENTRYPOINT_ADORNMENT))
+
+ifeq ("$(NEED_ENTRYPOINT_LIBRARY)","True")
+LINKER_ENTRYPOINT_SETTING:=$(LINKER_ENTRYPOINT_SETTING) $(LINKER_ENTRYPOINT_LIBDEP)
+endif
+
+LINKER_STUB_LIBRARY:=$(STATIC_RUNTIME_DIR)/edllstub.lib
+STATIC_RUNTIME_LIB:=$(USER_STATIC_RUNTIME_LIB)
+
+
+# Default Postlinker settings
+CANHAVEEXPORTS:=1
+POSTLINKTARGETTYPE:=DLL
+POSTLINKFILETYPE:=dll
+DOPOSTLINK:=1
+CANIGNORENONCALLABLE:=1
+
+# Use the general EABI FLM
+# We are appending to CDEFS but we don't want this to affect
+# other invocations so we are going to save it on a stack
+# and restore it afterwards
+$(call vsave,CDEFS)
+CDEFS:=$(CDEFS) __DLL__
+include $(FLMHOME)/e32abiv2.flm
+$(call vrestore)
+
+else
+$(error e32abiv2pdll.flm called with wrong TARGETTYPE (should be 'pdll' but is '$(TARGETTYPE)'))
+endif
+
+
--- a/sbsv2/raptor/lib/flm/e32postlink.mk Thu Jan 14 16:03:18 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "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:
-# ARMv5 e32 postlinking FLM
-# Knows how to postlink all possible ABIV2 executables for ARM
-#
-
-# Interface
-#
-# Metadata supplied (or deduced from)
-#
-# ARMFPU
-# BYTEPAIRCOMPRESSTARGET
-# CAPABILITY
-# COMPRESSTARGET Not directly referenced, at least with the current approach to compression keywords
-# DEBUGGABLE Can be "udeb" or "urel" or "udeb urel" or ""
-# E32TARGET
-# EPOCALLOWDLLDATA
-# EPOCFIXEDPROCESS
-# EPOCHEAPSIZEMAX
-# EPOCHEAPSIZEMIN
-# EPOCPROCESSPRIORITY
-# EPOCSTACKSIZE
-# EXPORTUNFROZEN
-# INFLATECOMPRESSTARGET
-# NOCOMPRESSTARGET
-# POSTLINKTARGETTYPE
-# SID
-# SMPSAFE
-# UID2
-# UID3
-# VERSION
-# VENDORID
-#
-# Other
-#
-# ARMLIBS
-# AUTOEXPORTS Symbols that must be assumed to exist for this TARGETTYPE in the format: export,ordinal;export,ordinal;..
-# CANIGNORENONCALLABLE If the TARGETTYPE allows it, disregard non-callable exports (v-tables, type information, etc.)
-# CANHAVEEXPORTS
-# CLEANTARGETS
-# ELF2E32
-# EPOCDATALINKADDRESS Redundant?
-# EPOCROOT
-# EXPTARGET
-# GENERATED_DEFFILE
-# GENERATED_DSO
-# HAVE_ORDERONLY
-# IMPORTLIBRARYREQUIRED
-# INTERMEDIATEPATH
-# LINKASVERSIONED
-# LINK_TARGET Postlinker elf input
-# NAMEDSYMLKUP
-# PAGEDCODE_OPTION
-# POSTLINKDEFFILE
-# POSTLINKER_COMPRESSION_DEFAULT Default compression when either COMPRESSTARGET or no compression .mmp keyword is used
-# POSTLINKER_FPU_DEFAULT
-# POSTLINKER_SUPPORTS_WDP
-# RUNTIME_LIBS_PATH
-# SAVESPACE
-# STATIC_LIBS_PATH
-# UID1
-# VARIANTTYPE
-
-
-# Capabilities
-ADDED_CAPABILITIES:=$(subst $(CHAR_SPACE),+,$(filter-out -%,$(CAPABILITY)))
-SUBTRACTED_CAPABILITIES:=$(subst $(CHAR_SPACE),,$(filter -%,$(CAPABILITY)))
-FINAL_CAPABILITIES:=$(if $(ADDED_CAPABILITIES),$(ADDED_CAPABILITIES)$(SUBTRACTED_CAPABILITIES),NONE)
-
-# Paging options for the old postlinker
-POSTLINKER_PAGEDOPTION:=--defaultpaged
-ifeq ($(PAGED),1)
- POSTLINKER_PAGEDOPTION:=--paged
-endif
-ifeq ($(PAGED),0)
- POSTLINKER_PAGEDOPTION:=--unpaged
-endif
-
-# Postlink target
-define e32postlink
-$(E32TARGET): $(LINK_TARGET) $(POSTLINKDEFFILE) $(ELF2E32) $(if $(HAVE_ORDERONLY),|,) $(EPOCROOT)/epoc32/build/TEM_LIB
- $(call startrule,postlink) \
- $(ELF2E32) \
- --sid=0x$(if $(SID),$(SID),$(if $(UID3),$(UID3),0)) \
- --version=$(VERSION) \
- --capability=$(FINAL_CAPABILITIES) \
- --linkas=$(call dblquote,$(LINKASVERSIONED)) \
- --fpu=$(if $(ARMFPU),$(ARMFPU),$(POSTLINKER_FPU_DEFAULT)) \
- --targettype=$(POSTLINKTARGETTYPE) \
- --output=$$(call dblquote,$$@) \
- --elfinput=$(call dblquote,$(LINK_TARGET)) \
- $(if $(UID1),--uid1=0x$(UID1),) \
- $(if $(UID2),--uid2=0x$(UID2),) \
- $(if $(UID3),--uid3=0x$(UID3),) \
- $(if $(VENDORID),--vid=0x$(VENDORID),) \
- $(if $(EXPTARGET),--customdlltarget,) \
- $(if $(ARMLIBS),--excludeunwantedexports,) \
- $(if $(EPOCALLOWDLLDATA),--dlldata,) \
- $(if $(EPOCPROCESSPRIORITY),--priority=$(EPOCPROCESSPRIORITY),) \
- $(if $(EPOCSTACKSIZE),--stack=0x$(EPOCSTACKSIZE),) \
- $(if $(EPOCHEAPSIZEMIN),--heap=0x$(EPOCHEAPSIZEMIN)$(CHAR_COMMA)0x$(EPOCHEAPSIZEMAX),) \
- $(if $(EPOCFIXEDPROCESS),--fixedaddress,) \
- $(if $(EPOCDATALINKADDRESS),--datalinkaddress=$(EPOCDATALINKADDRESS),) \
- $(if $(NAMEDSYMLKUP),--namedlookup,) \
- $(if $(SMPSAFE),--smpsafe,) \
- $(if $(POSTLINKDEFFILE),--definput=$(POSTLINKDEFFILE),) \
- $(if $(EXPORTUNFROZEN),--unfrozen,) \
- $(if $(AUTOEXPORTS),--sysdef=$(call dblquote,$(AUTOEXPORTS)),) \
- $(if $(CANIGNORENONCALLABLE), \
- $(if $(IMPORTLIBRARYREQUIRED),,--ignorenoncallable),) \
- $(if $(CANHAVEEXPORTS), --defoutput=$(call dblquote,$(GENERATED_DEFFILE)) --dso=$(GENERATED_DSO)) \
- $(if $(filter $(VARIANTTYPE),$(DEBUGGABLE)),--debuggable,) \
- $(if $(POSTLINKER_SUPPORTS_WDP), \
- --codepaging=$(PAGEDCODE_OPTION) --datapaging=$(PAGEDDATA_OPTION), \
- $(POSTLINKER_PAGEDOPTION)) \
- $(if $(NOCOMPRESSTARGET),--uncompressed, \
- $(if $(INFLATECOMPRESSTARGET),--compressionmethod=inflate, \
- $(if $(BYTEPAIRCOMPRESSTARGET),--compressionmethod=bytepair, \
- --compressionmethod=$(POSTLINKER_COMPRESSION_DEFAULT)))) \
- --libpath="$(call concat,$(PATHSEP)$(CHAR_SEMIC),$(strip $(RUNTIME_LIBS_PATH) $(STATIC_LIBS_PATH)))" \
- $(if $(SAVESPACE),$(if $(EXPORTUNFROZEN),,&& { $(GNURM) -rf $(INTERMEDIATEPATH); true; })) \
- $(call endrule,postlink)
-endef
-$(eval $(e32postlink))
-
-CLEANTARGETS:=$(CLEANTARGETS) $(E32TARGET)
-CLEANTARGETS:=$(CLEANTARGETS) $(GENERATED_DEFFILE)
-CLEANTARGETS:=$(CLEANTARGETS) $(GENERATED_DSO)
--- a/sbsv2/raptor/lib/flm/emulator.xml Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/emulator.xml Thu Jan 14 16:29:37 2010 +0000
@@ -151,6 +151,23 @@
<param name='MAKEDEF'/>
</interface>
+ <interface name="Emulator.pdll" extends="Emulator.win32" flm="win32pdll.flm">
+ <param name='CHECKLIB' default=''/>
+ <param name='LD'/>
+ <param name='LFLAGS_INFGEN'/>
+ <param name='OPT.CHECKLIB.STDCPP'/>
+ <param name='OPT.CHECKLIB.SYMCPP'/>
+ <param name='OPT.CHECKLIB.WIN32'/>
+ <param name='OPT.HEAPCOMMIT'/>
+ <param name='OPT.HEAPRESERVE'/>
+ <param name='OPT.IMAGEBASE'/>
+ <param name='OPT.IMPLIB'/>
+ <param name='OPT.LIBFILE'/>
+ <param name='OPT.LIBPATH'/>
+ <param name='OPT.NOIMPLIB'/>
+ <param name='MAKEDEF'/>
+ </interface>
+
<interface name="Emulator.stddll" extends="Emulator.dll" flm="win32stddll.flm">
<param name='LFLAGS_SYMGEN'/>
<param name='SYMLOOKUPUTIL'/>
--- a/sbsv2/raptor/lib/flm/standard.xml Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/standard.xml Thu Jan 14 16:29:37 2010 +0000
@@ -212,6 +212,10 @@
<param name='TARGETTYPE' default="dll"/>
<param name='UID1' default="10000079"/>
</interface>
+ <interface name="Symbian.pdll" extends="Symbian.e32abiv2" flm="e32abiv2pdll.flm">
+ <param name='TARGETTYPE' default="pdll"/>
+ <param name='UID1' default="10000079"/>
+ </interface>
<interface name="Symbian.stddll" extends="Symbian.e32abiv2" flm="e32abiv2stddll.flm">
<param name='TARGETTYPE' default="stddll"/>
<param name='UID1' default="10000079"/>
--- a/sbsv2/raptor/lib/flm/tracecompiler.mk Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/tracecompiler.mk Thu Jan 14 16:29:37 2010 +0000
@@ -63,9 +63,9 @@
( echo -en "$(TRACE_PRJNAME)\n$(PROJECT_META)\n"; \
$(GNUCAT) $(TRACE_SOURCE_LIST); \
echo -en "*ENDOFSOURCEFILES*\n" ) | \
- $(JAVA_COMMAND) $(TRACE_COMPILER_START) $(UID_TC) && \
- $(GNUMD5SUM) $(TRACE_SOURCE_LIST) > $(TRACE_MARKER) ; \
- $(GNUCAT) $(TRACE_SOURCE_LIST) \
+ $(JAVA_COMMAND) $(TRACE_COMPILER_START) $(UID_TC) && \
+ $(GNUMD5SUM) $(TRACE_SOURCE_LIST) > $(TRACE_MARKER) && \
+ { $(GNUCAT) $(TRACE_SOURCE_LIST) ; true ; } \
$(call endrule,tracecompile)
endef
--- a/sbsv2/raptor/lib/flm/win32dll.flm Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/lib/flm/win32dll.flm Thu Jan 14 16:29:37 2010 +0000
@@ -30,5 +30,5 @@
include $(FLMHOME)/win32.flm
else
-$(error $win32dll.flm called with wrong TARGETTYPE (should be 'dll' but is '$(TARGETTYPE)'))
+$(error win32dll.flm called with wrong TARGETTYPE (should be 'dll' but is '$(TARGETTYPE)'))
endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/lib/flm/win32pdll.flm Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,34 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# WINSCW PDLL Function Like Makefile (FLM)
+# Build an emulator PDLL
+#
+#
+
+ifeq ($(TARGETTYPE),pdll)
+
+BASE_TYPE:=dll
+CW_STATIC_RUNTIME:=1
+FIRST_STATLIB:=
+FIXED_EXPORT:=
+SUPPORTS_IMPORT_LIBRARY:=1
+SYSTEM_TARGET:=0
+UID2_DEFAULT:=
+
+# Use the general win32 FLM
+include $(FLMHOME)/win32.flm
+
+else
+$(error $winp32dll.flm called with wrong TARGETTYPE (should be 'dll' but is '$(TARGETTYPE)'))
+endif
--- a/sbsv2/raptor/python/plugins/filter_terminal.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/python/plugins/filter_terminal.py Thu Jan 14 16:29:37 2010 +0000
@@ -113,6 +113,7 @@
"asmcompile" : "asmcompile" ,
"compile" : "compile" ,
"postlink" : "target",
+ "linkandpostlink" : "target",
"resourcecompile" : "resource",
"genstringtable" : "strtable",
"tem" : "tem",
--- a/sbsv2/raptor/python/plugins/filter_what.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/python/plugins/filter_what.py Thu Jan 14 16:29:37 2010 +0000
@@ -42,6 +42,12 @@
self.outfile.write(filename+"\n")
self.prints += 1
+
+ def start_bldinf(self, bldinf):
+ pass
+
+ def end_bldinf(self):
+ pass
def open(self, build_parameters):
@@ -79,6 +85,10 @@
"Regex for zip exports"
self.zip_export_regex = re.compile("^<member>.*")
+
+ "Regex for determining bld.inf name"
+ self.whatlog_regex = re.compile("^<whatlog *bldinf='(?P<bldinf>[^']*)'.*")
+ self.current_bldinf = ''
self.prints = 0
self.ok = True
@@ -105,6 +115,7 @@
self.repetitions[line] = 0
if self.repetitions[line] == 0:
+
if self.regex.match(line) and (self.what or self.check):
"Print the whole line"
self.print_file(line, (-1), len(line))
@@ -129,6 +140,20 @@
end = line.rfind("<")
self.print_file(line, start, end)
+
+ else:
+ "work out what the 'current' bldinf file is"
+ m = self.whatlog_regex.match(line)
+ if m:
+ bi = m.groupdict()['bldinf']
+ if self.current_bldinf != bi:
+ if self.current_bldinf != '':
+ self.end_bldinf()
+ self.current_bldinf = bi
+ if bi != '':
+ self.start_bldinf(bi)
+
+
self.repetitions[line] += 1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/plugins/filter_whatcomp.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# Filter class for doing --what and --check operations
+#
+
+import os
+import sys
+import re
+import filter_interface
+import filter_what
+
+class FilterWhatComp(filter_what.FilterWhat):
+
+ def write(self, text):
+ "process some log text"
+
+ for line in text.splitlines():
+ ok =filter_what.FilterWhat.write(self, line)
+ if not ok:
+ break
+
+ self.ok = ok
+ return self.ok
+
+ def start_bldinf(self,bldinf):
+ if "win" in self.buildparameters.platform:
+ dir = os.path.dirname(bldinf.replace("/","\\"))
+ else:
+ dir = os.path.dirname(bldinf)
+
+ self.outfile.write("-- abld -w \nChdir %s \n" % dir)
+
+ def end_bldinf(self):
+ self.outfile.write("++ Finished\n")
--- a/sbsv2/raptor/python/raptor.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/python/raptor.py Thu Jan 14 16:29:37 2010 +0000
@@ -11,7 +11,7 @@
#
# Contributors:
#
-# Description:
+# Description:
# raptor module
# This module represents the running Raptor program. Raptor is started
# either by calling the Main() function, which creates an instance of
@@ -119,7 +119,7 @@
self.type = type
self.specs = []
self.deps = []
- self.children = set()
+ self.children = set()
self.unfurled = False
self.parent = parent
@@ -163,15 +163,15 @@
for c in self.children:
c.unfurl_all(build)
-
+
def realise_exports(self, build):
- """Do the things that are needed such that we can fully unfurl all
+ """Do the things that are needed such that we can fully unfurl all
sibling nodes. i.e. this step is here to "take care" of the dependencies
- between siblings.
+ between siblings.
"""
pass
-
+
def realise_makefile(self, build, specs):
makefilename_base = build.topMakefile
if self.name is not None:
@@ -190,16 +190,16 @@
key = str(makefile.path))
return makefileset
-
+
def realise(self, build):
- """Give the spec trees to the make engine and actually
- "build" the product represented by this model node"""
+ """Give the spec trees to the make engine and actually
+ "build" the product represented by this model node"""
# Must ensure that all children are unfurled at this point
self.unfurl_all(build)
- sp = self.specs
+ sp = self.specs
build.AssertBuildOK()
@@ -210,8 +210,8 @@
result = build.Make(m)
build.InfoEndTime(object_type = "layer", task = "build",
key = (str(m.directory) + "/" + str(m.filenamebase)))
-
-
+
+
return result
@@ -229,7 +229,7 @@
def makefile(self, makefilename_base, engine, named = False):
"""Makefiles for individual mmps not feasible at the moment"""
- pass # Cannot, currently, "unfurl an mmp" directly but do want
+ pass # Cannot, currently, "unfurl an mmp" directly but do want
# to be able to simulate the overall recursive unfurling of a build.
class Component(ModelNode):
@@ -252,9 +252,9 @@
class Layer(ModelNode):
- """ Some components that should be built togther
- e.g. a Layer in the system definition.
- """
+ """ Some components that should be built togther
+ e.g. a Layer in the system definition.
+ """
def __init__(self, name, componentlist=[]):
super(Layer,self).__init__(name)
self.name = name
@@ -263,11 +263,11 @@
self.children.add(Component(c))
def unfurl(self, build):
- """Discover the children of this layer. This involves parsing the component MetaData (bld.infs, mmps).
+ """Discover the children of this layer. This involves parsing the component MetaData (bld.infs, mmps).
Takes a raptor object as a parameter (build), together with a list of Configurations.
We currently have parsers that work on collections of components/bld.infs and that cannot
- parse at a "finer" level. So one can't 'unfurl' an mmp at the moment.
+ parse at a "finer" level. So one can't 'unfurl' an mmp at the moment.
Returns True if the object was successfully unfurled.
"""
@@ -300,7 +300,7 @@
def meta_realise(self, build):
"""Generate specs that can be used to "take care of" finding out more
about this metaunit - i.e. one doesn't want to parse it immediately
- but to create a makefile that will parse it.
+ but to create a makefile that will parse it.
In this case it allows bld.infs to be parsed in parallel by make."""
# insert the start time into the Makefile name?
@@ -310,44 +310,44 @@
# Pass certain CLI flags through to the makefile-generating sbs calls
cli_options = ""
-
+
if build.debugOutput == True:
cli_options += " -d"
-
+
if build.ignoreOsDetection == True:
cli_options += " -i"
-
+
if build.keepGoing == True:
cli_options += " -k"
-
+
if build.quiet == True:
cli_options += " -q"
-
+
if build.timing == True:
cli_options += " --timing"
-
+
nc = len(self.children)
number_blocks = build.jobs
block_size = (nc / number_blocks) + 1
component_blocks = []
spec_nodes = []
-
+
b = 0
childlist = list(self.children)
while b < nc:
component_blocks.append(childlist[b:b+block_size])
b += block_size
-
+
while len(component_blocks[-1]) <= 0:
component_blocks.pop()
number_blocks -= 1
-
+
build.Info("Parallel Parsing: bld.infs split into %d blocks\n", number_blocks)
- # Cause the binding makefiles to have the toplevel makefile's
- # name. The bindee's have __pp appended.
+ # Cause the binding makefiles to have the toplevel makefile's
+ # name. The bindee's have __pp appended.
tm = build.topMakefile.Absolute()
- binding_makefiles = raptor_makefile.MakefileSet(str(tm.Dir()), build.maker.selectors, makefiles=None, filenamebase=str(tm.File()))
+ binding_makefiles = raptor_makefile.MakefileSet(str(tm.Dir()), build.maker.selectors, makefiles=None, filenamebase=str(tm.File()))
build.topMakefile = generic_path.Path(str(build.topMakefile) + "_pp")
loop_number = 0
@@ -357,16 +357,16 @@
componentList = " ".join([str(c.bldinf_filename) for c in block])
-
+
configList = " ".join([c.name for c in self.configs if c.name != "build" ])
-
+
makefile_path = str(build.topMakefile) + "_" + str(loop_number)
try:
os.unlink(makefile_path) # until we have dependencies working properly
except Exception,e:
# print "couldn't unlink %s: %s" %(componentMakefileName, str(e))
pass
-
+
# add some basic data in a component-wide variant
var = raptor_data.Variant()
var.AddOperation(raptor_data.Set("COMPONENT_PATHS", componentList))
@@ -385,13 +385,13 @@
if build.noBuild:
var.AddOperation(raptor_data.Set("NO_BUILD", "1"))
specNode.AddVariant(var)
-
+
try:
interface = build.cache.FindNamedInterface("build.makefiles")
specNode.SetInterface(interface)
except KeyError:
build.Error("Can't find flm interface 'build.makefiles' ")
-
+
spec_nodes.append(specNode)
binding_makefiles.addInclude(str(makefile_path)+"_all")
@@ -430,7 +430,7 @@
M_BUILD = 1
- M_VERSION = 2
+ M_VERSION = 2
def __init__(self, home = None):
@@ -554,7 +554,7 @@
self.Warn("ignoring target %s because --what or --check is specified.\n", target)
else:
self.targets.append(target)
-
+
def AddSourceTarget(self, filename):
# source targets are sanitised and then added as if they were a "normal" makefile target
# in addition they have a default, empty, top-level target assigned in order that they can
@@ -615,7 +615,7 @@
def SetNoDependInclude(self, TrueOrFalse):
self.noDependInclude = TrueOrFalse
return True
-
+
def SetKeepGoing(self, TrueOrFalse):
self.keepGoing = TrueOrFalse
return True
@@ -669,7 +669,7 @@
return False
return True
-
+
def SetTiming(self, TrueOrFalse):
self.timing = TrueOrFalse
return True
@@ -717,9 +717,9 @@
self.Info("Set-up %s", str(self.raptorXML))
self.Info("Command-line-arguments %s", " ".join(self.args))
self.Info("Current working directory %s", os.getcwd())
-
+
# the inherited environment
- for e, value in os.environ.items():
+ for e, value in sorted( os.environ.items() ):
self.Info("Environment %s=%s", e, value.replace("]]>", "]]>"))
# and some general debug stuff
@@ -822,7 +822,7 @@
return self.home.Append(aGenericPath)
else:
return aGenericPath
-
+
# make generic paths absolute (if required)
self.configPath = map(mkAbsolute, self.configPath)
self.cache.Load(self.configPath)
@@ -859,12 +859,12 @@
return x
def GetBuildUnitsToBuild(self, configNames):
- """Return a list of the configuration objects that correspond to the
+ """Return a list of the configuration objects that correspond to the
list of configuration names in the configNames parameter.
raptor.GetBuildUnitsToBuild(["armv5", "winscw"])
>>> [ config1, config2, ... , configN ]
- """
+ """
if len(configNames) == 0:
# use default config
@@ -878,9 +878,9 @@
for c in set(configNames):
self.Debug("BuildUnit: %s", c)
- try:
+ try:
x = self.GetConfig(c)
- gb = x.GenerateBuildUnits(self.cache)
+ gb = x.GenerateBuildUnits(self.cache)
buildUnitsToBuild.update( gb )
except Exception, e:
self.FatalError(str(e))
@@ -894,7 +894,7 @@
return buildUnitsToBuild
def CheckToolset(self, evaluator, configname):
- """Check the toolset for a particular config, allow other objects access
+ """Check the toolset for a particular config, allow other objects access
to the toolset for this build (e.g. the raptor_make class)."""
if self.toolset is None:
if self.toolcheck == 'on':
@@ -968,7 +968,7 @@
def FindComponentIn(self, aDir = None):
- # look for a bld.inf
+ # look for a bld.inf
if aDir is None:
dir = generic_path.CurrentDir()
@@ -1109,14 +1109,14 @@
for a,v in dictionary.items():
atts += " " + a + "='" + v + "'"
return atts
-
+
def Info(self, format, *extras, **attributes):
"""Send an information message to the configured channel
(XML control characters will be escaped)
"""
self.out.write("<info" + self.attributeString(attributes) + ">" +
escape(format % extras) + "</info>\n")
-
+
def InfoDiscovery(self, object_type, count):
if self.timing:
try:
@@ -1124,7 +1124,7 @@
count = count))
except Exception, exception:
Error(exception.Text, function = "InfoDiscoveryTime")
-
+
def InfoStartTime(self, object_type, task, key):
if self.timing:
try:
@@ -1132,7 +1132,7 @@
task = task, key = key))
except Exception, exception:
Error(exception.Text, function = "InfoStartTime")
-
+
def InfoEndTime(self, object_type, task, key):
if self.timing:
try:
@@ -1154,7 +1154,7 @@
"""Send a warning message to the configured channel
(XML control characters will be escaped)
"""
- self.out.write("<warning" + self.attributeString(attributes) + ">" +
+ self.out.write("<warning" + self.attributeString(attributes) + ">" +
escape(format % extras) + "</warning>\n")
def FatalError(self, format, *extras, **attributes):
@@ -1165,7 +1165,7 @@
further errors are probably triggered by the first.
"""
if not self.fatalErrorState:
- self.out.write("<error" + self.attributeString(attributes) + ">" +
+ self.out.write("<error" + self.attributeString(attributes) + ">" +
(format % extras) + "</error>\n")
self.errorCode = 1
self.fatalErrorState = True
@@ -1174,7 +1174,7 @@
"""Send an error message to the configured channel
(XML control characters will be escaped)
"""
- self.out.write("<error" + self.attributeString(attributes) + ">" +
+ self.out.write("<error" + self.attributeString(attributes) + ">" +
escape(format % extras) + "</error>\n")
self.errorCode = 1
@@ -1212,7 +1212,7 @@
if self.systemDefinitionFile != None:
systemModel = raptor_xml.SystemModel(self, self.systemDefinitionFile, self.systemDefinitionBase)
layers = self.GatherSysModelLayers(systemModel, self.systemDefinitionRequestedLayers)
-
+
# Now get components specified on a commandline - build them after any
# layers in the system definition.
if len(self.commandlineComponents) > 0:
@@ -1246,7 +1246,7 @@
self.Introduction()
# establish an object cache
self.AssertBuildOK()
-
+
self.LoadCache()
# find out what configurations to build
@@ -1299,7 +1299,7 @@
for l in layers:
# create specs for a specific group of components
l.realise(self)
-
+
except BuildCannotProgressException,b:
if str(b) != "":
self.Info(str(b))
@@ -1326,7 +1326,7 @@
build.ProcessConfig()
build.CommandLine(argv)
- return build
+ return build
--- a/sbsv2/raptor/python/raptor_data.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/python/raptor_data.py Thu Jan 14 16:29:37 2010 +0000
@@ -722,15 +722,23 @@
def Apply(self, oldValue):
try:
value = os.environ[self.name]
-
- # if this value is a "path" or a "tool" then we need to make sure
- # it is a proper absolute path in our preferred format.
- if value and (self.type == "path" or self.type == "tool"):
- try:
- path = generic_path.Path(value)
- value = str(path.Absolute())
- except ValueError,e:
- raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))
+
+ if value:
+ # if this value is a "path" or a "tool" then we need to make sure
+ # it is a proper absolute path in our preferred format.
+ if self.type == "path" or self.type == "tool":
+ try:
+ path = generic_path.Path(value)
+ value = str(path.Absolute())
+ except ValueError,e:
+ raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))
+ # if this value ends in an un-escaped backslash, then it will be treated as a line continuation character
+ # in makefile parsing - un-escaped backslashes at the end of values are therefore escaped
+ elif value.endswith('\\'):
+ # an odd number of backslashes means there's one to escape
+ count = len(value) - len(value.rstrip('\\'))
+ if count % 2:
+ value += '\\'
except KeyError:
if self.default != None:
value = self.default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/pdll_arm.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,121 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+#
+
+from raptor_tests import AntiTargetSmokeTest
+
+def run():
+ t = AntiTargetSmokeTest()
+ t.usebash = True
+
+ command = "sbs -b smoke_suite/test_resources/simple_dll/pbld.inf -c %s -f -"
+ maintargets = [
+ "$(EPOCROOT)/epoc32/release/%s/udeb/createstaticpdll.dll.sym",
+ "$(EPOCROOT)/epoc32/release/%s/urel/createstaticpdll.dll.sym",
+ "$(EPOCROOT)/epoc32/release/%s/udeb/createstaticpdll.dll",
+ "$(EPOCROOT)/epoc32/release/%s/urel/createstaticpdll.dll"
+ ]
+ armv5targets = [
+ "$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll.dso",
+ "$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll{000a0000}.dso"
+ ]
+ abiv1libtargets = [
+ "$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll.lib",
+ "$(EPOCROOT)/epoc32/release/%s/lib/createstaticpdll{000a0000}.lib"
+ ]
+ buildtargets = [
+ "createstaticpdll_dll/%s/udeb/CreateStaticDLL.o",
+ "createstaticpdll_dll/%s/urel/CreateStaticDLL.o"
+ ]
+ mustmatch = [
+ r".*\busrt\d_\d\.lib\b.*",
+ r".*\bscppnwdl\.dso\b.*"
+ ]
+ mustnotmatch = [
+ ".*ksrt.*"
+ ]
+
+ # Note that ABIv1 import libraries are only generated for RVCT-based armv5
+ # builds on Windows
+
+ t.id = "0104a"
+ t.name = "pdll_armv5_rvct"
+ t.command = command % "armv5"
+ t.targets = map(lambda p: p % "armv5", maintargets + armv5targets)[:] # Shallow, as we optionally extend later and then re-use
+ t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv5", buildtargets))
+ t.mustmatch = mustmatch
+ t.mustnotmatch = mustnotmatch
+ t.run("linux")
+ if t.result == AntiTargetSmokeTest.SKIP:
+ t.targets.extend(map(lambda x: x % "armv5", abiv1libtargets))
+ t.run("windows")
+
+ t.id = "0104b"
+ t.name = "pdll_armv5_clean"
+ t.command = command % "armv5" + " clean"
+ t.targets = []
+ t.mustmatch = []
+ t.mustnotmatch = []
+ t.run()
+
+ t.id = "0104c"
+ t.name = "pdll_armv5_gcce"
+ t.command = command % "gcce_armv5"
+ t.targets = map(lambda p: p % "armv5", maintargets + armv5targets)
+ t.antitargets = map(lambda p: p % "armv5", abiv1libtargets)
+ t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv5", buildtargets))
+ t.mustmatch = mustmatch
+ t.mustnotmatch = mustnotmatch
+ t.run()
+
+ t.id = "0104d"
+ t.name = "pdll_armv5_gcce_clean"
+ t.command = command % "gcce_armv5" + " clean"
+ t.targets = []
+ t.mustmatch = []
+ t.mustnotmatch = []
+ t.run()
+
+ t.id = "0104e"
+ t.name = "pdll_armv7_rvct"
+ t.command = command % "armv7"
+ t.targets = map(lambda p: p % "armv7", maintargets)[:] # Shallow, as we optionally extend later and then re-use
+ t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv7", buildtargets))
+ t.mustmatch = mustmatch
+ t.mustnotmatch = mustnotmatch
+ t.run()
+
+ t.id = "0104f"
+ t.name = "pdll_armv7_clean"
+ t.command = command % "armv7" + " clean"
+ t.targets = []
+ t.mustmatch = []
+ t.mustnotmatch = []
+ t.run()
+
+ t.id = "0104g"
+ t.name = "pdll_armv7_gcce"
+ t.command = command % "arm.v7.udeb.gcce4_3_2 -c arm.v7.urel.gcce4_3_2"
+ t.targets = map(lambda p: p % "armv7", maintargets)
+ t.antitargets = map(lambda p: p % "armv7", abiv1libtargets)
+ t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', map(lambda p: p % "armv7", buildtargets))
+ t.mustmatch = mustmatch
+ t.mustnotmatch = mustnotmatch
+ t.run()
+
+ t.id = "104"
+ t.name = "pdll_arm"
+ t.print_result()
+ return t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/pdll_winscw.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+#
+
+from raptor_tests import SmokeTest
+
+def run():
+ t = SmokeTest()
+ t.id = "105"
+ t.name = "pdll_winscw"
+ t.command = "sbs -b smoke_suite/test_resources/simple_dll/pbld.inf -c winscw"
+ t.targets = [
+ "$(EPOCROOT)/epoc32/release/winscw/udeb/createstaticpdll.lib",
+ "$(EPOCROOT)/epoc32/release/winscw/udeb/createstaticpdll.dll",
+ "$(EPOCROOT)/epoc32/release/winscw/urel/createstaticpdll.dll",
+ "$(EPOCROOT)/epoc32/release/winscw/urel/createstaticpdll.dll.map"
+ ]
+ t.addbuildtargets('smoke_suite/test_resources/simple_dll/pbld.inf', [
+ "createstaticpdll_dll/winscw/udeb/CreateStaticDLL.o",
+ "createstaticpdll_dll/winscw/udeb/createstaticpdll.UID.CPP",
+ "createstaticpdll_dll/winscw/udeb/createstaticpdll_UID_.o",
+ "createstaticpdll_dll/winscw/urel/CreateStaticDLL.o",
+ "createstaticpdll_dll/winscw/urel/createstaticpdll.UID.CPP",
+ "createstaticpdll_dll/winscw/urel/createstaticpdll_UID_.o"
+ ])
+ t.run()
+ return t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/qt.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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:
+# This test case requires install of Qt.
+
+from raptor_tests import SmokeTest
+
+def run():
+ t = SmokeTest()
+
+ t.description = "Ensure Raptor builds Qt applications successfully"
+
+ t.id = "00xx"
+ t.name = "qt_apps"
+ t.command = "cd smoke_suite/test_resources/qt && qmake -spec symbian-sbsv2 && sbs"
+ t.targets = [
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/bld.inf",
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/helloworld.loc",
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/helloworld.rss",
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/helloworld_reg.rss",
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/helloworld_template.pkg",
+ "$(SBS_HOME)/test/smoke_suite/test_resources/qt/Makefile",
+ "$(EPOCROOT)/epoc32/release/armv5/udeb/helloworld.exe",
+ "$(EPOCROOT)/epoc32/release/armv5/udeb/helloworld.exe.map",
+ "$(EPOCROOT)/epoc32/release/armv5/urel/helloworld.exe",
+ "$(EPOCROOT)/epoc32/release/armv5/urel/helloworld.exe.map",
+ "$(EPOCROOT)/epoc32/release/winscw/udeb/helloworld.exe",
+ "$(EPOCROOT)/epoc32/release/winscw/urel/helloworld.exe",
+ "$(EPOCROOT)/epoc32/release/winscw/urel/helloworld.exe.map"
+ ]
+ t.addbuildtargets('smoke_suite/test_resources/qt/bld.inf', [
+ "helloworld_exe/armv5/udeb/helloworld.o",
+ "helloworld_exe/armv5/udeb/helloworld.o.d",
+ "helloworld_exe/armv5/urel/helloworld.o",
+ "helloworld_exe/armv5/urel/helloworld.o.d",
+ "helloworld_exe/winscw/udeb/helloworld.o",
+ "helloworld_exe/winscw/udeb/helloworld.o.d",
+ "helloworld_exe/winscw/urel/helloworld.o",
+ "helloworld_exe/winscw/urel/helloworld.o.d"
+ ])
+ t.run("windows")
+
+ return t
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/qt/helloworld.cpp Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,13 @@
+#include <QApplication>
+#include <QPushButton>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ QPushButton hello("Hello world!");
+ hello.resize(100, 30);
+
+ hello.show();
+ return app.exec();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/qt/helloworld.pro Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,8 @@
+
+TEMPLATE = app
+TARGET =
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+SOURCES += helloworld.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_dll/CREATESTATICPDLLARM.def Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,6 @@
+EXPORTS
+ _ZN10CMessenger11ShowMessageEv @ 1 NONAME
+ _ZN10CMessenger5NewLCER12CConsoleBaseRK7TDesC16 @ 2 NONAME
+ _ZTI10CMessenger @ 3 NONAME
+ _ZTV10CMessenger @ 4 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_dll/CREATESTATICPDLLWINS.def Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,4 @@
+EXPORTS
+ ?ShowMessage@CMessenger@@QAEXXZ @ 1 NONAME ; ?ShowMessage@CMessenger@@QAEXXZ
+ ?NewLC@CMessenger@@SAPAV1@AAVCConsoleBase@@ABVTDesC16@@@Z @ 2 NONAME ; ?NewLC@CMessenger@@SAPAV1@AAVCConsoleBase@@ABVTDesC16@@@Z
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_dll/CreateStaticPDLL.mmp Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+TARGET createstaticpdll.dll
+TARGETTYPE pdll
+
+UID 0xE800004C
+CAPABILITY All -TCB
+
+
+VENDORID 0x70000001
+
+SOURCEPATH .
+SOURCE CreateStaticDLL.cpp
+
+#ifdef ARMV6
+SOURCE armv6_specific.cpp
+#endif
+#ifdef ARMV7
+SOURCE armv7_specific.cpp
+#endif
+
+USERINCLUDE .
+SYSTEMINCLUDE /epoc32/include
+
+LIBRARY euser.lib
+
+#if defined(WINS)
+ deffile ./CREATESTATICPDLLWINS.def
+#elif defined(MARM)
+ deffile ./CREATESTATICPDLLARM.def
+#endif
+nostrictdef
+
+#include "../inc/macrotests.mmh"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_dll/pbld.inf Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Component description file
+*
+*/
+
+
+PRJ_PLATFORMS
+ARMV5 ARMV6 ARMV7 ARMV5SMP WINSCW
+
+PRJ_MMPFILES
+
+CreateStaticPDLL.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/timing_tests/parse_time_exports_mmps.py Thu Jan 14 16:29:37 2010 +0000
@@ -0,0 +1,77 @@
+
+from raptor_tests import SmokeTest, ReplaceEnvs
+import os
+
+def generate_files():
+ try:
+ os.makedirs(ReplaceEnvs("$(SBS_HOME)/test/timing_tests/test_resources/parse_time"))
+ except:
+ pass
+ bldinf_path = ReplaceEnvs("$(SBS_HOME)/test/timing_tests/test_resources/parse_time/bld.inf")
+ bldinf = open(bldinf_path, "w")
+ bldinf_content = """prj_mmpfiles
+"""
+ test_dir = ReplaceEnvs("$(SBS_HOME)/test/timing_tests/test_resources/parse_time")
+ for number in range(0, 250):
+ mmp_path = ("parse_timing_" + str(number).zfill(3) + ".mmp")
+ mmp_file = open((test_dir + "/" + mmp_path), "w")
+ mmp_file.write("""targettype none
+""")
+ mmp_file.close()
+ bldinf_content += (mmp_path + "\n")
+
+ bldinf_content += "\nprj_exports\n"
+
+ for number1 in range(0, 10):
+ source_dir = ("export_source_" + str(number1))
+ try:
+ os.mkdir(test_dir + "/" + source_dir)
+ except:
+ pass
+
+ for number2 in range (0, 10):
+ source_file = ("/file_" + str(number2) + ".txt ")
+ export_file = open((test_dir + "/" + source_dir + source_file), "w")
+ export_file.write(str(number2))
+ export_file.close()
+
+ for number3 in range (0, 10):
+ dest_dir = ("epoc32/include/export_destination_" + \
+ str(number1) + str(number2) + str(number3))
+
+ for number4 in range(0, 10):
+ bldinf_content += source_dir + source_file + dest_dir + \
+ "/export_destination_" + str(number4) + "\n"
+ bldinf.write(bldinf_content)
+ bldinf.close()
+
+
+def delete_files():
+ import shutil
+
+ test_dir = ReplaceEnvs("$(SBS_HOME)/test/timing_tests/test_resources/parse_time")
+ objects = os.listdir(test_dir)
+ for object in objects:
+ object_path = (test_dir + "/" + object)
+ if os.path.isfile(object_path):
+ os.remove(object_path)
+ else:
+ shutil.rmtree(object_path)
+
+
+def run():
+
+ generate_files()
+
+ t = SmokeTest()
+
+ t.id = "1"
+ t.name = "parse_time_exports_mmps"
+ t.description = """Test to measure time taken to parse a large number of
+ exports and mmps"""
+ t.command = "sbs -b timing_tests/test_resources/parse_time/bld.inf -n " + \
+ "-c armv5_urel --toolcheck=off --timing"
+ t.run()
+
+ delete_files()
+ return t
--- a/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Thu Jan 14 16:29:37 2010 +0000
@@ -30,24 +30,18 @@
def SetEnv(self, name, value):
- # set environment variable and remember the old value
-
- try:
- old = os.environ[name]
- self.envStack[name] = old
- os.environ[name] = value
- except KeyError:
- self.envStack[name] = None # was not defined
+ # set environment variable and remember the old value (if there is one)
+ if os.environ.has_key(name):
+ self.envStack[name] = os.environ[name]
+ os.environ[name] = value
def RestoreEnv(self, name):
# put environment back to its state before SetEnv
- saved = self.envStack[name]
-
- if saved == None:
+ if self.envStack.has_key(name):
+ os.environ[name] = self.envStack[name]
+ else:
del os.environ[name] # was not defined
- else:
- os.environ[name] = saved
def testSimpleSpecification(self):
@@ -359,6 +353,32 @@
# test the Resolve wrt EPOCROOT
varcfg = eval.Resolve("VARIANT_CFG")
self.assertEqual(varcfg, "/C/variant/variant.cfg")
+
+ def testProblematicEnvironment(self):
+ # ask for environment variable values that will break makefile parsing due to
+ # backslashes forming line continuation characters
+ self.SetEnv("ENVVAR_BSLASH_END1", "C:\\test1a\\;C:\\test1b\\")
+ self.SetEnv("ENVVAR_BSLASH_END2", "C:\\test2a\\;C:\\test2b\\\\")
+ self.SetEnv("ENVVAR_BSLASH_END3", "C:\\test3a\\;C:\\test3b\\\\\\")
+ var = raptor_data.Variant("my.var")
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END1"))
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END2"))
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END3"))
+
+ aRaptor = raptor.Raptor()
+ eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0])
+ self.RestoreEnv("ENVVAR_BSLASH_END1")
+ self.RestoreEnv("ENVVAR_BSLASH_END2")
+ self.RestoreEnv("ENVVAR_BSLASH_END3")
+
+ value = eval.Get("ENVVAR_BSLASH_END1")
+ self.assertEqual(value, "C:\\test1a\\;C:\\test1b\\\\")
+
+ value = eval.Get("ENVVAR_BSLASH_END2")
+ self.assertEqual(value, "C:\\test2a\\;C:\\test2b\\\\")
+
+ value = eval.Get("ENVVAR_BSLASH_END3")
+ self.assertEqual(value, "C:\\test3a\\;C:\\test3b\\\\\\\\")
def testMissingEnvironment(self):
# ask for an environment variable that is not set
--- a/sbsv2/raptor/util/install-windows/raptorinstallermaker.py Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/util/install-windows/raptorinstallermaker.py Thu Jan 14 16:29:37 2010 +0000
@@ -30,40 +30,51 @@
tempdir = ""
parser = optparse.OptionParser()
-parser.add_option("-s", "--sbs_home", dest="sbs_home",
+parser.add_option("-s", "--sbs-home", dest="sbshome",
+ help="Path to use as SBS_HOME environment variable. If not present the script exits.")
+parser.add_option("-w", "--win32-support", dest="win32support",
help="Path to use as SBS_HOME environment variable. If not present the script exits.")
(options, args) = parser.parse_args()
-if options.sbs_home == None:
+if options.sbshome == None:
print "ERROR: no SBS_HOME passed in. Exiting..."
sys.exit(2)
+if options.win32support == None:
+ print "ERROR: no win32support directory specified. Unable to proceed. Exiting..."
+ sys.exit(2)
+else:
+ # Required irectories inside the win32-support repository
+ win32supportdirs = ["bv", "cygwin", "mingw", "python252"]
+ for dir in win32supportdirs:
+ if not os.path.isdir(os.path.join(options.win32support, dir)):
+ print "ERROR: directory %s does not exist. Cannot build installer. Exiting..."
+ sys.exit(2)
def parseconfig(xmlFile="raptorinstallermaker.xml"):
pass
-def generateinstallerversionheader(sbs_home = None):
- os.environ["SBS_HOME"] = sbs_home
- os.environ["PATH"] = os.path.join(os.environ["SBS_HOME"], "bin") + os.pathsep + os.environ["PATH"]
+def generateinstallerversionheader(sbshome = None):
+ shellenv = os.environ.copy()
+ shellenv["PYTHONPATH"] = os.path.join(os.environ["SBS_HOME"], "python")
- versioncommand = "sbs -v"
+ raptorversioncommand = "python -c \"import raptor_version; print raptor_version.numericversion()\""
- # Raptor version string looks like this
- # sbs version 2.5.0 [2009-02-20 release]
+ # Raptor version is obtained from raptor_version module's numericversion function.
sbs_version_matcher = re.compile(".*(\d+\.\d+\.\d+).*", re.I)
# Create Raptor subprocess
- sbs = subprocess.Popen(versioncommand, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-
+ versioncommand = subprocess.Popen(raptorversioncommand, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=shellenv)
+ raptorversion = ""
# Get all the lines matching the RE
- for line in sbs.stdout.readlines():
+ for line in versioncommand.stdout.readlines():
res = sbs_version_matcher.match(line)
if res:
raptorversion = res.group(1)
print "Successfully determined Raptor version %s" % raptorversion
- sbs.wait() # Wait for process to end
+ versioncommand.wait() # Wait for process to end
raptorversion_nsis_header_string = "# Raptor version file\n\n!define RAPTOR_VERSION %s\n" % raptorversion
@@ -94,11 +105,16 @@
global tempdir
print "Cleaning up temporary directory %s" % tempdir
shutil.rmtree(tempdir,True)
+ try:
+ os.remove("raptorversion.nsh")
+ print "Successfully deleted raptorversion.nsh."
+ except:
+ print "ERROR: failed to remove raptorversion.nsh - remove manually if needed."
print "Done."
makensispath = unzipnsis(".\\NSIS.zip")
-generateinstallerversionheader(options.sbs_home)
-nsiscommand = makensispath + " /DRAPTOR_LOCATION=%s raptorinstallerscript.nsi" % options.sbs_home
+generateinstallerversionheader(options.sbshome)
+nsiscommand = makensispath + " /DRAPTOR_LOCATION=%s /DWIN32SUPPORT=%s raptorinstallerscript.nsi" % (options.sbshome, options.win32support)
print "nsiscommand = %s" % nsiscommand
runmakensis(nsiscommand)
cleanup()
--- a/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi Thu Jan 14 16:03:18 2010 +0000
+++ b/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi Thu Jan 14 16:29:37 2010 +0000
@@ -114,6 +114,14 @@
File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\schema\*.*
SetOutPath "$INSTDIR\win32"
File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\win32\*.*
+ SetOutPath "$INSTDIR\win32\bv"
+ File /r /x distribution.policy.s60 /x .hg ${WIN32SUPPORT}\bv\*.*
+ SetOutPath "$INSTDIR\win32\cygwin"
+ File /r /x distribution.policy.s60 /x .hg ${WIN32SUPPORT}\cygwin\*.*
+ SetOutPath "$INSTDIR\win32\mingw"
+ File /r /x distribution.policy.s60 /x .hg ${WIN32SUPPORT}\mingw\*.*
+ SetOutPath "$INSTDIR\win32\python252"
+ File /r /x distribution.policy.s60 /x .hg ${WIN32SUPPORT}\python252\*.*
SetOutPath "$INSTDIR"
File ${RAPTOR_LOCATION}\RELEASE-NOTES.txt