# HG changeset patch # User tnmurphy@4GBL06592.nokia.com # Date 1258403977 0 # Node ID 593a8820b91278789463eac3e03ea6d313363ede # Parent e1eecf4d390db36d5bd76d0ba16f5c782838f103 Team Wip branch Perforce: 1736581 diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/bin/sbs_filter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/bin/sbs_filter.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,83 @@ +#!/usr/bin/python + +# 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 "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +import os +import sys +import traceback + +# intercept the -h option +if "-h" in sys.argv or "--help" in sys.argv: + print "usage:", sys.argv[0], "[sbs options]" + print " The log data is read from stdin." + print " Type 'sbs -h' for a list of sbs options." + sys.exit(0) + +# get the absolute path to this script +script = os.path.abspath(sys.argv[0]) + +# add the Raptor python directory to the PYTHONPATH +sys.path.append(os.path.join(os.path.dirname(script), "..", "python")) + +# now we should be able to find the raptor modules +import raptor +import pluginbox + +# make sure that HOSTPLATFORM is set +if not "HOSTPLATFORM" in os.environ: + sys.stderr.write("HOSTPLATFORM is not set ... try running gethost.sh\n") + sys.exit(1) + +if not "HOSTPLATFORM_DIR" in os.environ: + sys.stderr.write("HOSTPLATFORM_DIR is not set ... try running gethost.sh\n") + sys.exit(1) + +# construct a Raptor object from our command-line (less the name of this script) +the_raptor = raptor.Raptor.CreateCommandlineBuild(sys.argv[1:]) + +# from Raptor.OpenLog() +try: + # Find all the raptor plugins and put them into a pluginbox. + if not the_raptor.systemPlugins.isAbsolute(): + the_raptor.systemPlugins = the_raptor.home.Append(the_raptor.systemPlugins) + + pbox = pluginbox.PluginBox(str(the_raptor.systemPlugins)) + raptor_params = raptor.BuildStats(the_raptor) + + # Open the requested plugins using the pluginbox + the_raptor.out.open(raptor_params, the_raptor.filterList.split(','), pbox) + +except Exception, e: + sys.stderr.write("filter exception: %s\n" % str(e)) + traceback.print_ex() + sys.exit(1) + +# read stdin a line at a time and pass it to the Raptor object +line = " " +while line: + line = sys.stdin.readline() + the_raptor.out.write(line) + +# from Raptor.CloseLog() +if not the_raptor.out.summary(): + the_raptor.errorCode = 1 + +if not the_raptor.out.close(): + the_raptor.errorCode = 1 + +# return the error code +sys.exit(the_raptor.errorCode) + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/config/arm.xml --- a/sbsv2/raptor/lib/config/arm.xml Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/config/arm.xml Mon Nov 16 20:39:37 2009 +0000 @@ -119,6 +119,9 @@ + + + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/config/locations.xml --- a/sbsv2/raptor/lib/config/locations.xml Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/config/locations.xml Mon Nov 16 20:39:37 2009 +0000 @@ -77,6 +77,7 @@ + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/config/variants.xml --- a/sbsv2/raptor/lib/config/variants.xml Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/config/variants.xml Mon Nov 16 20:39:37 2009 +0000 @@ -10,6 +10,7 @@ + @@ -17,11 +18,12 @@ + + + + + - - - - @@ -33,33 +35,33 @@ - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - + + + - - - - + + + + @@ -99,8 +101,8 @@ - - + + @@ -123,7 +125,12 @@ - + + + + + + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/bitmap.flm --- a/sbsv2/raptor/lib/flm/bitmap.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/bitmap.flm Mon Nov 16 20:39:37 2009 +0000 @@ -60,7 +60,7 @@ BMCONVCMDFILE:=$(OUTPUTPATH)/$(BMTARGET)_bmconvcommands RELEASEABLES:=$(BITMAPHEADER) $(BITMAPFILE) -CLEANTARGETS:=$(BITMAPHEADER) $(BITMAPFILE) $(BMCONVCMDFILE) +CLEANTARGETS:=$(BMCONVCMDFILE) # The groupbmpin10 macro allows us to construct a command file, 10 # bitmap objects at a time to avoid limits on argument lengths and @@ -107,7 +107,6 @@ $(GNUCP) $$< $$@ \ $(call endrule,bitmapcopy) -CLEANTARGETS:=$(CLEANTARGETS) $(MBMCOPYFILES) endef @@ -140,8 +139,7 @@ $(call startrule,bmpfilecopy,FORCESUCCESS) \ $(GNUCP) $(1) $(2) && $(GNUCHMOD) +rw $(2) \ $(call endrule,bmpfilecopy) - -CLEANTARGETS:=$$(CLEANTARGETS) $(2) + endif BMPCOPYFILES:=$$(BMPCOPYFILES) $(2) @@ -163,8 +161,6 @@ @if [ ! -d $(EPOCROOT)/epoc32/localisation/group ]; then $(GNUMKDIR) -p $(EPOCROOT)/epoc32/localisation/group; fi @if [ ! -f $$@ ]; then echo "DATADIR: /$(BMBASENAME)" > $$@ ; fi @echo -e "\n/z$(TARGETPATH)/$(BMTARGET) : $(DEPTHBMP)" >> $$@ - -CLEANTARGETS:=$$(CLEANTARGETS) $(INFOFILE) endef $(eval $(call bmpInfo)) @@ -172,11 +168,11 @@ # end of localisation ######################################################### ## Clean up -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS) ,$(CREATABLEPATHS))) +$(call raptor_clean,$(CLEANTARGETS)) $(call makepath,$(CREATABLEPATHS)) $(call makepathfor,$(BITMAPHEADER)) # for the abld -what target BMPRELEASEABLES:=$(RELEASEABLES) $(MBMCOPYFILES) $(BMPCOPYFILES) $(INFOFILE) -$(eval $(call whatmacro,$(BMPRELEASEABLES),WHATBITMAP)) +$(call raptor_release,$(BMPRELEASEABLES),BITMAP) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/build.flm --- a/sbsv2/raptor/lib/flm/build.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/build.flm Mon Nov 16 20:39:37 2009 +0000 @@ -24,36 +24,31 @@ .PHONY:: PP_EXPORTS +ifneq ($(filter win,$(HOSTPLATFORM)),) +SBS:=$(subst \,/,$(SBS_HOME)/bin/sbs.bat) +else +SBS:=$(SBS_HOME)/bin/sbs +endif -SBS := $(subst \,/,$(SBS_HOME)/bin/sbs) define doexports PP_EXPORTS:: $(call startrule,makefile_generation_exports) \ - export TALON_DESCRAMBLE=0; \ - $(SBS) --export-only $(component_list) $(config_list) -f- -m $(SBS_BUILD_DIR)/makefiles_export.mk $(cli_options) --mo=DESCRAMBLE:= --mo=TALON_DESCRAMBLE:=0 | $(GNUSED) 's#]I*]>#XXX#' \ + $(SBS) --pp=slave --toolcheck=off --export-only $(component_list) $(config_list) -f- -m $(MAKEFILE_PATH).exports $(cli_options) \ $(call endrule,makefile_generation_exports) -CLEANTARGETS:=$$(CLEANTARGETS) $(SBS_BUILD_DIR)/makefiles_export.mk +CLEANTARGETS:=$$(CLEANTARGETS) $(MAKEFILE_PATH).exports endef # Generate makefiles for particular bldinf # $(1) = source target source target...... define generate_makefiles -$$(info XXX component_list=$(COMPONENT_PATHS) makefile=$(MAKEFILE_PATH)) - -ifeq ($(NO_BUILD),1) ALL:: $(MAKEFILE_PATH) -else -include $(MAKEFILE_PATH) -endif $(MAKEFILE_PATH): $(COMPONENT_PATHS) | PP_EXPORTS $(call startrule,makefile_generation) \ - export TALON_DESCRAMBLE=0; \ - $(SBS) --toolcheck=off -n $(CLI_OPTIONS) $(component_list) $(config_list) -m $$@ -f- --mo=DESCRAMBLE:= --mo=TALON_DESCRAMBLE:=0 | $(GNUSED) 's#\]\][>]#XXX#' && \ - $(MAKE) -j 8 -f $$@.resource_deps \ + $(SBS) --pp=slave --toolcheck=off -n $(CLI_OPTIONS) $(component_list) $(config_list) -m $$@ -f- \ $(call endrule,makefile_generation) CLEANTARGETS:=$$(CLEANTARGETS) $(MAKEFILE_PATH) @@ -63,13 +58,15 @@ # Create config list for commands config_list:=$(addprefix -c ,$(CONFIGS)) component_list:=$(addprefix -b ,$(COMPONENT_PATHS)) -$(info COMFIG_LIST: $(config_list)) +$(info build.flm: configlist: $(config_list)) $(eval $(doexports)) # Create the Makefiles $(eval $(call generate_makefiles)) +CREATABLEPATHS:=$(CREATABLEPATHS) $(dir $(MAKEFILE_PATH)) + $(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS),)) $(call makepath,$(CREATABLEPATHS)) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/e32abiv2.flm --- a/sbsv2/raptor/lib/flm/e32abiv2.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/e32abiv2.flm Mon Nov 16 20:39:37 2009 +0000 @@ -279,9 +279,6 @@ $(call startrule,importlibtarget_unfrozen,FORCESUCCESS) \ $(GNUCP) $$(call dblquote,$$<) $$(call dblquote,$$@) \ $(call endrule,importlibtarget_unfrozen) - - CLEANTARGETS:=$$(CLEANTARGETS) $(IMPORTLIBTARGET_DSO) - endef define importlibtarget_unfrozen_ver @@ -289,8 +286,6 @@ $(call startrule,importlibversioned_unfrozen,FORCESUCCESS) \ $(GNUCP) "$(GENERATED_DSO)" "$$@" \ $(call endrule,importlibversioned_unfrozen) - - CLEANTARGETS:=$$(CLEANTARGETS) $(IMPORTLIBTARGET_DSO) endef ifeq ($(EXPLICITVERSION),) @@ -307,8 +302,6 @@ $(call startrule,importlibtarget,FORCESUCCESS) \ $(GNUCP) "$$<" "$$@" \ $(call endrule,importlibtarget) - - CLEANTARGETS:=$$(CLEANTARGETS) $(IMPORTLIBTARGET_DSO) endef ifeq ($(EXPLICITVERSION),) @@ -325,8 +318,6 @@ --dso=$$(call dblquote,$$@) \ --linkas=$(call dblquote,$(LINKASVERSIONED)) \ $(call endrule,importlibversioned) - - CLEANTARGETS:=$$(CLEANTARGETS) $(IMPORTLIBTARGETVERSIONED_DSO) endef $(eval $(importlibtargetversioned_func)) endif # ifneq ($(DEFFILE),) @@ -335,7 +326,6 @@ # ABIv1 .lib ifneq ($(IMPORTLIBTARGETVERSIONED_LIB),) # check that we haven't tried to specify this target already - CLEANTARGETS:=$(CLEANTARGETS) $(IMPORTLIBTARGETVERSIONED_LIB) $(IMPORTLIBTARGET_LIB) define abiv1_generatelib @@ -534,7 +524,7 @@ endef $(eval $(artarget_func)) -CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) $(ARTARGET) $(if $(DUMPBCINFO),$(ARTARGET).elfdump,) +CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) $(if $(DUMPBCINFO),$(ARTARGET).elfdump,) endif @@ -624,9 +614,7 @@ endef $(eval $(linktarget_func)) -CLEANTARGETS:=$(CLEANTARGETS) $(LINK_TARGET) $(if $(GENERATELINKERFEEDBACK),$(FEEDBACKFILE)) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT)) -CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) -CLEANTARGETS:=$(CLEANTARGETS) $(MAPFILE) +CLEANTARGETS:=$(CLEANTARGETS) $(VIAFILE) $(if $(GENERATELINKERFEEDBACK),$(FEEDBACKFILE)) $(if $(MULTIFILE_ENABLED),$(MULTIFILEOBJECT)) WHATRELEASE:=$(WHATRELEASE) $(MAPFILE) endif # if TARGETTYPE lib @@ -1132,7 +1120,6 @@ PREVIOUSVARIANTTYPE:=$(VARIANTTYPE) WHATRELEASE:=$(WHATRELEASE) $(ROMFILENAME) - CLEANTARGETS:=$(CLEANTARGETS) $(ROMFILENAME) endif # Deal with test code batch files generation. @@ -1143,7 +1130,6 @@ BATCHFILE_CREATED_$(EPOCROOT)/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).$(TESTPATH):=1 TARGET_CREATED_$(EPOCROOT)/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).$(TESTPATH)_$(TARGET):=1 WHATRELEASE:=$(WHATRELEASE) $(EPOCROOT)/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).$(TESTPATH) - CLEANTARGETS:=$(CLEANTARGETS) $(EPOCROOT)/epoc32/data/z/test/$(MODULE)/$(VARIANTPLATFORM).$(TESTPATH) endif ###################### End of Build ROMFILE target ###################### @@ -1183,10 +1169,10 @@ $(call makepath,$(CREATABLEPATHS)) ## Clean up -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS) ,$(CREATABLEPATHS),)) +$(call raptor_clean,$(CLEANTARGETS)) -# For the abld -what target -$(eval $(call whatmacro,$(filter-out %.sym,$(WHATRELEASE)),WHATARMV5)) +# For the --what option and the log file +$(call raptor_release,$(filter-out %.sym,$(WHATRELEASE))) endif # FEATUREVARIANTNAME=="" or FEATUREVARIANT==1 diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/gccxml.flm --- a/sbsv2/raptor/lib/flm/gccxml.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/gccxml.flm Mon Nov 16 20:39:37 2009 +0000 @@ -92,7 +92,7 @@ TEMPGXPARCHIVE:=$(VARIANTBLDPATH)/$(TARGET)$(BASE_TYPE).gxp GXPARCHIVE:=$(VARIANTRELEASEPATH)/$(TARGET)$(BASE_TYPE).gxp -CLEANTARGETS:=$(CLEANTARGETS) $(MMPXMLFILE) $(SRCXMLFILES) $(DEPFILES) $(TEMPGXPARCHIVE) $(GXPARCHIVE) +CLEANTARGETS:=$(CLEANTARGETS) $(MMPXMLFILE) $(SRCXMLFILES) $(DEPFILES) $(TEMPGXPARCHIVE) RELEASABLES:=$(RELEASABLES) $(GXPARCHIVE) # Deduce whether we should be performing a build with standard CPP characteristics @@ -252,6 +252,6 @@ TARGET:: $(RELEASABLES) # clean up -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS),)) +$(call raptor_clean,$(CLEANTARGETS)) $(call makepath, $(CREATABLEPATHS)) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/msvctools.flm --- a/sbsv2/raptor/lib/flm/msvctools.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/msvctools.flm Mon Nov 16 20:39:37 2009 +0000 @@ -28,7 +28,6 @@ $(call makepath,$(RELEASEPATH)) $(call makepath,$(BUILDPATH)) -CLEANTARGETS:=$(CLEANTARGETS) $(RELEASETARGET) RELEASEABLES:=$(RELEASEABLES) $(RELEASETARGET) GENDEBUGINFO:=$(if $(findstring deb,$(VARIANTTYPE)),1,) @@ -157,7 +156,6 @@ ifneq ($(INSTALLPATH),) INSTALLTARGET:=$(INSTALLPATH)/$(TARGET).$(if $(REQUESTEDTARGETEXT),$(REQUESTEDTARGETEXT),$(TARGETTYPE)) - CLEANTARGETS:=$(CLEANTARGETS) $(INSTALLTARGET) RELEASEABLES:=$(RELEASEABLES) $(INSTALLTARGET) define msvctoolsinstall @@ -180,7 +178,7 @@ ifneq ($(GENDEBUGINFO),) BSCFILE:=$(RELEASEPATH)/$(TARGET).bsc BSCRESPONSEFILE:=$(BUILDPATH)/$(TARGET).brf - CLEANTARGETS:=$(CLEANTARGETS) $(BSCFILE) $(BSCRESPONSEFILE) + CLEANTARGETS:=$(CLEANTARGETS) $(BSCRESPONSEFILE) RELEASEABLES:=$(RELEASEABLES) $(BSCFILE) define msvctoolsgenbrowse @@ -207,6 +205,6 @@ endif # clean up -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),,)) -# for the abld -what target -$(eval $(call whatmacro,$(INSTALLTARGET),WHATTOOLS)) +$(call raptor_clean,$(CLEANTARGETS)) +# for the --what option and the log file +$(call raptor_release,$(INSTALLTARGET)) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/resource.flm --- a/sbsv2/raptor/lib/flm/resource.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/resource.flm Mon Nov 16 20:39:37 2009 +0000 @@ -101,8 +101,6 @@ @if [ ! -f $$@ ]; then echo "DATADIR: /$(RSSBASENAME)" > $$@ ; fi @echo -e "\n/z$(TARGETPATH)/$(TARGET_lower).rsc : $(RSSBASENAME).rpp" >> $$@ -CLEANTARGETS:=$$(CLEANTARGETS) $(DESTRPP) $(INFOFILE) - endif endef @@ -174,7 +172,6 @@ ifeq ($(TARGET_$(call sanitise,$2)),) TARGET_$(call sanitise,$2):=1 - CLEANTARGETS:=$$(CLEANTARGETS) $2 RESOURCE:: $2 ## perform additional copies of binaries @@ -201,7 +198,6 @@ ifeq ($(TARGET_$(call sanitise,$1)),) TARGET_$(call sanitise,$1):=1 - CLEANTARGETS:=$$(CLEANTARGETS) $(1) $(if $(FLMDEBUG),$(info generateresource: $(1) from $(2) LANG:$(3)),) @@ -236,7 +232,6 @@ ifeq ($(TARGET_$(call sanitise,$1)),) TARGET_$(call sanitise,$1):=1 - CLEANTARGETS:= $$(CLEANTARGETS) $(1) $(if $(FLMDEBUG),$(info resourceheader: $(1) from $(2) LANG:$(3))) RESOURCE:: $(1) @@ -282,7 +277,6 @@ ifneq ($(RFIFILE),) RESOURCE:: $(RFIFILE) RELEASABLES:=$(RELEASABLES) $(RFIFILE) - CLEANTARGETS:=$(CLEANTARGETS) $(RFIFILE) CREATABLEPATHS:=$(CREATABLEPATHS) $(dir $(RFIFILE)) RPPFILES:=$(foreach L,$(LANGUAGES:SC=sc),$(INTERBASE)_$(L).rpp) @@ -291,11 +285,11 @@ ## Clean up -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS),)) +$(call raptor_clean,$(CLEANTARGETS)) # make the output directories while reading makefile - some build engines prefer this $(call makepath,$(CREATABLEPATHS)) -# for the abld -what target +# for the --what option and the log file RELEASABLES:=$(RELEASABLES) $(DESTRPP) $(INFOFILE) -$(eval $(call whatmacro,$(RELEASABLES),WHATRESOURCES)) +$(call raptor_release,$(RELEASABLES),RESOURCE) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/run.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/lib/flm/run.mk Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,39 @@ +.PHONY:: ALL +ALL:: # Default target + +HOSTPLATFORM:=win 32 +HOSTPLATFORM_DIR:=win32 +OSTYPE:=cygwin +FLMHOME:=E:/wip2/lib/flm +SHELL:=E:/wip2/win32/cygwin/bin/sh.exe + + +USE_TALON:= + + + +include E:/wip2/lib/flm/globals.mk + +# dynamic default targets + +# call E:/wip2/lib/flm/config/default.flm +SBS_SPECIFICATION:=Symbian.config.default +SBS_CONFIGURATION:=armv5_urel + +EPOCROOT:=E:/wip2/test/epocroot +ELF2E32:=E:/wip2/test/epocroot/epoc32/tools/elf2e32.exe +WHATLOG:= +include E:/wip2/lib/flm/config/default.flm + + +component_paths:=$(SBS_HOME)/test/smoke_suite/test_resources/simple/bld.inf|c:/make_test/a.mk \ +$(SBS_HOME)/test/smoke_suite/test_resources/simple_dll/bld.inf|c:/make_test/b.mk \ +$(SBS_HOME)/test/smoke_suite/test_resources/simple/always_build_as_arm_bld.inf|c:/make_test/c.mk \ +$(SBS_HOME)/test/smoke_suite/test_resources/simple/debuggable_bld.inf|c:/make_test/d.mk \ +$(SBS_HOME)/test/smoke_suite/test_resources/simple_export/bld.inf|c:/make_test/e.mk + +configs:=armv5 armv7 + +cli_options:=-d + +include build.flm diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/stringtable.flm --- a/sbsv2/raptor/lib/flm/stringtable.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/stringtable.flm Mon Nov 16 20:39:37 2009 +0000 @@ -33,9 +33,7 @@ EXPORT:: - CLEANTARGETS:= -CLEANEXPORTS:= RELEASEEXPORTS:= CREATABLEPATHS:=$(OUTPUTPATH) $(EXPORTPATH) @@ -60,7 +58,6 @@ $(GNUCP) '$(STRINGTABLEHEADER)' '$$@' \ $(call endrule,exportstringtableheader) -CLEANEXPORTS:=$(EXPORTEDSTRINGTABLEHEADER) RELEASEEXPORTS:=$(EXPORTEDSTRINGTABLEHEADER) endef @@ -83,24 +80,9 @@ $(eval $(genstringtable)) -## Clean up and log releasables (using eval to avoid target specific variables) -$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(CREATABLEPATHS),)) -$(eval $(call GenerateStandardCleanTarget,$(CLEANEXPORTS),,CLEANEXPORT)) +## Clean up and log releasables +$(call raptor_clean,$(CLEANTARGETS)) # make the output directories while reading makefile - some build engines prefer this $(call makepath,$(CREATABLEPATHS)) -$(eval $(call whatmacro,$(RELEASEEXPORTS),WHATSTRINGTABLE)) +$(call raptor_release,$(RELEASEEXPORTS),STRINGTABLE) -######################## -# SBSv1 example: -######################## -# GENERATED_FILES= \ -# $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.cpp \ -# $(EPOCROOT)epoc32\include\WspParamConstants.h -# -# $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.cpp : ..\strings\WspParamConstants.st -# perl -S ecopyfile.pl ..\strings\WspParamConstants.st $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.st -# perl $(EPOCROOT)epoc32\tools\stringtable.pl $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.st -# -# $(EPOCROOT)epoc32\include\WspParamConstants.h : $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.cpp -# perl -S ecopyfile.pl $(EPOCROOT)epoc32\build\generated\http\WspParamConstants.h $(EPOCROOT)epoc32\include\WspParamConstants.h -# diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/lib/flm/tools2common.flm --- a/sbsv2/raptor/lib/flm/tools2common.flm Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/lib/flm/tools2common.flm Mon Nov 16 20:39:37 2009 +0000 @@ -99,9 +99,9 @@ # make the output directories while reading makefile - some build engines prefer this $(call makepath,$(CREATABLEPATHS)) -## Clean up (using eval to avoid target specific variables) -$(eval $(call GenerateStandardCleanTarget,$(TARGETS) $(OBJECTFILES),$(CREATABLEPATHS),)) -## WHAT target -$(eval $(call whatmacro,$(RELEASEABLES),WHATTOOLS2)) +## Clean up +$(call raptor_clean,$(CLEANTARGETS) $(OBJECTFILES)) +## for the --what option and the log file +$(call raptor_release,$(RELEASEABLES)) ## The End diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/bash Binary file sbsv2/raptor/linux-i386/bin/bash has changed diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/bashbug --- a/sbsv2/raptor/linux-i386/bin/bashbug Mon Nov 16 09:46:46 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,272 +0,0 @@ -#!/bin/sh - -# -# bashbug - create a bug report and mail it to the bug address -# -# The bug address depends on the release status of the shell. Versions -# with status `devel', `alpha', `beta', or `rc' mail bug reports to -# chet@cwru.edu and, optionally, to bash-testers@cwru.edu. -# Other versions send mail to bug-bash@gnu.org. -# -# Copyright (C) 1996-2004 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -# -# configuration section: -# these variables are filled in by the make target in Makefile -# -MACHINE="i686" -OS="linux-gnu" -CC="gcc" -CFLAGS=" -DPROGRAM='bash' -DCONF_HOSTTYPE='i686' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu' -DCONF_VENDOR='pc' -DLOCALEDIR='/opt/symbian/linux-i386/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -O2 -mtune=i686 -s" -RELEASE="3.2" -PATCHLEVEL="39" -RELSTATUS="release" -MACHTYPE="i686-pc-linux-gnu" - -PATH=/bin:/usr/bin:/usr/local/bin:$PATH -export PATH - -# Check if TMPDIR is set, default to /tmp -: ${TMPDIR:=/tmp} - -#Securely create a temporary directory for the temporary files -TEMPDIR=$TMPDIR/bbug.$$ -(umask 077 && mkdir $TEMPDIR) || { - echo "$0: could not create temporary directory" >&2 - exit 1 -} - -TEMPFILE1=$TEMPDIR/bbug1 -TEMPFILE2=$TEMPDIR/bbug2 - -USAGE="Usage: $0 [--help] [--version] [bug-report-email-address]" -VERSTR="GNU bashbug, version ${RELEASE}.${PATCHLEVEL}-${RELSTATUS}" - -do_help= do_version= - -while [ $# -gt 0 ]; do - case "$1" in - --help) shift ; do_help=y ;; - --version) shift ; do_version=y ;; - --) shift ; break ;; - -*) echo "bashbug: ${1}: invalid option" >&2 - echo "$USAGE" >& 2 - exit 2 ;; - *) break ;; - esac -done - -if [ -n "$do_version" ]; then - echo "${VERSTR}" - exit 0 -fi - -if [ -n "$do_help" ]; then - echo "${VERSTR}" - echo "${USAGE}" - echo - cat << HERE_EOF -Bashbug is used to send mail to the Bash maintainers -for when Bash doesn't behave like you'd like, or expect. - -Bashbug will start up your editor (as defined by the shell's -EDITOR environment variable) with a preformatted bug report -template for you to fill in. The report will be mailed to the -bash maintainers by default. See the manual for details. - -If you invoke bashbug by accident, just quit your editor without -saving any changes to the template, and no bug report will be sent. -HERE_EOF - exit 0 -fi - -# Figure out how to echo a string without a trailing newline -N=`echo 'hi there\c'` -case "$N" in -*c) n=-n c= ;; -*) n= c='\c' ;; -esac - -BASHTESTERS="bash-testers@cwru.edu" - -case "$RELSTATUS" in -alpha*|beta*|devel*|rc*) BUGBASH=chet@cwru.edu ;; -*) BUGBASH=bug-bash@gnu.org ;; -esac - -case "$RELSTATUS" in -alpha*|beta*|devel*|rc*) - echo "$0: This is a testing release. Would you like your bug report" - echo "$0: to be sent to the bash-testers mailing list?" - echo $n "$0: Send to bash-testers? $c" - read ans - case "$ans" in - y*|Y*) BUGBASH="${BUGBASH},${BASHTESTERS}" ;; - esac ;; -esac - -BUGADDR="${1-$BUGBASH}" - -if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then - if [ -x /usr/bin/editor ]; then - DEFEDITOR=editor - elif [ -x /usr/local/bin/ce ]; then - DEFEDITOR=ce - elif [ -x /usr/local/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/contrib/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/bin/xemacs ]; then - DEFEDITOR=xemacs - elif [ -x /usr/contrib/bin/jove ]; then - DEFEDITOR=jove - elif [ -x /usr/local/bin/jove ]; then - DEFEDITOR=jove - elif [ -x /usr/bin/vi ]; then - DEFEDITOR=vi - else - echo "$0: No default editor found: attempting to use vi" >&2 - DEFEDITOR=vi - fi -fi - - -: ${EDITOR=$DEFEDITOR} - -: ${USER=${LOGNAME-`whoami`}} - -trap 'rm -rf "$TEMPDIR"; exit 1' 1 2 3 13 15 -trap 'rm -rf "$TEMPDIR"' 0 - -UN= -if (uname) >/dev/null 2>&1; then - UN=`uname -a` -fi - -if [ -f /usr/lib/sendmail ] ; then - RMAIL="/usr/lib/sendmail" - SMARGS="-i -t" -elif [ -f /usr/sbin/sendmail ] ; then - RMAIL="/usr/sbin/sendmail" - SMARGS="-i -t" -else - RMAIL=rmail - SMARGS="$BUGADDR" -fi - -INITIAL_SUBJECT='[50 character or so descriptive subject here (for reference)]' - -cat > "$TEMPFILE1" <> $HOME/dead.bashbug - echo "$0: mail failed: report saved in $HOME/dead.bashbug" >&2 -} - -exit 0 diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/make Binary file sbsv2/raptor/linux-i386/bin/make has changed diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/sh Binary file sbsv2/raptor/linux-i386/bin/sh has changed diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/unzip Binary file sbsv2/raptor/linux-i386/bin/unzip has changed diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/linux-i386/bin/zip Binary file sbsv2/raptor/linux-i386/bin/zip has changed diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/filter_interface.py --- a/sbsv2/raptor/python/filter_interface.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/filter_interface.py Mon Nov 16 20:39:37 2009 +0000 @@ -18,7 +18,7 @@ class Filter(object): - def open(self, raptor): + def open(self, params): return False def write(self, text): @@ -32,3 +32,87 @@ def formatError(self, message): return "sbs: error: " + message + "\n" + + +import sys +import xml.sax + +class FilterSAX(Filter, xml.sax.handler.ContentHandler, xml.sax.handler.ErrorHandler): + "base class for filters using a SAX parser" + + # define these methods in your subclass + + def startDocument(self): + "called once before any elements are seen" + pass + + def startElement(self, name, attributes): + "called on the opening of any element" + pass + + def characters(self, char): + "called one or more times with body text from an element" + pass + + def endElement(self, name): + "called on the closing of any element" + pass + + def endDocument(self): + "called once when all elements are closed" + pass + + def error(self, exception): + "the parse found an error which is (possibly) recoverable" + pass + + def fatalError(self, exception): + "the parser thinks an error occurred which should stop everything" + pass + + def warning(self, exception): + "the parser found something to complain about that might not matter" + pass + + # these methods are from the Filter base class + + def open(self, params): + "initialise" + + self.params = params + self.ok = True + try: + self.parser = xml.sax.make_parser(['xml.sax.expatreader']) + self.parser.setContentHandler(self) + self.parser.setErrorHandler(self) + + except Exception, ex: + sys.stderr.write(self.formatError(str(ex))) + self.ok = False + + return self.ok + + + def write(self, text): + "process some log text" + try: + self.parser.feed(text) + except Exception, ex: + sys.stderr.write(self.formatError(str(ex))) + self.ok = False + + return self.ok + + + def close(self): + "finish off" + try: + self.parser.close() + except Exception, ex: + sys.stderr.write(self.formatError(str(ex))) + self.ok = False + + return self.ok + + +# the end diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/plugins/filter_clean.py --- a/sbsv2/raptor/python/plugins/filter_clean.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/plugins/filter_clean.py Mon Nov 16 20:39:37 2009 +0000 @@ -51,17 +51,23 @@ if self.removeTargets: if line.startswith(""): - self.doFile(line) - elif line.startswith(""): - self.doDirectory(line) + self.doFile(line, "file") + elif line.startswith(""): + self.doFile(line, "build") + elif line.startswith(""): + self.doFile(line, "resource") + elif line.startswith(""): + self.doFile(line, "bitmap") + elif line.startswith(""): + self.doFile(line, "stringtable") if self.removeExports: if line.startswith(""): - self.doMember(line) + self.doFile(line, "member") elif line.startswith(""): - self.doZipMarker(line) + self.doFile(line, "zipmarker") return self.ok @@ -81,9 +87,10 @@ if os.path.isfile(path): self.removeFile(path) - - elif os.path.isdir(path): - dirs.add(path) + + directory = os.path.dirname(path) + if os.path.isdir(directory): + dirs.add(directory) self.tmp.close() # this also deletes the temporary file except: @@ -123,47 +130,20 @@ self.ok = False - def doFile(self, line): - "remove filenames in tags immediately (not .d or .dep)." - filename = line[6:-7] # line is "filename - filename = filename.strip("\"\'") # some names are quoted + def doFile(self, line, tagname): + "deal with X" - # dependency files must be deleted at the end, - # everything else can be deleted straight away. - if filename.endswith(".d") or filename.endswith(".dep"): - self.saveItem(filename) - else: - if os.path.isfile(filename): - self.removeFile(filename) - + first = len(tagname) + 2 # line is "filename + last = -(first + 1) + filename = line[first:last] + filename = filename.strip("\"\'") # some names are quoted + self.saveItem(filename) + - def doDirectory(self, line): - "save directories in tags for the end." - # assuming X - dirname = line[5:-6] - self.saveItem(dirname.strip("\"\'")) - - def doExport(self, line): - "save exported files in tags for the end." - # assuming + "deal with " filename = line[21:line.find("'", 21)] self.saveItem(filename) - - - def doMember(self, line): - "save zip exports in tags for the end." - # assuming X - filename = line[8:-9] - self.saveItem(filename) - - - def doZipMarker(self, line): - "Remove file in tags" - # assuming X - filename = line[11:-12] - if os.path.isfile(filename): - self.removeFile(filename) # the end diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/plugins/filter_tagcount.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/python/plugins/filter_tagcount.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,74 @@ +# +# 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: +# Example of a Filter class using the SAX parser base class +# + +import filter_interface + +class FilterTagCounter(filter_interface.FilterSAX): + + def startDocument(self): + # for each element name count the number of occurences + # and the amount of body text contained. + self.names = [] + self.count = {} + self.errors = 0 + self.fatals = 0 + self.warns = 0 + + def startElement(self, name, attributes): + if name == "buildlog": + # print out the attributes of the "top" element + print "version:" + for a,v in attributes.items(): + print a, "=", v + + # push name onto the stack of names and increment the count + self.names.append(name) + if name in self.count: + self.count[name][0] += 1 + else: + self.count[name] = [1, 0] # occurs, characters + + def characters(self, char): + # these are for the current element + current = self.names[-1] + self.count[current][1] += len(char) + + def endElement(self, name): + # pop the name off the stack + self.names.pop() + + def endDocument(self): + # report + print "\nsummary:" + for name,nos in sorted(self.count.items()): + print name, nos[0], nos[1] + + print "\nparsing:" + print "errors =", self.errors + print "fatals =", self.fatals + print "warnings =", self.warns + + def error(self, exception): + self.errors += 1 + + def fatalError(self, exception): + self.fatals += 1 + + def warning(self, exception): + self.warns += 1 + +# the end diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor.py --- a/sbsv2/raptor/python/raptor.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor.py Mon Nov 16 20:39:37 2009 +0000 @@ -32,6 +32,7 @@ import raptor_cli import raptor_data import raptor_make +import raptor_makefile import raptor_meta import raptor_utilities import raptor_version @@ -54,8 +55,9 @@ hostplatform_dir = os.environ["HOSTPLATFORM_DIR"] # defaults can use EPOCROOT + if "EPOCROOT" in os.environ: - epocroot = os.environ["EPOCROOT"].replace("\\","/") + epocroot = os.environ["EPOCROOT"].replace("\\","/") else: if 'linux' in hostplatform: epocroot=os.environ['HOME'] + os.sep + "epocroot" @@ -70,7 +72,6 @@ sbs_build_dir = (epocroot + "/epoc32/build").replace("//","/") - # only use default XML from the epoc32 tree if it exists defaultSystemConfig = "lib/config" epoc32UserConfigDir = generic_path.Join(epocroot, "epoc32/sbs_config") @@ -105,75 +106,74 @@ } -class ComponentGroup(object): - """ Some components that should be built togther - e.g. a Layer in the system definition. - """ - def __init__(self, name, componentlist=[]): - self.components = componentlist - self.name = name + +class ModelNode(object): + """ Represents any node in a a tree of build information + e.g. a tree of bld.infs, mmps and finally things like resource blocks and string table blocks. + This is before they are produced into "build" specs. + """ + + def __init__(self, id, parent = None): + self.id = id + self.type = type + self.specs = [] + self.deps = [] + self.children = set() + self.unfurled = False + self.parent = parent + + # Allow one to make a set + def __hash__(self): + return hash(self.id) + + def __cmp__(self,other): + return cmp(self.id, other) def __iter__(self): - return iter(self.components) + return iter(self.children) def __getitem__(self,x): if isinstance(x, slice): - return self.components[x.start:x.stop] - return self.components[x] + return self.children[x.start:x.stop] + return self.children[x] def __setitem__(self,k, v): - self.components[k] = v + self.children[k] = v def __len__(self): - return len(self.components) + return len(self.children) - def extend(self, c): - self.components.extend(c) - - def append(self, c): - self.components.append(c) + def add(self, item): + return self.children.add(item) + + def isunfurled(self, c): + return self.unfurled == False - def GenerateSpecs(self, genericspecs, configs): - """Return a build spec hierarchy for a ComponentGroup. This involves parsing the component MetaData (bld.infs, mmps). - Takes a raptor object as a parameter (build), together with a list of Configurations. + def unfurl(self, build): + """Find any children of this node by processing it, produces specs""" + pass - Returns a tuple consisting of a list of specification objects and a list of dependency files - that relate to these specs. - """ - - self.specs = [] - self.specs.extend(genericspecs) - self.configs = configs - self.dependencies = set() + def unfurl_all(self, build): + """Unfurl self and all children - preparatory e.g for realisation""" + if not self.unfurled: + self.unfurl(build) - metaReader = None - if len (self.components): - try: - # create a MetaReader that is aware of the list of - # configurations that we are trying to build. - metaReader = raptor_meta.MetaReader(build, configs) + self.realise_exports(build) # permit communication of dependencies between children - # convert the list of bld.inf files into a specification - # hierarchy suitable for all the configurations we are using. - self.specs.extend(metaReader.ReadBldInfFiles(self.components,build.doExportOnly)) - - except raptor_meta.MetaDataError, e: - log.Error(e.Text) + for c in self.children: + c.unfurl_all(build) + - log.Info("Buildable specification group '%s'", name) - build.AttachSpecs(self.specs) - - # Get a unique list of the dependency files that were created - if metaReader: - for c in metaReader.BuildPlatforms: - self.dependencies.update(c["METADEPS"]) - - - def CreateMakefile(self, makefilename_base, engine, named = False): - if len(self.specs) <= 0: - return None - - if named: + def realise_exports(self, build): + """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. + """ + pass + + def realise_makefile(self, build, specs): + makefilename_base = build.topMakefile + if self.name is not None: makefile = generic_path.Path(str(makefilename_base) + "_" + raptor_utilities.sanitise(self.name)) else: makefile = generic_path.Path(str(makefilename_base)) @@ -181,15 +181,117 @@ # insert the start time into the Makefile name? makefile.path = makefile.path.replace("%TIME", build.timestring) - engine.Write(makefile, self.specs, self.configs) + makefileset = build.maker.Write(makefile, specs, build.buildUnitsToBuild) + + return makefileset + + + def realise(self, build): + """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 + + build.AssertBuildOK() + + m = self.realise_makefile(build, sp) + + return build.Make(m) + - return makefile +class Project(ModelNode): + """A project or, in symbian-speak, an MMP + """ + def __init__(self, filename, parent = None): + super(Project,self).__init__(filename, parent = parent) + # Assume that components are specified in mmp files for now + # One day that tyranny might end. + self.mmp_name = str(generic_path.Path.Absolute(filename)) + self.id = self.mmp_name + self.unfurled = False + + 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 + # to be able to simulate the overall recursive unfurling of a build. + +class Component(ModelNode): + """A group of projects or, in symbian-speak, a bld.inf. + """ + def __init__(self, filename): + super(Component,self).__init__(filename) + # Assume that components are specified in bld.inf files for now + # One day that tyranny might end. + self.bldinf = None # Slot for a bldinf object if we spot one later + self.bldinf_filename = generic_path.Path.Absolute(filename) + + self.id = str(self.bldinf_filename) + self.exportspecs = [] + self.depfiles = [] + self.unfurled = False # We can parse this + + def AddMMP(self, filename): + self.children.add(Project(filename)) - def GenerateMetadataSpecs(self, configs): +class Layer(ModelNode): + """ 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 + + for c in componentlist: + self.children.add(Component(c)) + + def unfurl(self, build): + """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. + + Returns True if the object was successfully unfurled. + """ + + # setup all our components + for c in self.children: + c.specs = [] + + self.configs = build.buildUnitsToBuild + + + metaReader = None + if len (self.children): + try: + # create a MetaReader that is aware of the list of + # configurations that we are trying to build. + metaReader = raptor_meta.MetaReader(build, build.buildUnitsToBuild) + + # convert the list of bld.inf files into a specification + # hierarchy suitable for all the configurations we are using. + self.specs = list(build.generic_specs) + self.specs.extend(metaReader.ReadBldInfFiles(self.children, build.doExportOnly)) + + except raptor_meta.MetaDataError, e: + build.Error(e.Text) + + self.unfurled = True + + + 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. + In this case it allows bld.infs to be parsed in parallel by make.""" + # insert the start time into the Makefile name? - self.configs = build.GetConfig("build").GenerateBuildUnits() + buildconfig = build.GetConfig("build").GenerateBuildUnits(build.cache) + self.configs = build.buildUnitsToBuild # Pass certain CLI flags through to the makefile-generating sbs calls cli_options = "" @@ -207,27 +309,38 @@ cli_options += " -q" - nc = len(self.components) - number_blocks = 16 + 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(self.components[b:b+block_size]) + component_blocks.append(childlist[b:b+block_size]) b += block_size - if len(component_blocks[-1]) <= 0: + 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. + tm = build.topMakefile.Absolute() + 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 for block in component_blocks: loop_number += 1 specNode = raptor_data.Specification("metadata_" + self.name) - componentList = " ".join([str(c) for c in block]) - configList = " ".join([c.name for c in configs]) + 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: @@ -247,8 +360,6 @@ var.AddOperation(raptor_data.Set("NO_BUILD", "1")) specNode.AddVariant(var) - - try: interface = build.cache.FindNamedInterface("build.makefiles") specNode.SetInterface(interface) @@ -256,15 +367,28 @@ build.Error("Can't find flm interface 'build.makefiles' ") spec_nodes.append(specNode) - - + binding_makefiles.addInclude(str(makefile_path)+"_all") + + ppstart = time.time() + build.Info("Parallel Parsing: time: Start %d", int(ppstart)) + m = self.realise_makefile(build, spec_nodes) + m.close() + gen_result = build.Make(m) - ## possibly some error handling here? - - self.specs = spec_nodes + ppfinish = time.time() + build.Info("Parallel Parsing: time: Finish %d", int(ppfinish)) + build.Info("Parallel Parsing: time: Parse Duration %d", int(ppfinish - ppstart)) + build.Debug("Binding Makefile base name is %s ", binding_makefiles.filenamebase) + binding_makefiles.close() + b = build.Make(binding_makefiles) + buildfinish = time.time() + build.Info("Parallel Parsing: time: Build Duration %d", int(buildfinish - ppfinish)) + return b -class BuildCompleteException(Exception): + + +class BuildCannotProgressException(Exception): pass # raptor module classes @@ -326,8 +450,8 @@ # things to initialise self.args = [] - self.componentGroups = [] - self.orderComponentGroups = False + self.layers = [] + self.orderLayers = False self.commandlineComponents = [] self.systemModel = None @@ -374,6 +498,9 @@ return True def AddConfigName(self, name): + if name == "build": + traceback.print_stack((sys.stdout)) + sys.exit(1) self.configNames.append(name) return True @@ -507,6 +634,8 @@ type = type.lower() if type == "on": self.doParallelParsing = True + elif type == "slave": + self.isParallelParsingSlave = True elif type == "off": self.doParallelParsing = False else: @@ -529,7 +658,7 @@ def PrintVersion(self,dummy): global name - print name, "version", raptor_version.Version() + print name, "version", raptor_version.fullversion() self.mission = Raptor.M_VERSION return False @@ -538,7 +667,7 @@ def Introduction(self): """Print a header of useful information about Raptor""" - self.Info("%s: version %s\n", name, raptor_version.Version()) + self.Info("%s: version %s\n", name, raptor_version.fullversion()) self.Info("%s %s", env, str(self.home)) self.Info("Set-up %s", str(self.raptorXML)) @@ -547,7 +676,7 @@ # the inherited environment for e, value in os.environ.items(): - self.Info("Environment %s=%s", e, value) + self.Info("Environment %s=%s", e, value.replace("]]>", "]]>")) # and some general debug stuff self.Debug("Platform %s", "-".join(hostplatform)) @@ -704,9 +833,11 @@ for c in set(configNames): + self.Debug("BuildUnit: %s", c) try: x = self.GetConfig(c) - buildUnitsToBuild.update( x.GenerateBuildUnits() ) + gb = x.GenerateBuildUnits(self.cache) + buildUnitsToBuild.update( gb ) except Exception, e: self.FatalError(str(e)) @@ -770,13 +901,13 @@ systemModel.DumpLayerInfo(layer) if systemModel.IsLayerBuildable(layer): - layersToBuild.append(ComponentGroup(layer, + layersToBuild.append(Layer(layer, systemModel.GetLayerComponents(layer))) return layersToBuild - # Add bld.inf or system definition xml to command line componentGroups (depending on preference) + # Add bld.inf or system definition xml to command line layers (depending on preference) def FindSysDefIn(self, aDir = None): # Find a system definition file @@ -808,15 +939,6 @@ return None - def AttachSpecs(self, groups): - # tell the specs which Raptor object they work for (so that they can - # access the cache and issue warnings and errors) - for spec in groups: - spec.SetOwner(self) - self.Info("Buildable specification '%s'", spec.name) - if self.debugOutput: - spec.DebugPrint() - def GenerateGenericSpecs(self, configsToBuild): # if a Configuration has any config-wide interfaces # then add a Specification node to call each of them. @@ -832,7 +954,7 @@ filter.AddConfigCondition(c.name) else: # create a new node - filter = raptor_data.Filter("config_wide") + filter = raptor_data.Filter(name = "config_wide") filter.AddConfigCondition(c.name) for i in iface.split(): spec = raptor_data.Specification(i) @@ -842,50 +964,25 @@ configWide[iface] = filter genericSpecs.append(filter) - self.AttachSpecs(genericSpecs) - return genericSpecs - def WriteMetadataDepsMakefile(self, component_group): - """ Takes a list of (filename, target) tuples that indicate where """ - # Create a Makefile that includes all the dependency information for this spec group - build_metamakefile_name = \ - os.path.abspath(sbs_build_dir).replace('\\','/').rstrip('/') + \ - '/metadata_%s.mk' % component_group.name.lower() - bmkmf = open(build_metamakefile_name, "w+") - bmkmf.write("# Build Metamakefile - Dependencies for metadata during the 'previous' build\n\n") - bmkmf.write("PARSETARGET:=%s\n" % build_metamakefile_name) - bmkmf.write("%s: \n" % build_metamakefile_name) - bmkmf.write("\t@echo -e \"\\nRE-RUNNING SBS with previous parameters\"\n") - bmkmf.write("\t@echo pretend-sbs %s\n" % " ".join(self.args)) - try: - for m in component_group.dependencies: - filename, target = m - bmkmf.write("-include %s\n\n" % filename) - finally: - bmkmf.close() - - return build_metamakefile_name - - def GetEvaluator(self, specification, configuration, gathertools=False): """ this will perform some caching later """ - return raptor_data.Evaluator(self, specification, configuration, gathertools=gathertools) - - - def areMakefilesUptodate(self): - return False + return raptor_data.Evaluator(specification, configuration, gathertools=gathertools, cache = self.cache) - def Make(self, makefile): + def Make(self, makefileset): + if not self.noBuild and makefileset is not None: + if self.maker.Make(makefileset): + self.Info("The make-engine exited successfully.") + return True + else: + self.Error("The make-engine exited with errors.") + return False + else: + self.Info("No build performed") - if self.maker.Make(makefile): - self.Info("The make-engine exited successfully.") - return True - else: - self.Error("The make-engine exited with errors.") - return False def Report(self): @@ -898,10 +995,10 @@ self.Info("Run time %s seconds" % self.runtime) def AssertBuildOK(self): - """Raise a BuildCompleteException if no further processing is required + """Raise a BuildCannotProgressException if no further processing is required """ if self.Skip(): - raise BuildCompleteException("") + raise BuildCannotProgressException("") return True @@ -937,13 +1034,12 @@ schema = "http://symbian.com/xml/build/log/1_0.xsd" self.out.write("\n" - % (raptor_version.Version(), namespace, namespace, schema)) + % (raptor_version.fullversion(), namespace, namespace, schema)) self.logOpen = True except Exception,e: self.out = sys.stdout # make sure that we can actually get errors out. self.logOpen = False - self.FatalError("Unable to open the output logs: %s" % str(e)) - + self.FatalError("Unable to open the output logs: %s" % str(e)) def CloseLog(self): if self.logOpen: @@ -1019,28 +1115,11 @@ if format: self.out.write(format % extras) - - def MakeComponentGroup(self, cg): - if not self.maker: - self.maker = raptor_make.MakeEngine(self) - - if self.maker == None: - self.Error("No make engine present") - return None - - makefile = cg.CreateMakefile(self.topMakefile, self.maker, self.systemDefinitionOrderLayers) - if (not self.noBuild and makefile is not None) \ - or self.doParallelParsing: - # run the build for a single group of specs - self.Make(makefile) - else: - self.Info("No build performed for %s" % cg.name) - - def GetComponentGroupsFromCLI(self): - """Returns the list of componentGroups as specified by the + def GetLayersFromCLI(self): + """Returns the list of layers as specified by the commandline interface to Raptor e.g. parameters or the current directory""" - componentGroups=[] + layers=[] # Look for bld.infs or sysdefs in the current dir if none were specified if self.systemDefinitionFile == None and len(self.commandlineComponents) == 0: if not self.preferBuildInfoToSystemDefinition: @@ -1049,38 +1128,39 @@ if self.systemDefinitionFile == None: aComponent = self.FindComponentIn(cwd) if aComponent: - componentGroups.append(ComponentGroup('default',[aComponent])) + layers.append(Layer('default',[aComponent])) else: aComponent = self.FindComponentIn(cwd) if aComponent is None: self.systemDefinitionFile = self.FindSysDefIn(cwd) else: - componentGroups.append(ComponentGroup('default',[aComponent])) + layers.append(Layer('default',[aComponent])) - if len(componentGroups) <= 0 and self.systemDefinitionFile == None: + if len(layers) <= 0 and self.systemDefinitionFile == None: self.Warn("No default bld.inf or system definition file found in current directory (%s)", cwd) # If we now have a System Definition to parse then get the layers of components if self.systemDefinitionFile != None: systemModel = raptor_xml.SystemModel(self, self.systemDefinitionFile, self.systemDefinitionBase) - componentGroups = self.GatherSysModelLayers(systemModel, self.systemDefinitionRequestedLayers) + 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: - componentGroups.append(ComponentGroup('commandline',self.commandlineComponents)) + layers.append(Layer('commandline',self.commandlineComponents)) # If we aren't building components in order then flatten down # the groups if not self.systemDefinitionOrderLayers: # Flatten the layers into one group of components if # we are not required to build them in order. - newcg = ComponentGroup("all") - for cg in componentGroups: - newcg.extend(cg) - componentGroups = [newcg] + newcg = Layer("all") + for cg in layers: + for c in cg: + newcg.add(c) + layers = [newcg] - return componentGroups + return layers def Build(self): @@ -1102,20 +1182,21 @@ # find out what configurations to build self.AssertBuildOK() - buildUnitsToBuild = set() buildUnitsToBuild = self.GetBuildUnitsToBuild(self.configNames) + self.buildUnitsToBuild = buildUnitsToBuild + # find out what components to build, and in what way - componentGroups = [] + layers = [] self.AssertBuildOK() if len(buildUnitsToBuild) >= 0: - componentGroups = self.GetComponentGroupsFromCLI() + layers = self.GetLayersFromCLI() - componentCount = reduce(lambda x,y : x + y, [len(cg) for cg in componentGroups]) + componentCount = reduce(lambda x,y : x + y, [len(cg) for cg in layers]) if not componentCount > 0: - raise BuildCompleteException("No components to build.") + raise BuildCannotProgressException("No components to build.") # check the configurations (tools versions) self.AssertBuildOK() @@ -1127,31 +1208,30 @@ self.AssertBuildOK() + # Setup a make engine. + if not self.maker: + self.maker = raptor_make.MakeEngine(self) + if self.maker == None: + self.Error("No make engine present") - # if self.doParallelParsing and not (len(componentGroups) == 1 and len(componentGroups[0]) == 1): + self.AssertBuildOK() + + # if self.doParallelParsing and not (len(layers) == 1 and len(layers[0]) == 1): if self.doParallelParsing: # Create a Makefile to parse components in parallel and build them - for cg in componentGroups: - cg.GenerateMetadataSpecs(buildUnitsToBuild) - self.MakeComponentGroup(cg) - if self.noBuild: - self.Info("No build performed") + for l in layers: + l.meta_realise(self) else: # Parse components serially, creating one set of makefiles # create non-component specs - self.AssertBuildOK() - generic_specs = self.GenerateGenericSpecs(buildUnitsToBuild) + self.generic_specs = self.GenerateGenericSpecs(buildUnitsToBuild) self.AssertBuildOK() - for cg in componentGroups: + for l in layers: # create specs for a specific group of components - cg.GenerateSpecs(generic_specs, buildUnitsToBuild) - self.WriteMetadataDepsMakefile(cg) + l.realise(self) - # generate the makefiles for one group of specs - self.MakeComponentGroup(cg) - - except BuildCompleteException,b: + except BuildCannotProgressException,b: if str(b) != "": self.Info(str(b)) @@ -1212,17 +1292,7 @@ # object which represents a build b = Raptor.CreateCommandlineBuild(argv) - # allow all objects to log to the - # build they're being used in - global build - global log - build = b - log = b - - - result = b.Build() - - return result + return b.Build() def DisplayBanner(): @@ -1231,4 +1301,5 @@ + # end of the raptor module diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_buildplatform.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/python/raptor_buildplatform.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,158 @@ +# +# 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: +# Classes, methods and regex available for use in log filters +# + +# This particular file is preliminary and under development. + +class BuildPlatform(object): + """ A build platform is a set of configurations which share + the same metadata. In other words, a set of configurations + for which the bld.inf and MMP files pre-process to exactly + the same text.""" + + def __init__(self, build): + evaluator = build.GetEvaluator(None, buildConfig) + self.selfform= evaluator.CheckedGet("TRADITIONAL_PLATFORM") + epocroot = evaluator.CheckedGet("EPOCROOT") + self.epocroot = generic_path.Path(epocroot) + + sbs_build_dir = evaluator.CheckedGet("SBS_BUILD_DIR") + self.sbs_build_dir = generic_path.Path(sbs_build_dir) + flm_export_dir = evaluator.CheckedGet("FLM_EXPORT_DIR") + self.flm_export_dir = generic_path.Path(flm_export_dir) + self.cacheid = flm_export_dir + if raptor_utilities.getOSPlatform().startswith("win"): + self.platmacros = evaluator.CheckedGet( "PLATMACROS.WINDOWS") + else: + self.platmacros = evaluator.CheckedGet( "PLATMACROS.LINUX") + + + # is this a feature variant config or an ordinary variant + fv = evaluator.Get("FEATUREVARIANTNAME") + if fv: + variantHdr = evaluator.CheckedGet("VARIANT_HRH") + variantHRH = generic_path.Path(variantHdr) + self.isfeaturevariant = True + else: + variantCfg = evaluator.CheckedGet("VARIANT_CFG") + variantCfg = generic_path.Path(variantCfg) + if not variantCfg in variantCfgs: + # get VARIANT_HRH from the variant.cfg file + varCfg = getVariantCfgDetail(self.epocroot, variantCfg) + variantCfgs[variantCfg] = varCfg['VARIANT_HRH'] + # we expect to always build ABIv2 + if not 'ENABLE_ABIV2_MODE' in varCfg: + build.Warn("missing flag ENABLE_ABIV2_MODE in %s file. ABIV1 builds are not supported.", + str(variantCfg)) + variantHRH = variantCfgs[variantCfg] + self.isfeaturevariant = False + + self.variant_hrh = variantHRH + build.Info("'%s' uses variant hrh file '%s'", buildConfig.name, variantHRH) + self.systeminclude = evaluator.CheckedGet("SYSTEMINCLUDE") + + + # find all the interface names we need + ifaceTypes = evaluator.CheckedGet("INTERFACE_TYPES") + interfaces = ifaceTypes.split() + + for iface in interfaces: + detail[iface] = evaluator.CheckedGet("INTERFACE." + iface) + + # not test code unless positively specified + self.testcode = evaluator.CheckedGet("TESTCODE", "") + + # make a key that identifies this platform uniquely + # - used to tell us whether we have done the pre-processing + # we need already using another platform with compatible values. + + key = str(self.variant_hrh) \ + + str(self.epocroot) \ + + self.systeminclude \ + + self.platform + + # Keep a short version of the key for use in filenames. + uniq = hashlib.md5() + uniq.update(key) + + plat.key = key + plat.key_md5 = "p_" + uniq.hexdigest() + del uniq + + def __hash__(self): + return hash(self.platform) + hash(self.epocroot) + hash(self.variant_hrh) + hash(self.systeminclude) + hash(self.testcode) + + def __cmp__(self,other): + return cmp(self.hash(), other.hash()) + + + @classmethod + def fromConfigs(configsToBuild, build): + """ Group the list of configurations into "build platforms".""" + platforms = Set() + + for buildConfig in configsToBuild: + # get everything we need to know about the configuration + plat = BuildPlatform(build = build) + + # compare this configuration to the ones we have already seen + + # Is this an unseen export platform? + # concatenate all the values we care about in a fixed order + # and use that as a signature for the exports. + items = ['EPOCROOT', 'VARIANT_HRH', 'SYSTEMINCLUDE', 'TESTCODE', 'export'] + export = "" + for i in items: + if i in detail: + export += i + str(detail[i]) + + if export in exports: + # add this configuration to an existing export platform + index = exports[export] + self.ExportPlatforms[index]['configs'].append(buildConfig) + else: + # create a new export platform with this configuration + exports[export] = len(self.ExportPlatforms) + exp = copy.copy(detail) + exp['PLATFORM'] = 'EXPORT' + exp['configs'] = [buildConfig] + self.ExportPlatforms.append(exp) + + # Is this an unseen build platform? + # concatenate all the values we care about in a fixed order + # and use that as a signature for the platform. + items = ['PLATFORM', 'EPOCROOT', 'VARIANT_HRH', 'SYSTEMINCLUDE', 'TESTCODE'] + if raptor_utilities.getOSPlatform().startswith("win"): + items.append('PLATMACROS.WINDOWS') + else: + items.append('PLATMACROS.LINUX') + + items.extend(interfaces) + platform = "" + for i in items: + if i in detail: + platform += i + str(detail[i]) + + if platform in platforms: + # add this configuration to an existing build platform + index = platforms[platform] + BuildPlatforms[index]['configs'].append(buildConfig) + else: + # create a new build platform with this configuration + platforms[platform] = len(self.BuildPlatforms) + plat.configs = [buildConfig] + BuildPlatforms.append(detail) + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_cache.py --- a/sbsv2/raptor/python/raptor_cache.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_cache.py Mon Nov 16 20:39:37 2009 +0000 @@ -143,7 +143,6 @@ self.WarnDuplicate("group", self.groups[obj.name], obj) return - obj.SetOwner(self.raptor) self.groups[obj.name] = obj def FindNamedAlias(self, name): @@ -154,7 +153,6 @@ self.WarnDuplicate("alias", self.aliases[obj.name], obj) return - obj.SetOwner(self.raptor) self.aliases[obj.name] = obj @@ -176,7 +174,6 @@ self.WarnDuplicate("interface", self.interfaces[cacheID][obj.name], obj) return - obj.SetOwner(self.raptor) obj.cacheID = cacheID self.interfaces[cacheID][obj.name] = obj @@ -192,7 +189,6 @@ self.WarnDuplicate("variant", self.variants[obj.name], obj) return - obj.SetOwner(self.raptor) self.variants[obj.name] = obj diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_cli.py --- a/sbsv2/raptor/python/raptor_cli.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_cli.py Mon Nov 16 20:39:37 2009 +0000 @@ -148,6 +148,7 @@ help="""Controls how metadata (e.g. bld.infs) are parsed in Parallel. Possible values are: "on" - Parse bld.infs in parallel (should be faster on clusters/multicore machines) + "slave" - used internally by Raptor "off" - Parse bld.infs serially """) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_data.py --- a/sbsv2/raptor/python/raptor_data.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_data.py Mon Nov 16 20:39:37 2009 +0000 @@ -27,8 +27,13 @@ import subprocess from tempfile import gettempdir from time import time, clock +import traceback +import raptor_cache +class MissingInterfaceError(Exception): + def __init__(self, s): + Exception.__init__(self,s) # What host platforms we recognise # This allows us to tie some variants to one host platform and some to another @@ -68,16 +73,14 @@ class Model(object): "Base class for data-model objects" + __slots__ = ('host', 'source', 'cacheID') + def __init__(self): - self.owner = None # Raptor object self.source = None # XML file - self.indent = " " # for DebugPrint self.host = None self.cacheID = "" # default set of cached objects - - - def SetOwner(self, aRaptor): - self.owner = aRaptor + # not using the cache parameter - there to make the + # init for all Model objects "standard" def SetSourceFile(self, filename): @@ -92,10 +95,6 @@ raise InvalidChildError() - def DebugPrint(self, prefix = ""): - if self.owner: - self.owner.Debug("%s", prefix) - def Valid(self): return False @@ -139,8 +138,7 @@ def Resolve(self): raise BadReferenceError() - def GetModifiers(self): - cache = self.owner.cache + def GetModifiers(self, cache): return [ cache.FindNamedVariant(m) for m in self.modifiers ] def Valid(self): @@ -154,20 +152,13 @@ self.variants = [] - def SetOwner(self, aRaptor): - Model.SetOwner(self, aRaptor) - for v in self.variants: - v.SetOwner(aRaptor) - - - def DebugPrint(self, prefix = ""): - for v in self.variants: - v.DebugPrint(prefix) + def __str__(self): + return "\n".join([str(v) for v in self.variants]) def AddVariant(self, variant): if type(variant) is types.StringTypes: - variant = VariantRef(variant) + variant = VariantRef(ref = variant) # Only add the variant if it's not in the list @@ -175,15 +166,19 @@ if not variant in self.variants: self.variants.append(variant) - def GetVariants(self): + def GetVariants(self, cache): # resolve any VariantRef objects into Variant objects + missing_variants = [] for i,var in enumerate(self.variants): if isinstance(var, Reference): try: - self.variants[i] = var.Resolve() + self.variants[i] = var.Resolve(cache=cache) except BadReferenceError: - self.owner.Error("Missing variant '%s'", var.ref) + missing_variants.append(var.ref) + + if len(missing_variants) > 0: + raise MissingVariantException("Missing variants '%s'", " ".join(missing_variants)) return self.variants @@ -199,27 +194,25 @@ self.params = [] self.paramgroups = [] - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.name) - self.owner.Debug("%s...", prefix) - self.owner.Debug("%s", prefix) + def __str__(self): + return "" % self.name + "" - def FindParent(self): + def FindParent(self, cache): try: - return self.owner.cache.FindNamedInterface(self.extends, self.cacheID) + return cache.FindNamedInterface(self.extends, self.cacheID) except KeyError: raise BadReferenceError("Cannot extend interface because it cannot be found: "+str(self.extends)) - def GetParams(self): + def GetParams(self, cache): if self.extends != None: - parent = self.FindParent() + parent = self.FindParent(cache) # what parameter names do we have already? names = set([x.name for x in self.params]) # pick up ones we don't have that are in our parent pp = [] - for p in parent.GetParams(): + for p in parent.GetParams(cache): if not p.name in names: pp.append(p) @@ -229,29 +222,29 @@ return self.params - def GetParamGroups(self): + def GetParamGroups(self, cache): if self.extends != None: - parent = self.FindParent() + parent = self.FindParent(cache) # what parameter names do we have already? patterns = set([x.pattern for x in self.paramgroups]) # pick up ones we don't have that are in our parent - for g in parent.GetParamGroups(): + for g in parent.GetParamGroups(cache): if not g.pattern in patterns: self.paramgroups.append(g) return self.paramgroups - def GetFLMIncludePath(self): + def GetFLMIncludePath(self, cache): "absolute path to the FLM" if self.flm == None: if self.extends != None: - parent = self.FindParent() + parent = self.FindParent(cache) - return parent.GetFLMIncludePath() + return parent.GetFLMIncludePath(cache) else: raise InvalidPropertyError() @@ -295,12 +288,12 @@ class InterfaceRef(Reference): - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.ref) + def __str__(self): + return "" % self.ref - def Resolve(self): + def Resolve(self, cache): try: - return self.owner.cache.FindNamedInterface(self.ref, self.cacheID) + return cache.FindNamedInterface(self.ref, self.cacheID) except KeyError: raise BadReferenceError() @@ -316,24 +309,13 @@ self.parentSpec = None - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.name) - if self.interface: - self.interface.DebugPrint(prefix + self.indent) - VariantContainer.DebugPrint(self, prefix + self.indent) + def __str__(self): + s = "" % str(self.name) + s += VariantContainer.__str__(self) for c in self.childSpecs: - c.DebugPrint(prefix + self.indent) - self.owner.Debug("%s", prefix) - - - def SetOwner(self, aRaptor): - VariantContainer.SetOwner(self, aRaptor) - - if self.interface != None: - self.interface.SetOwner(aRaptor) - - for s in self.childSpecs: - s.SetOwner(aRaptor) + s += str(c) + '\n' + s += "" + return s def SetProperty(self, name, value): @@ -343,10 +325,10 @@ raise InvalidPropertyError() - def Configure(self, config): + def Configure(self, config, cache): # configure all the children (some may be Filters or parents of) for spec in self.GetChildSpecs(): - spec.Configure(config) + spec.Configure(config, cache = cache) def HasInterface(self): @@ -358,10 +340,10 @@ or isinstance(interface, InterfaceRef): self.interface = interface else: - self.interface = InterfaceRef(interface) + self.interface = InterfaceRef(ref = interface) - def GetInterface(self): + def GetInterface(self, cache): """return the Interface (fetching from the cache if it was a ref) may return None""" @@ -371,13 +353,11 @@ if isinstance(self.interface, InterfaceRef): try: - self.interface = self.interface.Resolve() + self.interface = self.interface.Resolve(cache=cache) return self.interface except BadReferenceError: - self.owner.Error("Missing interface %s", self.interface.ref) - return None - + raise MissingInterfaceError("Missing interface %s" % self.interface.ref) def AddChild(self, child): if isinstance(child, Specification): @@ -409,7 +389,7 @@ return True - def GetAllVariantsRecursively(self): + def GetAllVariantsRecursively(self, cache): """Returns all variants contained in this node and in its ancestors. The returned value is a list, the structure of which is [variants-in-parent, @@ -419,11 +399,11 @@ the variants themselves. """ if self.parentSpec: - variants = self.parentSpec.GetAllVariantsRecursively() + variants = self.parentSpec.GetAllVariantsRecursively(cache = cache) else: variants = [] - variants.extend( self.GetVariants() ) + variants.extend( self.GetVariants(cache = cache) ) return variants @@ -438,22 +418,21 @@ If several Conditions are set, the test is an OR of all of them.""" def __init__(self, name = ""): - Specification.__init__(self, name) # base class constructor - self.Else = Specification(name) # same for Else part + Specification.__init__(self, name = name) # base class constructor + self.Else = Specification(name = name) # same for Else part self.isTrue = True self.configNames = set() # self.variableNames = set() # TO DO: Condition class self.variableValues = {} # - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.name) - self.owner.Debug("%s ", prefix, " | ".join(self.configNames)) - Specification.DebugPrint(self, prefix + self.indent) - self.owner.Debug("%s ", prefix) - self.owner.Debug("%s ", prefix) - self.Else.DebugPrint(prefix + self.indent) - self.owner.Debug("%s ", prefix) - self.owner.Debug("%s", prefix) + def __str__(self, prefix = ""): + s = "\n"% self.name + s += "\n" % " | ".join(self.configNames) + s += Specification.__str__(self) + s += "\n \n" + s += str(self.Else) + s += " \n\n" + return s def SetConfigCondition(self, configName): @@ -478,13 +457,14 @@ self.variableValues[variableName] = set([variableValues]) - def Configure(self, buildUnit): + def Configure(self, buildUnit, cache): self.isTrue = False if buildUnit.name in self.configNames: self.isTrue = True elif self.variableNames: - evaluator = self.owner.GetEvaluator(self.parentSpec, buildUnit) + + evaluator = Evaluator(self.parentSpec, buildUnit, cache=cache) for variableName in self.variableNames: variableValue = evaluator.Get(variableName) @@ -495,14 +475,7 @@ # configure all the children too for spec in self.GetChildSpecs(): - spec.Configure(buildUnit) - - - def SetOwner(self, aRaptor): - # base class method - Specification.SetOwner(self, aRaptor) - # same for Else part - self.Else.SetOwner(aRaptor) + spec.Configure(buildUnit, cache=cache) def HasInterface(self): @@ -512,18 +485,18 @@ return self.Else.HasInterface() - def GetInterface(self): + def GetInterface(self, cache): if self.isTrue: - return Specification.GetInterface(self) + return Specification.GetInterface(self, cache = cache) else: - return self.Else.GetInterface() + return self.Else.GetInterface(cache = cache) - def GetVariants(self): + def GetVariants(self, cache): if self.isTrue: - return Specification.GetVariants(self) + return Specification.GetVariants(self, cache = cache) else: - return self.Else.GetVariants() + return self.Else.GetVariants(cache = cache) def SetParentSpec(self, parent): @@ -591,18 +564,17 @@ class Operation(Model): "Base class for variant operations" + __slots__ = 'type' def __init__(self): Model.__init__(self) # base class constructor self.type = None - def Apply(self, oldValue): pass class Append(Operation): - __slots__ = ('name','value','separator','owner') - + __slots__ = ('name', 'value', 'separator') def __init__(self, name = None, value = None, separator = " "): Operation.__init__(self) # base class constructor self.name = name @@ -610,9 +582,9 @@ self.separator = separator - def DebugPrint(self, prefix = ""): + def __str__(self): attributes = "name='" + self.name + "' value='" + self.value + "' separator='" + self.separator + "'" - self.owner.Debug("%s", prefix, attributes) + return "" % attributes def Apply(self, oldValue): @@ -641,6 +613,7 @@ class Prepend(Operation): + __slots__ = ('name', 'value', 'separator') def __init__(self, name = None, value = None, separator = " "): Operation.__init__(self) # base class constructor self.name = name @@ -648,9 +621,9 @@ self.separator = separator - def DebugPrint(self, prefix = ""): + def __str__(self, prefix = ""): attributes = "name='" + self.name + "' value='" + self.value + "' separator='" + self.separator + "'" - self.owner.Debug("%s", prefix, attributes) + return "" % prefix def Apply(self, oldValue): @@ -679,8 +652,8 @@ class Set(Operation): + __slots__ = ('name', 'value', 'type', 'versionCommand', 'versionResult') """implementation of operation""" - __slots__ = ('name','value', 'type', 'versionCommand', 'versionResult', 'owner') def __init__(self, name = None, value = "", type = ""): Operation.__init__(self) # base class constructor @@ -691,12 +664,12 @@ self.versionResult = "" - def DebugPrint(self, prefix = ""): + def __str__(self): attributes = "name='" + self.name + "' value='" + self.value + "' type='" + self.type + "'" if type == "tool": attributes += " versionCommand='" + self.versionCommand + "' versionResult='" + self.versionResult - self.owner.Debug("%s", prefix, attributes) + return "" % attributes def Apply(self, oldValue): @@ -724,6 +697,8 @@ def Valid(self): return (self.name != None and self.value != None) +class BadToolValue(Exception): + pass class Env(Set): """implementation of operator""" @@ -733,7 +708,7 @@ self.default = default - def DebugPrint(self, prefix = ""): + def __str__(self): attributes = "name='" + self.name + "' type='" + self.type + "'" if default != None: attributes += " default='" + self.default + "'" @@ -741,7 +716,7 @@ if type == "tool": attributes += " versionCommand='" + self.versionCommand + "' versionResult='" + self.versionResult + "'" - self.owner.Debug("%s", prefix, attributes) + return "" % attributes def Apply(self, oldValue): @@ -755,14 +730,12 @@ path = generic_path.Path(value) value = str(path.Absolute()) except ValueError,e: - self.owner.Error("the environment variable %s is incorrect: %s" % (self.name, str(e))) - return "NO_VALUE_FOR_" + self.name + raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e))) except KeyError: if self.default != None: value = self.default else: - self.owner.Error("%s is not set in the environment and has no default", self.name) - return "NO_VALUE_FOR_" + self.name + raise BadToolValue("%s is not set in the environment and has no default" % self.name) return value @@ -791,7 +764,7 @@ self.operations = [] self.variantKey = "" - def GetOperations(self): + def GetOperations(self, cache): """Return all operations related to this BuildUnit. The result is cached, and so will only be computed once per BuildUnit. @@ -800,7 +773,7 @@ if self.variantKey != key: self.variantKey = key for v in self.variants: - self.operations.extend( v.GetAllOperationsRecursively() ) + self.operations.extend( v.GetAllOperationsRecursively(cache=cache) ) return self.operations @@ -820,7 +793,7 @@ def ClearModifiers(self): self.modifiers = [] - def GenerateBuildUnits(self): + def GenerateBuildUnits(self,cache): """Returns a list of BuildUnits. This function must be overridden by derived classes. @@ -830,6 +803,8 @@ class Variant(Model, Config): + __slots__ = ('cache','name','host','extends','ops','variantRefs','allOperations') + def __init__(self, name = ""): Model.__init__(self) Config.__init__(self) @@ -868,20 +843,10 @@ def Valid(self): return self.name - def SetOwner(self, aRaptor): - - Model.SetOwner(self, aRaptor) - - for r in self.variantRefs: - r.SetOwner(aRaptor) - - for op in self.ops: - op.SetOwner(aRaptor) - def AddOperation(self, op): self.ops.append(op) - def GetAllOperationsRecursively(self): + def GetAllOperationsRecursively(self, cache): """Returns a list of all operations in this variant. The list elements are themselves lists; the overall structure of the @@ -892,16 +857,16 @@ if not self.allOperations: if self.extends: - parent = self.owner.cache.FindNamedVariant(self.extends) - self.allOperations.extend( parent.GetAllOperationsRecursively() ) + parent = cache.FindNamedVariant(self.extends) + self.allOperations.extend( parent.GetAllOperationsRecursively(cache = cache) ) for r in self.variantRefs: - for v in [ r.Resolve() ] + r.GetModifiers(): - self.allOperations.extend( v.GetAllOperationsRecursively() ) + for v in [ r.Resolve(cache = cache) ] + r.GetModifiers(cache = cache): + self.allOperations.extend( v.GetAllOperationsRecursively(cache = cache) ) self.allOperations.append(self.ops) return self.allOperations - def GenerateBuildUnits(self): + def GenerateBuildUnits(self,cache): name = self.name vars = [self] @@ -909,32 +874,32 @@ for m in self.modifiers: name = name + "." + m.name vars.append(m) - - return [ BuildUnit(name, vars) ] - - def DebugPrint(self, prefix = ""): + return [ BuildUnit(name=name, variants=vars) ] - self.owner.Debug("%s", prefix, self.name, self.extends) + def __str__(self): + s = "\n" % (self.name, self.extends) for op in self.ops: - op.DebugPrint(prefix + self.indent) + s += str(op) + '\n' + s += "" + return s - self.owner.Debug("%s", prefix) - - +import traceback class VariantRef(Reference): def __init__(self, ref=None): - Reference.__init__(self, ref) + Reference.__init__(self, ref = ref) - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.ref) + def __str__(self): + return "" % self.ref - def Resolve(self): + def Resolve(self, cache): try: - return self.owner.cache.FindNamedVariant(self.ref) - except KeyError: + return cache.FindNamedVariant(self.ref) + except KeyError, e: raise BadReferenceError(self.ref) +class MissingVariantException(Exception): + pass class Alias(Model, Config): @@ -946,8 +911,8 @@ self.varRefs = [] self.variants = [] - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.name, self.meaning) + def __str__(self): + return "" % (self.name, self.meaning) def SetProperty(self, key, val): if key == "name": @@ -956,32 +921,31 @@ self.meaning = val for u in val.split("."): - self.varRefs.append( VariantRef(u) ) + self.varRefs.append( VariantRef(ref = u) ) else: raise InvalidPropertyError() - def SetOwner(self, raptor): - Model.SetOwner(self, raptor) - for r in self.varRefs: - r.SetOwner(raptor) - def Valid(self): return self.name and self.meaning - def GenerateBuildUnits(self): + def GenerateBuildUnits(self, cache): if not self.variants: + missing_variants = [] for r in self.varRefs: try: - self.variants.append( r.Resolve() ) + self.variants.append( r.Resolve(cache=cache) ) except BadReferenceError: - self.owner.Error("Missing variant '%s'", r.ref) + missing_variants.append(r.ref) + + if len(missing_variants) > 0: + raise MissingVariantException("Missing variants '%s'", " ".join(missing_variants)) name = self.name for v in self.modifiers: name = name + "." + v.name - return [ BuildUnit(name, self.variants + self.modifiers) ] + return [ BuildUnit(name=name, variants=self.variants + self.modifiers) ] class AliasRef(Reference): @@ -989,12 +953,12 @@ def __init__(self, ref=None): Reference.__init__(self, ref) - def DebugPrint(self, prefix = ""): - self.owner.Debug("%s", prefix, self.ref) + def __str__(self): + return "" % self.ref - def Resolve(self): + def Resolve(self, cache): try: - return self.owner.cache.FindNamedAlias(self.ref) + return cache.FindNamedAlias(self.ref) except KeyError: raise BadReferenceError(self.ref) @@ -1018,41 +982,37 @@ else: raise InvalidChildError() - def SetOwner(self, raptor): - Model.SetOwner(self, raptor) - for r in self.childRefs: - r.SetOwner(raptor) - def Valid(self): return self.name and self.childRefs - def DebugPrint(self, prefix = ""): - - self.owner.Debug("", prefix, self.name) - + def __str__(self): + s = "" % self.name for r in self.childRefs: - r.DebugPrint(prefix + self.indent) + s += str(r) + s += "" + return s - self.owner.Debug("%s", prefix) - - def GenerateBuildUnits(self): - + def GenerateBuildUnits(self, cache): units = [] + missing_variants = [] for r in self.childRefs: - refMods = r.GetModifiers() + refMods = r.GetModifiers(cache) try: - obj = r.Resolve() + obj = r.Resolve(cache=cache) except BadReferenceError: - self.owner.Error("Missing variant '%s'", r.ref) + missing_variants.append(r.ref) else: obj.ClearModifiers() for m in refMods + self.modifiers: obj.AddModifier(m) - units.extend( obj.GenerateBuildUnits() ) + units.extend( obj.GenerateBuildUnits(cache) ) + + if len(missing_variants) > 0: + raise MissingVariantException("Missing variants '%s'", " ".join(missing_variants)) return units @@ -1062,19 +1022,27 @@ def __init__(self, ref=None): Reference.__init__(self, ref) - def DebugPrint(self, prefix = ""): - mod = ".".join(self.modifiers) - self.owner.Debug("%s", prefix, self.ref, mod) + def __str__(self): + return "<%s />" % (prefix, self.ref, ".".join(self.modifiers)) - def Resolve(self): + def Resolve(self, cache): try: - return self.owner.cache.FindNamedGroup(self.ref) + return cache.FindNamedGroup(self.ref) except KeyError: raise BadReferenceError(self.ref) +class ToolErrorException(Exception): + def __init__(self, s): + Exception.__init__(self,s) + class Tool(object): """Represents a tool that might be used by raptor e.g. a compiler""" + # It's difficult and expensive to give each tool a log reference but a class one + # will facilitate debugging when that is needed without being a design flaw the + # rest of the time. + log = raptor_utilities.nulllog + # For use in dealing with tools that return non-ascii version strings. nonascii = "" identity_chartable = chr(0) @@ -1084,7 +1052,7 @@ nonascii += chr(c) identity_chartable += " " - def __init__(self, name, command, versioncommand, versionresult, id="", log = raptor_utilities.nulllog): + def __init__(self, name, command, versioncommand, versionresult, id=""): self.name = name self.command = command self.versioncommand = versioncommand @@ -1097,7 +1065,6 @@ # version until someone proves that it's OK self.valid = False - self.log=log def expand(self, toolset): self.versioncommand = toolset.ExpandAll(self.versioncommand) @@ -1117,7 +1084,7 @@ # If it really is not a simple command then we won't be able to get a date and # we won't be able to tell if it is altered or updated - too bad! testfile = generic_path.Where(self.command) - self.log.Debug("toolcheck: tool '%s' was found on the path at '%s' ", self.command, testfile) + #self.log.Debug("toolcheck: tool '%s' was found on the path at '%s' ", self.command, testfile) if testfile is None: raise Exception("Can't be found in path") @@ -1127,18 +1094,20 @@ testfile_stat = os.stat(testfile) self.date = testfile_stat.st_mtime except Exception,e: - self.log.Debug("toolcheck: '%s=%s' cannot be dated - this is ok, but the toolcheck won't be able to tell when a new of the tool is installed. (%s)", self.name, self.command, str(e)) + # We really don't mind if the tool could not be dated - for any reason + Tool.log.Debug("toolcheck: '%s=%s' cannot be dated - this is ok, but the toolcheck won't be able to tell when a new version of the tool is installed. (%s)", self.name, self.command, str(e)) + pass - def check(self, shell, evaluator): + def check(self, shell, evaluator, log = raptor_utilities.nulllog): self.vre = re.compile(self.versionresult) try: self.log.Debug("Pre toolcheck: '%s' for version '%s'", self.name, self.versionresult) p = subprocess.Popen(args=[shell, "-c", self.versioncommand], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + log.Debug("Checking tool '%s' for version '%s'", self.name, self.versionresult) versionoutput,err = p.communicate() - self.log.Debug("Checking tool '%s' for version '%s'", self.name, self.versionresult) except Exception,e: versionoutput=None @@ -1148,12 +1117,11 @@ versionoutput_a = versionoutput.translate(Tool.identity_chartable,"") if versionoutput_a and self.vre.search(versionoutput_a) != None: - self.log.Debug("tool '%s' returned an acceptable version '%s' at %s", self.name, versionoutput_a, str(self.date)) + log.Debug("tool '%s' returned an acceptable version '%s'", self.name, versionoutput_a) self.valid = True else: - self.log.Error("tool '%s' from config '%s' did not return version '%s' as required.\nCommand '%s' returned:\n%s\nCheck your environment and configuration.\n", self.name, self.id, self.versionresult, self.versioncommand, versionoutput_a) self.valid = False - return self.valid + raise ToolErrorException("tool '%s' from config '%s' did not return version '%s' as required.\nCommand '%s' returned:\n%s\nCheck your environment and configuration.\n" % (self.name, self.id, self.versionresult, self.versioncommand, versionoutput_a)) def envhash(irrelevant_vars): """Determine something unique about this environment to identify it. @@ -1175,16 +1143,19 @@ write() is used to flush the cache to disc. """ # The raptor shell - this is not mutable. - hostbinaries = os.path.join(os.environ['SBS_HOME'], - os.environ['HOSTPLATFORM_DIR']) + if 'SBS_SHELL' in os.environ: + shell = os.environ['SBS_SHELL'] + else: + hostbinaries = os.path.join(os.environ['SBS_HOME'], + os.environ['HOSTPLATFORM_DIR']) - if HostPlatform.IsHost('lin*'): - shell=os.path.join(hostbinaries, 'bin/bash') - else: - if 'SBS_CYGWIN' in os.environ: - shell=os.path.join(os.environ['SBS_CYGWIN'], 'bin\\bash.exe') + if HostPlatform.IsHost('lin*'): + shell=os.path.join(hostbinaries, 'bin/bash') else: - shell=os.path.join(hostbinaries, 'cygwin\\bin\\bash.exe') + if 'SBS_CYGWIN' in os.environ: + shell=os.path.join(os.environ['SBS_CYGWIN'], 'bin\\bash.exe') + else: + shell=os.path.join(hostbinaries, 'cygwin\\bin\\bash.exe') irrelevant_vars = ['PWD','OLDPWD','PID','PPID', 'SHLVL' ] @@ -1255,7 +1226,6 @@ except Exception, e: log.Info("Ignoring garbled toolcheck cache: %s (%s)\n", self.cachefilename, str(e)) self.__toolcheckcache = {} - else: log.Info("Toolcheck cache %s ignored - environment changed\n", self.cachefilename) @@ -1316,8 +1286,11 @@ self.log.Debug("toolcheck done: %s -key: %s" % (tool.name, tool.key)) - if not tool.check(ToolSet.shell, evaluator): + try: + tool.check(ToolSet.shell, evaluator, log = self.log) + except ToolErrorException, e: self.valid = False + self.log.Error("%s\n" % str(e)) # Tool failures are cached just like successes - don't want to repeat them cache[tool.key] = { "name" : tool.name, "valid" : tool.valid, "age" : 0 , "date" : tool.date } @@ -1356,6 +1329,8 @@ self.log.Info("Could not write toolcheck cache: %s", str(e)) return self.valid +class UninitialisedVariableException(Exception): + pass class Evaluator(object): """Determine the values of variables under different Configurations. @@ -1364,11 +1339,11 @@ refRegex = re.compile("\$\((.+?)\)") - def __init__(self, Raptor, specification, buildUnit, gathertools = False): - self.raptor = Raptor + def __init__(self, specification, buildUnit, cache, gathertools = False): self.dict = {} self.tools = [] self.gathertools = gathertools + self.cache = cache specName = "none" configName = "none" @@ -1377,14 +1352,18 @@ opsLists = [] if buildUnit: - opsLists.extend( buildUnit.GetOperations() ) + ol = buildUnit.GetOperations(cache) + self.buildUnit = buildUnit + + opsLists.extend( ol ) if specification: - for v in specification.GetAllVariantsRecursively(): - opsLists.extend( v.GetAllOperationsRecursively() ) + for v in specification.GetAllVariantsRecursively(cache): + opsLists.extend( v.GetAllOperationsRecursively(cache) ) tools = {} + unfound_values = [] for opsList in opsLists: for op in opsList: # applying an Operation to a non-existent variable @@ -1394,13 +1373,20 @@ except KeyError: oldValue = "" - newValue = op.Apply(oldValue) + try: + newValue = op.Apply(oldValue) + except BadToolValue, e: + unfound_values.append(str(e)) + newValue = "NO_VALUE_FOR_" + op.name + self.dict[op.name] = newValue if self.gathertools: if op.type == "tool" and op.versionCommand and op.versionResult: - tools[op.name] = Tool(op.name, newValue, op.versionCommand, op.versionResult, configName, log = self.raptor) + tools[op.name] = Tool(op.name, newValue, op.versionCommand, op.versionResult, configName) + if len(unfound_values) > 0: + raise UninitialisedVariableException("\n".join(unfound_values)) if self.gathertools: self.tools = tools.values() @@ -1417,8 +1403,8 @@ unresolved = False for k, v in self.dict.items(): if v.find('$(' + k + ')') != -1: - self.raptor.Error("Recursion Detected in variable '%s' in configuration '%s' ",k,configName) - expanded = "RECURSIVE_INVALID_STRING" + raise RecursionException("Recursion Detected in variable '%s' in configuration '%s' " % (k,configName)) + expanded = "RECURSIVE_INVALID_STRING" else: expanded = self.ExpandAll(v, specName, configName) @@ -1466,20 +1452,24 @@ refs = Evaluator.refRegex.findall(value) + # store up all the unset variables before raising an exception + # to allow us to find them all + unset_variables = [] + for r in set(refs): expansion = None - if r in self.raptor.override: - expansion = self.raptor.override[r] - elif r in self.dict: + if r in self.dict: expansion = self.dict[r] else: # no expansion for $(r) - self.raptor.Error("Unset variable '%s' used in spec '%s' with config '%s'", - r, spec, config) + unset_variables.append("Unset variable '%s' used in spec '%s' with config '%s'" % (r, spec, config)) if expansion != None: value = value.replace("$(" + r + ")", expansion) + if len(unset_variables) > 0: # raise them all + raise UninitialisedVariableException(". ".join(unset_variables)) + return value diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_make.py --- a/sbsv2/raptor/python/raptor_make.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_make.py Mon Nov 16 20:39:37 2009 +0000 @@ -20,13 +20,16 @@ import os import random import raptor -import raptor_data import raptor_utilities import raptor_version +import raptor_data import re import subprocess import time from raptor_makefile import * +import raptor_version +import traceback +import sys # raptor_make module classes @@ -35,7 +38,6 @@ def __init__(self, Raptor): self.raptor = Raptor self.valid = True - self.makefileset = None self.descrambler = None self.descrambler_started = False @@ -53,7 +55,7 @@ # find the variant and extract the values try: - units = avar.GenerateBuildUnits() + units = avar.GenerateBuildUnits(Raptor.cache) evaluator = Raptor.GetEvaluator( None, units[0] , gathertools=True) # shell @@ -123,7 +125,7 @@ component='$$COMPONENT_NAME'\ bldinf='$$COMPONENT_META' mmp='$$PROJECT_META'\ config='$$SBS_CONFIGURATION' platform='$$PLATFORM'\ - phase='$$MAKEFILE_GROUP' source='$$SOURCE + phase='$$MAKEFILE_GROUP' source='$$SOURCE' export TALON_RECIPEATTRIBUTES TALON_SHELL TALON_TIMEOUT USE_TALON:=%s @@ -148,7 +150,7 @@ include %s -""" % ( raptor.name, raptor_version.Version(), +""" % ( raptor.name, raptor_version.fullversion(), " ".join(raptor.hostplatform), raptor.hostplatform_dir, self.raptor.filesystem, @@ -168,14 +170,17 @@ """Generate a set of makefiles, or one big Makefile.""" if not self.valid: - return + return None + + self.raptor.Debug("Writing Makefile '%s'" % (str(toplevel))) self.toplevel = toplevel # create the top-level makefiles + makefileset = None try: - self.makefileset = MakefileSet(directory = str(toplevel.Dir()), + makefileset = MakefileSet(directory = str(toplevel.Dir()), selectors = self.selectors, filenamebase = str(toplevel.File()), prologue = self.makefile_prologue, @@ -190,11 +195,10 @@ self.many = not self.raptor.writeSingleMakefile # add a makefile for each spec under each config - config_makefileset = self.makefileset - + config_makefileset = makefileset for c in configs: if self.many: - config_makefileset = self.makefileset.createChild(c.name) + config_makefileset = makefileset.createChild(c.name) # make sure the config_wide spec item is put out first so that it # can affect everything. @@ -207,16 +211,22 @@ ordered_specs.append(s) if config_wide_spec is not None: - config_wide_spec.Configure(c) + config_wide_spec.Configure(c, cache = self.raptor.cache) self.WriteConfiguredSpec(config_makefileset, config_wide_spec, c, True) for s in ordered_specs: - s.Configure(c) + s.Configure(c, cache = self.raptor.cache) self.WriteConfiguredSpec(config_makefileset, s, c, False) - self.makefileset.close() + makefileset.close() except Exception,e: - self.raptor.Error("Failed to write makefile '%s': %s" % (str(toplevel),str(e))) + tb = traceback.format_exc() + if not self.raptor.debugOutput: + tb="" + self.raptor.Error("Failed to write makefile '%s': %s : %s" % (str(toplevel),str(e),tb)) + makefileset = None + + return makefileset def WriteConfiguredSpec(self, parentMakefileSet, spec, config, useAllInterfaces): @@ -233,9 +243,10 @@ guard = None if hasInterface: # find the Interface (it may be a ref) - iface = spec.GetInterface() + try: + iface = spec.GetInterface(self.raptor.cache) - if iface == None: + except raptor_data.MissingInterfaceError, e: self.raptor.Error("No interface for '%s'", spec.name) return @@ -268,12 +279,12 @@ md5hash.update(value) # parameters required by the interface - for p in iface.GetParams(): + for p in iface.GetParams(self.raptor.cache): val = evaluator.Resolve(p.name) addparam(p.name,val,p.default) # Use Patterns to fetch a group of parameters - for g in iface.GetParamGroups(): + for g in iface.GetParamGroups(self.raptor.cache): for k,v in evaluator.ResolveMatching(g.patternre): addparam(k,v,g.default) @@ -301,7 +312,7 @@ # generate the call to the FLM if iface is not None: - makefileset.addCall(spec.name, config.name, iface.name, useAllInterfaces, iface.GetFLMIncludePath(), parameters, guard) + makefileset.addCall(spec.name, config.name, iface.name, useAllInterfaces, iface.GetFLMIncludePath(self.raptor.cache), parameters, guard) # recursive includes @@ -341,7 +352,7 @@ return False # Save file names to a list, to allow the order to be reversed - fileName_list = list(self.makefileset.makefileNames()) + fileName_list = list(makefileset.makefileNames()) # Iterate through args passed to raptor, searching for CLEAN or REALLYCLEAN clean_flag = False @@ -401,7 +412,7 @@ # targets go at the end, if the makefile supports them addTargets = self.raptor.targets[:] - ignoreTargets = self.makefileset.ignoreTargets(makefile) + ignoreTargets = makefileset.ignoreTargets(makefile) if addTargets and ignoreTargets: for target in self.raptor.targets: if re.match(ignoreTargets, target): @@ -410,6 +421,9 @@ if addTargets: command += " " + " ".join(addTargets) + # Substitute the makefile name for any occurrence of #MAKEFILE# + command = command.replace("#MAKEFILE#", str(makefile)) + self.raptor.Info("Executing '%s'", command) # execute the build. @@ -496,7 +510,7 @@ looking = (os.system(command) != 0) tries += 1 if looking: - self.raptor.Error("Failed to initilaise the talon shell for this build") + self.raptor.Error("Failed to initialise the talon shell for this build") self.talonctl = "" return False diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_makefile.py --- a/sbsv2/raptor/python/raptor_makefile.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_makefile.py Mon Nov 16 20:39:37 2009 +0000 @@ -134,6 +134,15 @@ return True + def addInclude(self, makefilename): + """ + """ + # create the directory if it does not exist + + self.open() + # now we can write the values into the makefile + self.file.write("include %s\n" % (makefilename+"."+self.selector.name)) + def close(self): if self.file is not None: if self.epilogue != None: @@ -191,6 +200,11 @@ for f in self.makefiles: f.addCall(specname, configname, ifname, useAllInterfaces, flmpath, parameters, guard) + def addInclude(self, makefilename): + """include a makefile from each of the makefiles in the set - has the selector name appended to it.""" + for f in self.makefiles: + f.addInclude(makefilename) + def makefileNames(self): for mf in self.makefiles: yield str(mf.filename) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_meta.py --- a/sbsv2/raptor/python/raptor_meta.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_meta.py Mon Nov 16 20:39:37 2009 +0000 @@ -232,6 +232,19 @@ return commentDetail +def getSpecName(aFileRoot, fullPath=False): + """Returns a build spec name: this is the file root (full path + or simple file name) made safe for use as a file name.""" + + if fullPath: + specName = str(aFileRoot).replace("/","_") + specName = specName.replace(":","") + else: + specName = aFileRoot.File() + + return specName.lower() + + # Classes class MetaDataError(Exception): @@ -398,11 +411,13 @@ on the selected build platform. This class provides a generic means of wrapping up the preprocessing of such files.""" - def __init__(self, aFilename, gnucpp, aRootLocation=None, log=None): + def __init__(self, aFilename, gnucpp, depfiles, aRootLocation=None, log=None): """ @param aFilename An MMP, bld.inf or other preprocessable build spec file @param aDefaultPlatform Default preprocessed version of this file @param aCPP location of GNU CPP + @param depfiles list to add dependency file tuples to + @param aRootLocation where the file is @param log A class with Debug(), Info() and Error() methods """ self.filename = aFilename @@ -410,6 +425,7 @@ # Dictionary with key of build platform and a text string of processed output as values self.__PreProcessedContent = {} self.log = log + self.depfiles = depfiles self.__gnucpp = gnucpp if gnucpp is None: @@ -436,7 +452,7 @@ else: metatarget = "'$(PARSETARGET)'" generateDepsOptions = "-MD -MF%s -MT%s" % (adepfilename, metatarget) - aBuildPlatform['METADEPS'].append((adepfilename, metatarget)) + self.depfiles.append((adepfilename, metatarget)) try: os.makedirs(os.path.dirname(adepfilename)) except Exception, e: @@ -515,15 +531,17 @@ on the selected build platform. This class provides a generic means of wrapping up the preprocessing of such files.""" - def __init__(self, aFilename, gnucpp, bldinf, log=None): + def __init__(self, aFilename, gnucpp, bldinf, depfiles, log=None): """ @param aFilename An MMP, bld.inf or other preprocessable build spec file @param gnucpp location of GNU CPP - @param bldinf the bldinf file that this mmp comes from - @param log A class with Debug(), Info() and Error() methods + @param bldinf the bld.inf file this mmp was specified in + @param depfiles list to fill with mmp dependency files + @param log A class with Debug(), Info() and Error() methods """ - super(MMPFile, self).__init__(aFilename, gnucpp, str(bldinf.filename.Dir()), log) + super(MMPFile, self).__init__(aFilename, gnucpp, depfiles, str(bldinf.filename.Dir()), log) self.__bldinf = bldinf + self.depfiles = depfiles self.__gnucpp = gnucpp if gnucpp is None: @@ -878,8 +896,8 @@ class BldInfFile(MetaDataFile): """Representation of a Symbian bld.inf file""" - def __init__(self, aFilename, gnucpp, log=None): - MetaDataFile.__init__(self, aFilename, gnucpp, None, log) + def __init__(self, aFilename, gnucpp, depfiles, log=None): + MetaDataFile.__init__(self, aFilename, gnucpp, depfiles, None, log) self.__Raptor = log self.testManual = 0 self.testAuto = 0 @@ -1194,7 +1212,8 @@ super(MMPRaptorBackend,self).__init__() self.platformblock = None self.__Raptor = aRaptor - self.BuildVariant = raptor_data.Variant() + self.__debug("-----+++++ %s " % aMmpfilename) + self.BuildVariant = raptor_data.Variant(name = "mmp") self.ResourceVariants = [] self.BitmapVariants = [] self.StringTableVariants = [] @@ -1208,11 +1227,11 @@ self.__systeminclude = "" self.__bitmapSourcepath = self.__sourcepath self.__current_resource = "" - self.__capabilities = [] - self.__resourceFiles = [] self.__pageConflict = [] self.__debuggable = "" + self.__resourceFiles = [] self.sources = [] + self.capabilities = [] self.__TARGET = "" self.__TARGETEXT = "" @@ -1423,9 +1442,8 @@ elif varname=='CAPABILITY': for cap in toks[1]: - self.BuildVariant.AddOperation(raptor_data.Append(varname,cap," ")) self.__debug("Setting "+toks[0]+": " + cap) - self.__capabilities.append(cap.lower()) + self.capabilities.append(cap) elif varname=='DEFFILE': self.__defFileRoot = self.__currentMmpFile self.deffile = toks[1] @@ -1767,7 +1785,7 @@ replace = "" if len(matches): replace = matches.pop() - + searchReplacePairs.append('%s<->%s' % (search, replace)) # Replace spaces to maintain word-based grouping in downstream makefile lists @@ -1886,7 +1904,7 @@ self.__currentLineNumber += 1 self.__debug("Start BITMAP "+toks[1]) - self.__currentBitmapVariant = raptor_data.Variant(toks[1].replace('.','_')) + self.__currentBitmapVariant = raptor_data.Variant(name = toks[1].replace('.','_')) # Use BMTARGET and BMTARGET_lower because that prevents # confusion with the TARGET and TARGET_lower of our parent MMP # when setting the OUTPUTPATH. This in turn allows us to @@ -1976,7 +1994,7 @@ self.__debug("stringtable: " + toks[1]) self.__debug("adjusted stringtable source=" + source) - self.__currentStringTableVariant = raptor_data.Variant(uniqname) + self.__currentStringTableVariant = raptor_data.Variant(name = uniqname) self.__currentStringTableVariant.AddOperation(raptor_data.Set("SOURCE", source)) self.__currentStringTableVariant.AddOperation(raptor_data.Set("EXPORTPATH", "")) self.__stringtableExported = False @@ -2169,11 +2187,14 @@ self.ResourceVariants[i].AddOperation(raptor_data.Set("MAIN_TARGET_lower", self.__TARGET.lower())) self.ResourceVariants[i].AddOperation(raptor_data.Set("MAIN_REQUESTEDTARGETEXT", self.__TARGETEXT.lower())) + # Create Capability variable in one SET operation (more efficient than multiple appends) + self.BuildVariant.AddOperation(raptor_data.Set("CAPABILITY"," ".join(self.capabilities))) + # Resolve combined capabilities as hex flags, for configurations that require them capabilityFlag1 = 0 capabilityFlag2 = 0 # Always 0 - for capability in self.__capabilities: + for capability in [c.lower() for c in self.capabilities]: invert = 0 if capability.startswith('-'): @@ -2285,6 +2306,32 @@ return resolvedDefFile +def CheckedGet(self, key, default = None): + """extract a value from an self and raise an exception if None. + + An optional default can be set to replace a None value. + + This function belongs in the Evaluator class logically. But + Evaluator doesn't know how to raise a Metadata error. Since + being able to raise a metadata error is the whole point of + the method, it makes sense to adapt the Evaluator class from + raptor_meta for the use of everything inside raptor_meta. + + ... so it will be added to the Evaluator class. + """ + + value = self.Get(key) + if value == None: + if default == None: + raise MetaDataError("configuration " + self.buildUnit.name + + " has no variable " + key) + else: + return default + return value + +raptor_data.Evaluator.CheckedGet = CheckedGet + + class MetaReader(object): """Entry point class for Symbian metadata processing. @@ -2301,10 +2348,10 @@ # Get the version of CPP that we are using metadata = self.__Raptor.cache.FindNamedVariant("meta") evaluator = self.__Raptor.GetEvaluator(None, raptor_data.BuildUnit(metadata.name, [metadata]) ) - self.__gnucpp = self.CheckValue(evaluator, "GNUCPP") - self.__defaultplatforms = self.CheckValue(evaluator, "DEFAULT_PLATFORMS") - self.__basedefaultplatforms = self.CheckValue(evaluator, "BASE_DEFAULT_PLATFORMS") - self.__baseuserdefaultplatforms = self.CheckValue(evaluator, "BASE_USER_DEFAULT_PLATFORMS") + self.__gnucpp = evaluator.CheckedGet("GNUCPP") + self.__defaultplatforms = evaluator.CheckedGet("DEFAULT_PLATFORMS") + self.__basedefaultplatforms = evaluator.CheckedGet("BASE_DEFAULT_PLATFORMS") + self.__baseuserdefaultplatforms = evaluator.CheckedGet("BASE_USER_DEFAULT_PLATFORMS") # Only read each variant.cfg once variantCfgs = {} @@ -2323,24 +2370,25 @@ # with the same "export platform". exports = {} + self.__Raptor.Debug("MetaReader: configsToBuild: %s", [b.name for b in configsToBuild]) for buildConfig in configsToBuild: # get everything we need to know about the configuration evaluator = self.__Raptor.GetEvaluator(None, buildConfig) detail = {} - detail['PLATFORM'] = self.CheckValue(evaluator, "TRADITIONAL_PLATFORM") - epocroot = self.CheckValue(evaluator, "EPOCROOT") + detail['PLATFORM'] = evaluator.CheckedGet("TRADITIONAL_PLATFORM") + epocroot = evaluator.CheckedGet("EPOCROOT") detail['EPOCROOT'] = generic_path.Path(epocroot) - sbs_build_dir = self.CheckValue(evaluator, "SBS_BUILD_DIR") + sbs_build_dir = evaluator.CheckedGet("SBS_BUILD_DIR") detail['SBS_BUILD_DIR'] = generic_path.Path(sbs_build_dir) - flm_export_dir = self.CheckValue(evaluator, "FLM_EXPORT_DIR") + flm_export_dir = evaluator.CheckedGet("FLM_EXPORT_DIR") detail['FLM_EXPORT_DIR'] = generic_path.Path(flm_export_dir) detail['CACHEID'] = flm_export_dir if raptor_utilities.getOSPlatform().startswith("win"): - detail['PLATMACROS'] = self.CheckValue(evaluator,"PLATMACROS.WINDOWS") + detail['PLATMACROS'] = evaluator.CheckedGet("PLATMACROS.WINDOWS") else: - detail['PLATMACROS'] = self.CheckValue(evaluator,"PLATMACROS.LINUX") + detail['PLATMACROS'] = evaluator.CheckedGet("PLATMACROS.LINUX") # Apply OS variant provided we are not ignoring this if not self.__Raptor.ignoreOsDetection: @@ -2352,11 +2400,11 @@ # is this a feature variant config or an ordinary variant fv = evaluator.Get("FEATUREVARIANTNAME") if fv: - variantHdr = self.CheckValue(evaluator, "VARIANT_HRH") + variantHdr = evaluator.CheckedGet("VARIANT_HRH") variantHRH = generic_path.Path(variantHdr) detail['ISFEATUREVARIANT'] = True else: - variantCfg = self.CheckValue(evaluator, "VARIANT_CFG") + variantCfg = evaluator.CheckedGet("VARIANT_CFG") variantCfg = generic_path.Path(variantCfg) if not variantCfg in variantCfgs: # get VARIANT_HRH from the variant.cfg file @@ -2371,19 +2419,18 @@ detail['VARIANT_HRH'] = variantHRH self.__Raptor.Info("'%s' uses variant hrh file '%s'", buildConfig.name, variantHRH) - detail['SYSTEMINCLUDE'] = self.CheckValue(evaluator, "SYSTEMINCLUDE") - - detail['METADEPS'] = [] # Dependency targets for all metadata files in this platform + detail['SYSTEMINCLUDE'] = evaluator.CheckedGet("SYSTEMINCLUDE") + # find all the interface names we need - ifaceTypes = self.CheckValue(evaluator, "INTERFACE_TYPES") + ifaceTypes = evaluator.CheckedGet("INTERFACE_TYPES") interfaces = ifaceTypes.split() for iface in interfaces: - detail[iface] = self.CheckValue(evaluator, "INTERFACE." + iface) + detail[iface] = evaluator.CheckedGet("INTERFACE." + iface) # not test code unless positively specified - detail['TESTCODE'] = self.CheckValue(evaluator, "TESTCODE", "") + detail['TESTCODE'] = evaluator.CheckedGet("TESTCODE", "") # make a key that identifies this platform uniquely # - used to tell us whether we have done the pre-processing @@ -2454,20 +2501,8 @@ # that are supposedly platform independent (e.g. PRJ_PLATFORMS) self.defaultPlatform = self.ExportPlatforms[0] - def CheckValue(self, evaluator, key, default = None): - """extract a value from an evaluator and raise an exception if None. - - An optional default can be set to replace a None value.""" - value = evaluator.Get(key) - if value == None: - if default == None: - raise MetaDataError("configuration " + evaluator.config.name + - " has no variable " + key) - else: - return default - return value - - def ReadBldInfFiles(self, aFileList, doExportOnly): + + def ReadBldInfFiles(self, aComponentList, doExportOnly): """Take a list of bld.inf files and return a list of build specs. The returned specification nodes will be suitable for all the build @@ -2477,7 +2512,7 @@ # we need a Filter node per export platform exportNodes = [] for i,ep in enumerate(self.ExportPlatforms): - filter = raptor_data.Filter("export_" + str(i)) + filter = raptor_data.Filter(name = "export_" + str(i)) # what configurations is this node active for? for config in ep['configs']: @@ -2488,7 +2523,7 @@ # we need a Filter node per build platform platformNodes = [] for i,bp in enumerate(self.BuildPlatforms): - filter = raptor_data.Filter("build_" + str(i)) + filter = raptor_data.Filter(name = "build_" + str(i)) # what configurations is this node active for? for config in bp['configs']: @@ -2504,18 +2539,18 @@ # check that each bld.inf exists and add a Specification node for it # to the nodes of the export and build platforms that it supports. - for bif in aFileList: - if bif.isFile(): - self.__Raptor.Info("Processing %s", str(bif)) + for c in aComponentList: + if c.bldinf_filename.isFile(): + self.__Raptor.Info("Processing %s", str(c.bldinf_filename)) try: - self.AddComponentNodes(bif, exportNodes, platformNodes) + self.AddComponentNodes(c, exportNodes, platformNodes) except MetaDataError, e: - self.__Raptor.Error(e.Text, bldinf=str(bif)) + self.__Raptor.Error(e.Text, bldinf=str(c.bldinf_filename)) if not self.__Raptor.keepGoing: return [] else: - self.__Raptor.Error("build info file does not exist", bldinf=str(bif)) + self.__Raptor.Error("build info file does not exist", bldinf=str(c.bldinf_filename)) if not self.__Raptor.keepGoing: return [] @@ -2617,74 +2652,78 @@ return moduleName - def AddComponentNodes(self, buildFile, exportNodes, platformNodes): + def AddComponentNodes(self, component, exportNodes, platformNodes): """Add Specification nodes for a bld.inf to the appropriate platforms.""" - bldInfFile = BldInfFile(buildFile, self.__gnucpp, self.__Raptor) - - specName = self.getSpecName(buildFile, fullPath=True) - - if isinstance(buildFile, raptor_xml.SystemModelComponent): + bldInfFile = BldInfFile(component.bldinf_filename, self.__gnucpp, component.depfiles, self.__Raptor) + component.bldinf = bldInfFile + + specName = getSpecName(component.bldinf_filename, fullPath=True) + + if isinstance(component.bldinf, raptor_xml.SystemModelComponent): # this component came from a system_definition.xml - layer = buildFile.GetContainerName("layer") - component = buildFile.GetContainerName("component") + layer = component.bldinf.GetContainerName("layer") + componentName = component.bldinf.GetContainerName("component") else: # this is a plain old bld.inf file from the command-line layer = "" - component = "" + componentName = "" # exports are independent of build platform for i,ep in enumerate(self.ExportPlatforms): - specNode = raptor_data.Specification(specName) + specNode = raptor_data.Specification(name = specName) # keep the BldInfFile object for later - specNode.bldinf = bldInfFile + specNode.component = component # add some basic data in a component-wide variant - var = raptor_data.Variant() - var.AddOperation(raptor_data.Set("COMPONENT_META", str(buildFile))) - var.AddOperation(raptor_data.Set("COMPONENT_NAME", component)) + var = raptor_data.Variant(name='component-wide') + var.AddOperation(raptor_data.Set("COMPONENT_META", str(component.bldinf_filename))) + var.AddOperation(raptor_data.Set("COMPONENT_NAME", componentName)) var.AddOperation(raptor_data.Set("COMPONENT_LAYER", layer)) specNode.AddVariant(var) # add this bld.inf Specification to the export platform exportNodes[i].AddChild(specNode) + component.exportspecs.append(specNode) # get the relevant build platforms listedPlatforms = bldInfFile.getBuildPlatforms(self.defaultPlatform) platforms = getBuildableBldInfBuildPlatforms(listedPlatforms, - self.__defaultplatforms, - self.__basedefaultplatforms, - self.__baseuserdefaultplatforms) - - - - outputDir = BldInfFile.outputPathFragment(buildFile) + self.__defaultplatforms, + self.__basedefaultplatforms, + self.__baseuserdefaultplatforms) + + + outputDir = BldInfFile.outputPathFragment(component.bldinf_filename) # Calculate "module name" - modulename = self.ModuleName(str(buildFile)) + modulename = self.ModuleName(str(component.bldinf_filename)) for i,bp in enumerate(self.BuildPlatforms): + plat = bp['PLATFORM'] if bp['PLATFORM'] in platforms: - specNode = raptor_data.Specification(specName) - - # keep the BldInfFile object for later - specNode.bldinf = bldInfFile + specNode = raptor_data.Specification(name = specName) + + # remember what component this spec node comes from for later + specNode.component = component # add some basic data in a component-wide variant - var = raptor_data.Variant() - var.AddOperation(raptor_data.Set("COMPONENT_META",str(buildFile))) - var.AddOperation(raptor_data.Set("COMPONENT_NAME", component)) + var = raptor_data.Variant(name='component-wide-settings-' + plat) + var.AddOperation(raptor_data.Set("COMPONENT_META",str(component.bldinf_filename))) + var.AddOperation(raptor_data.Set("COMPONENT_NAME", componentName)) var.AddOperation(raptor_data.Set("COMPONENT_LAYER", layer)) var.AddOperation(raptor_data.Set("MODULE", modulename)) var.AddOperation(raptor_data.Append("OUTPUTPATHOFFSET", outputDir, '/')) var.AddOperation(raptor_data.Append("OUTPUTPATH", outputDir, '/')) var.AddOperation(raptor_data.Append("BLDINF_OUTPUTPATH",outputDir, '/')) - var.AddOperation(raptor_data.Set("TEST_OPTION", specNode.bldinf.getRomTestType(bp))) + var.AddOperation(raptor_data.Set("TEST_OPTION", component.bldinf.getRomTestType(bp))) specNode.AddVariant(var) # add this bld.inf Specification to the build platform platformNodes[i].AddChild(specNode) + # also attach it into the component + component.specs.append(specNode) def ProcessExports(self, componentNode, exportPlatform): """Do the exports for a given platform and skeleton bld.inf node. @@ -2696,18 +2735,18 @@ [some MMP files #include exported .mmh files] """ if exportPlatform["TESTCODE"]: - exports = componentNode.bldinf.getTestExports(exportPlatform) + exports = componentNode.component.bldinf.getTestExports(exportPlatform) else: - exports = componentNode.bldinf.getExports(exportPlatform) + exports = componentNode.component.bldinf.getExports(exportPlatform) self.__Raptor.Debug("%i exports for %s", - len(exports), str(componentNode.bldinf.filename)) + len(exports), str(componentNode.component.bldinf.filename)) if exports: # each export is either a 'copy' or 'unzip' # maybe we should trap multiple exports to the same location here? epocroot = str(exportPlatform["EPOCROOT"]) - bldinf_filename = str(componentNode.bldinf.filename) + bldinf_filename = str(componentNode.component.bldinf.filename) exportwhatlog="\n" % bldinf_filename for export in exports: expSrc = export.getSource() @@ -2730,7 +2769,6 @@ # export the file exportwhatlog += self.CopyExport(fromFile, toFile, bldinf_filename) else: - # unzip the zip exportwhatlog += ("\n") members = self.UnzipExport(fromFile, toFile, str(exportPlatform['SBS_BUILD_DIR']), @@ -2917,12 +2955,12 @@ return # feature variation does not run extensions at all if buildPlatform["TESTCODE"]: - extensions = componentNode.bldinf.getTestExtensions(buildPlatform) + extensions = componentNode.component.bldinf.getTestExtensions(buildPlatform) else: - extensions = componentNode.bldinf.getExtensions(buildPlatform) + extensions = componentNode.component.bldinf.getExtensions(buildPlatform) self.__Raptor.Debug("%i template extension makefiles for %s", - len(extensions), str(componentNode.bldinf.filename)) + len(extensions), str(componentNode.component.bldinf.filename)) for i,extension in enumerate(extensions): if self.__Raptor.projects: @@ -3001,14 +3039,20 @@ gnuList = [] makefileList = [] + + component = componentNode.component + + if buildPlatform["TESTCODE"]: - MMPList = componentNode.bldinf.getTestMMPList(buildPlatform) + MMPList = component.bldinf.getTestMMPList(buildPlatform) else: - MMPList = componentNode.bldinf.getMMPList(buildPlatform) - - bldInfFile = componentNode.bldinf.filename + MMPList = component.bldinf.getMMPList(buildPlatform) + + bldInfFile = component.bldinf.filename for mmpFileEntry in MMPList['mmpFileList']: + component.AddMMP(mmpFileEntry.filename) # Tell the component another mmp is specified (for this platform) + projectname = mmpFileEntry.filename.File().lower() if self.__Raptor.projects: @@ -3026,7 +3070,8 @@ mmpFile = MMPFile(foundmmpfile, self.__gnucpp, - bldinf = componentNode.bldinf, + component.bldinf, + component.depfiles, log = self.__Raptor) mmpFilename = mmpFile.filename @@ -3060,7 +3105,7 @@ continue # now build the specification tree - mmpSpec = raptor_data.Specification(self.getSpecName(mmpFilename)) + mmpSpec = raptor_data.Specification(generic_path.Path(getSpecName(mmpFilename))) var = backend.BuildVariant var.AddOperation(raptor_data.Set("PROJECT_META", str(mmpFilename))) @@ -3096,7 +3141,7 @@ # Although not part of the MMP, some MMP-based build specs additionally require knowledge of their # container bld.inf exported headers - for export in componentNode.bldinf.getExports(buildPlatform): + for export in componentNode.component.bldinf.getExports(buildPlatform): destination = export.getDestination() if isinstance(destination, list): exportfile = str(destination[0]) @@ -3152,7 +3197,7 @@ self.projectList.remove(projectname) self.__Raptor.Debug("%i gnumakefile extension makefiles for %s", - len(gnuList), str(componentNode.bldinf.filename)) + len(gnuList), str(componentNode.component.bldinf.filename)) var = raptor_data.Variant() gnuSpec = raptor_data.Specification("gnumakefile " + str(g.getMakefileName())) interface = buildPlatform["ext_makefile"] @@ -3184,7 +3229,7 @@ projectList.remove(projectname) self.__Raptor.Debug("%i makefile extension makefiles for %s", - len(makefileList), str(componentNode.bldinf.filename)) + len(makefileList), str(componentNode.component.bldinf.filename)) var = raptor_data.Variant() gnuSpec = raptor_data.Specification("makefile " + str(m.getMakefileName())) interface = buildPlatform["ext_makefile"] @@ -3205,17 +3250,6 @@ gnuSpec.AddVariant(var) componentNode.AddChild(gnuSpec) - def getSpecName(self, aFileRoot, fullPath=False): - """Returns a build spec name: this is the file root (full path - or simple file name) made safe for use as a file name.""" - - if fullPath: - specName = str(aFileRoot).replace("/","_") - specName = specName.replace(":","") - else: - specName = aFileRoot.File() - - return specName.lower() def ApplyOSVariant(self, aBuildUnit, aEpocroot): # Form path to kif.xml and path to buildinfo.txt diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/python/raptor_version.py --- a/sbsv2/raptor/python/raptor_version.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/python/raptor_version.py Mon Nov 16 20:39:37 2009 +0000 @@ -15,6 +15,12 @@ # raptor version information module # -def Version(): +version=(2,11,0,"2009-11-16","pp-preview") + +def numericversion(): """Raptor version string""" - return "2.10.2 [2009-11-12 sf release]" + return "%d.%d.%d" % version[:3] + +def fullversion(): + """Raptor version string""" + return "%d.%d.%d [%s %s]" % version diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/common/raptor_tests.py --- a/sbsv2/raptor/test/common/raptor_tests.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/common/raptor_tests.py Mon Nov 16 20:39:37 2009 +0000 @@ -179,6 +179,11 @@ def fix_id(input_id): return input_id.zfill(4) + + +def grep(file, string): + return + # Test classes ################################################################ @@ -186,13 +191,15 @@ """Base class for Smoke Test objects. Each test is defined (minimally) by, - 1) a raptor command-line - 2) a list of target files that should get built + 1) an ID number as a string + 2) a name + 3) a raptor command-line + 4) some parameters to check the command results against The run() method will, 1) delete all the listed target files 2) execute the raptor command - 3) check that the target files were created + 3) check that the test results match the test parameters 4) count the warnings and errors reported """ @@ -202,7 +209,7 @@ def __init__(self): - self.id = 0 + self.id = "0" self.name = "smoketest" self.description = "" self.command = "sbs --do_what_i_want" @@ -261,23 +268,24 @@ self.result = SmokeTest.FAIL # print the result of this run() - self.print_result(True) + self.print_result(internal = True) # if a previous run() failed then the overall result is a FAIL if previousResult == SmokeTest.FAIL: self.result = SmokeTest.FAIL - def print_result(self, internal = False, value = ""): + def print_result(self, value = "", internal = False): # the test passed :-) result = self.result + + string = "" + if not internal: + string += "\n" + self.name + ": " - if value != "": - print value + if value: + print string + value else: - string = "" - if not internal: - string += "\n" + self.name + ": " if result == SmokeTest.PASS: string += "PASSED" elif result == SmokeTest.FAIL: @@ -366,19 +374,27 @@ # Any environment settings specific to this test shellenv = os.environ.copy() for ev in self.environ: - shellenv[ev] = self.environ[ev] + shellenv[ev] = self.environ[ev] if self.usebash: shellpath = shellenv['PATH'] + + if 'SBS_SHELL' in os.environ: + BASH = os.environ['SBS_SHELL'] + else: + if self.onWindows: + if 'SBS_CYGWIN' in shellenv: + BASH = ReplaceEnvs("$(SBS_CYGWIN)/bin/bash.exe") + else: + BASH = ReplaceEnvs("$(SBS_HOME)/win32/cygwin/bin/bash.exe") + else: + BASH = ReplaceEnvs("$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/bash") + if self.onWindows: if 'SBS_CYGWIN' in shellenv: shellpath = ReplaceEnvs("$(SBS_CYGWIN)/bin") + ";" + shellpath - BASH=ReplaceEnvs("$(SBS_CYGWIN)/bin/bash.exe") else: shellpath = ReplaceEnvs("$(SBS_HOME)/win32/cygwin/bin") + ";" + shellpath - BASH=ReplaceEnvs("$(SBS_HOME)/win32/cygwin/bin/bash.exe") - else: - BASH=ReplaceEnvs("$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/bash") shellenv['SBSMAKEFILE']=ReplaceEnvs(self.makefile()) shellenv['SBSLOGFILE']=ReplaceEnvs(self.logfile()) @@ -645,5 +661,6 @@ else: self.antitargets.append(["$(EPOCROOT)/epoc32/build/"+fragment+"/"+x for x in t]) return + # the end diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/config/arm.xml --- a/sbsv2/raptor/test/config/arm.xml Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/config/arm.xml Mon Nov 16 20:39:37 2009 +0000 @@ -7,6 +7,7 @@ + diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/retirement/metadep.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/test/retirement/metadep.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,50 @@ +# +# 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 = "71" + t.name = "metadep" + t.description = """Tests metadata dependency generation. Changes + to bld.infs and mmps can be detected.""" + t.usebash = True + t.command = """export SBSLOGFILE SBSMAKEFILE; bash smoke_suite/test_resources/metadep.sh 2>&1""" + + t.targets = [ + ] + + t.mustmatch_multiline = [ +""".*Step 1 .*no warnings or errors.* +sbs: build log in.* +\+ sleep 1.* +.*make -rf .*epoc32/build/metadata_all.mk.* +.*make.*epoc32/build/metadata_all.mk. is up to date.* +Step 2 .* +.*RE-RUNNING SBS with previous parameters.* +Step 3 .* +.*RE-RUNNING SBS with previous parameters.* +.*RE-RUNNING SBS with previous parameters.*""" + ] + t.mustnotmatch_multiline = [ +"""RE-RUNNING SBS with previous parameters.* +RE-RUNNING SBS with previous parameters.* +RE-RUNNING SBS with previous parameters.* +RE-RUNNING SBS with previous parameters.*""" + ] + t.run() + return t diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/smoke_suite/bitmap.py --- a/sbsv2/raptor/test/smoke_suite/bitmap.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/smoke_suite/bitmap.py Mon Nov 16 20:39:37 2009 +0000 @@ -40,10 +40,10 @@ "testbitmap_dll/testbitmap.mBm_bmconvcommands" ]) t.mustmatch = [ - ".*Makefile.bitmap:MIFCONV_TEST:=1.*" + ".*Makefile(_all)?.bitmap:MIFCONV_TEST:=1.*" ] t.mustnotmatch = [ - ".*Makefile.default:MIFCONV_TEST.*" + ".*Makefile(_all)?.default:MIFCONV_TEST.*" ] t.run() return t diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/smoke_suite/clean_readonly.py --- a/sbsv2/raptor/test/smoke_suite/clean_readonly.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/smoke_suite/clean_readonly.py Mon Nov 16 20:39:37 2009 +0000 @@ -19,26 +19,54 @@ import stat def run(): - # This particular file createstaticdll.dll is changed to be readonly to test - # if sbs CLEAN command actually gets rid of read only files - fileForClean = (os.environ['EPOCROOT'] + \ - "/epoc32/release/armv5/urel/createstaticdll.dll") - if os.path.exists(fileForClean): - os.chmod(fileForClean, stat.S_IREAD) + + # build something; make it read-only; then try and clean it t = AntiTargetSmokeTest() - t.id = "10" + t.id = "10a" t.name = "cleanreadonly" - t.command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c armv5 CLEAN" - t.antitargets = [ + t.command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c armv5" + t.targets = [ "$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll.dll.sym", - "$(EPOCROOT)/epoc32/build/test/simple_dll/createstaticdll_dll/armv5/udeb/CreateStaticDLL.o", "$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll.dll.sym", - "$(EPOCROOT)/epoc32/build/test/simple_dll/createstaticdll_dll/armv5/urel/CreateStaticDLL.o", "$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll.dso", "$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll{000a0000}.dso", "$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll.dll", "$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll.dll" ] + t.addbuildtargets("smoke_suite/test_resources/simple_dll/bld.inf", + [ + "createstaticdll_dll/armv5/udeb/CreateStaticDLL.o", + "createstaticdll_dll/armv5/urel/CreateStaticDLL.o" + ]) t.run() + setupOK = (t.result != AntiTargetSmokeTest.FAIL) + + # This particular file createstaticdll.dll is changed to be readonly to test + # if sbs CLEAN command actually gets rid of read only files + fileForClean = os.environ['EPOCROOT'] + "/epoc32/release/armv5/urel/createstaticdll.dll" + if os.path.exists(fileForClean): + os.chmod(fileForClean, stat.S_IREAD) + + t.id = "10" + t.command = "sbs -b smoke_suite/test_resources/simple_dll/bld.inf -c armv5 CLEAN" + t.targets = [] + t.antitargets = [ + "$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll.dll.sym", + "$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll.dll.sym", + "$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll.dso", + "$(EPOCROOT)/epoc32/release/armv5/lib/createstaticdll{000a0000}.dso", + "$(EPOCROOT)/epoc32/release/armv5/udeb/createstaticdll.dll", + "$(EPOCROOT)/epoc32/release/armv5/urel/createstaticdll.dll" + ] + t.addbuildantitargets("smoke_suite/test_resources/simple_dll/bld.inf", + [ + "createstaticdll_dll/armv5/udeb/CreateStaticDLL.o", + "createstaticdll_dll/armv5/urel/CreateStaticDLL.o" + ]) + t.run() + + if not setupOK: + t.result = AntiTargetSmokeTest.FAIL + return t diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/smoke_suite/commandline.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/test/smoke_suite/commandline.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,21 @@ +# General commandline option handling tests which aren't appropriate as unit tests. + +from raptor_tests import SmokeTest + +def run(): + t = SmokeTest() + t.id = "91a" + t.name = "commandline_nodefaults" + t.description = """Test that raptor complains if you run it without specifying any components and there is no default bld.inf or system definition in the current directory.""" + t.usebash = True + + t.command = """ + TMPDIR="build/commandline_testdefaults"; + cd $(EPOCROOT)/epoc32 && rm -rf "$TMPDIR" 2>/dev/null; mkdir -p "$TMPDIR" && cd "$TMPDIR" && + sbs ${SBSLOGFILE} -n ; rm -rf "$TMPDIR" +m """ + + t.mustmatch = [".*warning: No default bld.inf or system definition.*found.* "] + t.warnings = 1 + t.result = t.run() + return t diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/smoke_suite/featurevariants.py --- a/sbsv2/raptor/test/smoke_suite/featurevariants.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/smoke_suite/featurevariants.py Mon Nov 16 20:39:37 2009 +0000 @@ -15,6 +15,7 @@ # from raptor_tests import SmokeTest +import os def run(): t = SmokeTest() @@ -228,9 +229,13 @@ createvmap = "python $(SBS_HOME)/bin/createvmap.py" vmapfile = "$(EPOCROOT)/epoc32/build/test.vmap" vmap = " -o " + vmapfile - bvcpp = " -c $(SBS_HOME)/$(HOSTPLATFORM_DIR)/bv/bin/cpp" - if t.onWindows: - bvcpp += ".exe" + + if 'SBS_BVCPP' in os.environ: + bvcpp = " -c " + os.environ['SBS_BVCPP'] + else: + bvcpp = " -c $(SBS_HOME)/$(HOSTPLATFORM_DIR)/bv/bin/cpp" + if t.onWindows: + bvcpp += ".exe" bvdata = "$(SBS_HOME)/test/smoke_suite/test_resources/bv" diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/smoke_suite/user_tools.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/test/smoke_suite/user_tools.py Mon Nov 16 20:39:37 2009 +0000 @@ -0,0 +1,82 @@ +import os +import sys +from raptor_tests import SmokeTest + +def run(): + + t = SmokeTest() + t.id = "86" + t.name = "user_tools" + + if sys.platform.lower().startswith("win"): + result = SmokeTest.PASS + t.logfileOption = lambda :"" + t.makefileOption = lambda :"" + t.description = "Tests that Raptor picks up SBS_PYTHON, SBS_CYGWIN " \ + + "and SBS_MINGW from the environment when present" + + + t.id = "0086a" + t.name = "user_python" + t.environ['SBS_PYTHON'] = "C:/pyt*hon" + + t.command = "sbs -b smoke_suite/test_resources/simple/bld.inf -c armv5_urel" \ + + " -n --toolcheck off -f " + t.logfile() + " -m " + t.makefile() + + t.mustmatch = [ + "'C:/pyt\*hon' is not recognized as an internal or external command,", + "operable program or batch file." + ] + t.returncode = 9009 + t.run() + if t.result == SmokeTest.FAIL: + result = SmokeTest.FAIL + + + t.id = "0086b" + t.name = "user_cygwin" + t.environ = {} + t.environ['SBS_CYGWIN'] = "C:/cygwin" + + t.command = "sbs -b smoke_suite/test_resources/simple/bld.inf -c armv5_urel" \ + + " -n --toolcheck off -f " + t.logfile() + " -m " + t.makefile() \ + + " && $(__CYGWIN__)/bin/grep.exe -ir 'TALON_SHELL:=C:/cygwin/bin/sh.exe' " + t.makefile() + ".default" + + t.mustmatch = [ + "TALON_SHELL:=C:/cygwin/bin/sh.exe" + ] + t.returncode = 0 + t.run() + if t.result == SmokeTest.FAIL: + result = SmokeTest.FAIL + + + t.id = "0086c" + t.name = "user_mingw" + t.environ = {} + t.environ['SBS_MINGW'] = "C:/mingw" + + t.command = "sbs -b smoke_suite/test_resources/simple/bld.inf -c armv5_urel" \ + + " -n --toolcheck off -f " + t.logfile() + " -m " + t.makefile() + + t.mustmatch = [ + "sbs: error: Preprocessor exception: \[Error 3\] The system cannot find the path specified" + ] + + t.errors = 1 + t.returncode = 1 + + t.run() + if t.result == SmokeTest.FAIL: + result = SmokeTest.FAIL + + t.id = "86" + t.name = "user_tools" + t.result = result + t.print_result() + + else: + t.run("windows") + + + return t diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/unit_suite/raptor_data_unit.py --- a/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Mon Nov 16 20:39:37 2009 +0000 @@ -84,26 +84,26 @@ filter.AddChildSpecification(raptor_data.Specification("TrueSpec")) filter.Else.AddChildSpecification(raptor_data.Specification("FalseSpec")) - filter.Configure( raptor_data.BuildUnit("ARMV5",[]) ) + filter.Configure( raptor_data.BuildUnit("ARMV5",[]), cache=None ) # check a positive test - iface = filter.GetInterface() + iface = filter.GetInterface(cache=None) self.assertEqual(iface.name, "True.EXE") - vars = filter.GetVariants() + vars = filter.GetVariants(cache = None) self.assertEqual(vars[0].name, "True_var") kids = filter.GetChildSpecs() self.assertEqual(kids[0].name, "TrueSpec") - filter.Configure( raptor_data.BuildUnit("NOT_ARMV5",[]) ) + filter.Configure( raptor_data.BuildUnit("NOT_ARMV5",[]) , cache = None) # check a negative test - iface = filter.GetInterface() + iface = filter.GetInterface(cache = None) self.assertEqual(iface.name, "False.EXE") - vars = filter.GetVariants() + vars = filter.GetVariants(cache = None) self.assertEqual(vars[0].name, "False_var") kids = filter.GetChildSpecs() self.assertEqual(kids[0].name, "FalseSpec") - def testSimpeVariant(self): + def testSimpleVariant(self): var = raptor_data.Variant() self.failUnless(var) self.failIf( var.Valid() ) @@ -127,7 +127,7 @@ self.failUnless( var.Valid() ) var.SetProperty("extends", "") - ops = var.GetAllOperationsRecursively() + ops = var.GetAllOperationsRecursively(None) self.assertEqual( len(ops), 1 ) self.assertEqual( len(ops[0]), 2 ) @@ -158,16 +158,16 @@ r.cache.AddVariant(varB) r.cache.AddVariant(varC) - e = r.GetEvaluator(None, varA.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2A" ) - e = r.GetEvaluator(None, varB.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2B" ) self.assertEqual( e.Get("V3"), "3B" ) - e = r.GetEvaluator(None, varC.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2B" ) self.assertEqual( e.Get("V3"), "3C" ) @@ -201,15 +201,15 @@ r.cache.AddVariant(varB) r.cache.AddVariant(varC) - e = r.GetEvaluator(None, varA.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2A" ) - e = r.GetEvaluator(None, varC.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V3"), "3C" ) self.assertEqual( e.Get("V4"), "4C" ) - e = r.GetEvaluator(None, varB.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2B" ) self.assertEqual( e.Get("V3"), "3B" ) @@ -240,7 +240,7 @@ self.failUnless( alias.Valid() ) - e = r.GetEvaluator(None, alias.GenerateBuildUnits()[0] ) + e = r.GetEvaluator(None, alias.GenerateBuildUnits(r.cache)[0] ) self.assertEqual( e.Get("V1"), "1A" ) self.assertEqual( e.Get("V2"), "2B" ) self.assertEqual( e.Get("V3"), "3C" ) @@ -294,14 +294,14 @@ self.failUnless( group1.Valid() ) self.failUnless( group2.Valid() ) - buildUnits = group1.GenerateBuildUnits() + buildUnits = group1.GenerateBuildUnits(r.cache) self.assertEqual( len(buildUnits), 2 ) self.assertEqual( buildUnits[0].name, "A" ) self.assertEqual( buildUnits[1].name, "alias" ) self.assertEqual( buildUnits[1].variants[0].name, "B" ) self.assertEqual( buildUnits[1].variants[1].name, "C" ) - buildUnits = group2.GenerateBuildUnits() + buildUnits = group2.GenerateBuildUnits(r.cache) self.assertEqual( len(buildUnits), 3 ) self.assertEqual( buildUnits[0].name, "C.B" ) self.assertEqual( buildUnits[1].name, "A" ) @@ -316,7 +316,7 @@ r.cache.Load( generic_path.Join(r.home, "test", "config", "arm.xml") ) - buildUnits = r.cache.FindNamedGroup("G2").GenerateBuildUnits() + buildUnits = r.cache.FindNamedGroup("G2").GenerateBuildUnits(r.cache) self.assertEqual( len(buildUnits), 8 ) @@ -345,10 +345,11 @@ self.SetEnv("EPOCROOT", "/C") aRaptor = raptor.Raptor() cache = aRaptor.cache + aRaptor.debugOutput = True cache.Load(generic_path.Join(aRaptor.home, "test", "config", "arm.xml")) var = cache.FindNamedVariant("ARMV5_UREL") - eval = aRaptor.GetEvaluator( None, var.GenerateBuildUnits()[0] ) + eval = aRaptor.GetEvaluator( None, var.GenerateBuildUnits(aRaptor.cache)[0]) self.RestoreEnv("EPOCROOT") # test the Get method @@ -366,13 +367,14 @@ var.AddOperation(raptor_data.Env("RAPTOR_SAYS_NO")) aRaptor = raptor.Raptor() - var.SetOwner(aRaptor) - - eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits()[0] ) - badval = eval.Get("RAPTOR_SAYS_NO") - - self.assertEqual(badval, "NO_VALUE_FOR_RAPTOR_SAYS_NO") - self.assertEqual(aRaptor.errorCode, 1) + + try: + eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0] ) + badval = eval.Get("RAPTOR_SAYS_NO") + except raptor_data.UninitialisedVariableException, e: + return + + self.assertTrue(False) def checkForParam(self, params, name, default): for p in params: @@ -386,27 +388,27 @@ cache.Load(generic_path.Join(aRaptor.home, "test", "config", "interface.xml")) base = cache.FindNamedInterface("Base.XYZ") - p = base.GetParams() + p = base.GetParams(cache) self.failUnless(self.checkForParam(p, "A", None)) self.failUnless(self.checkForParam(p, "B", "baseB")) self.failUnless(self.checkForParam(p, "C", "baseC")) extended = cache.FindNamedInterface("Extended.XYZ") - p = extended.GetParams() + p = extended.GetParams(cache) self.failUnless(self.checkForParam(p, "A", None)) self.failUnless(self.checkForParam(p, "B", "baseB")) self.failUnless(self.checkForParam(p, "C", "extC")) self.failUnless(self.checkForParam(p, "D", None)) - f = extended.GetFLMIncludePath() + f = extended.GetFLMIncludePath(cache=cache) self.assertEqual(f.File(), "ext.flm") extended = cache.FindNamedInterface("Extended2.XYZ") - p = extended.GetParams() + p = extended.GetParams(cache) self.failUnless(self.checkForParam(p, "A", None)) self.failUnless(self.checkForParam(p, "B", "baseB")) self.failUnless(self.checkForParam(p, "C", "extC")) self.failUnless(self.checkForParam(p, "D", None)) - f = extended.GetFLMIncludePath() + f = extended.GetFLMIncludePath(cache) self.assertEqual(f.File(), "base.flm") diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/unit_suite/raptor_make_unit.py --- a/sbsv2/raptor/test/unit_suite/raptor_make_unit.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/unit_suite/raptor_make_unit.py Mon Nov 16 20:39:37 2009 +0000 @@ -71,14 +71,12 @@ svar.AddOperation(raptor_data.Set("EXEPARAM1", "parameter 1")) svar.AddOperation(raptor_data.Set("EXEPARAM2", "parameter 2")) spec.AddVariant(svar) - spec.SetOwner(aRaptor) # use a minimal Configuration conf = raptor_data.Variant("myConfig") cvar = raptor_data.Variant("CVAR") cvar.AddOperation(raptor_data.Set("EXEPARAM3", "parameter 3")) bldunit = raptor_data.BuildUnit("myConfig.CVAR",[conf,cvar]) - conf.SetOwner(aRaptor) # delete any old Makefiles m1 = testDir.Append("Makefile") @@ -148,7 +146,6 @@ # top1.AddChildSpecification(top1c1) top1.AddChildSpecification(top1c2) - top1.SetOwner(aRaptor) # top 2 has no sub-nodes top2 = raptor_data.Specification("top2") @@ -157,7 +154,6 @@ top2v.AddOperation(raptor_data.Set("EXEPARAM1", "top2 p1")) top2.AddVariant(top2v) # - top2.SetOwner(aRaptor) # use a pair of minimal Configurations @@ -165,13 +161,11 @@ c1var = raptor_data.Variant() c1var.AddOperation(raptor_data.Set("EXEPARAM2", "conf1 p2")) buildunit1 = raptor_data.BuildUnit("conf1.c1var",[conf1,c1var]) - conf1.SetOwner(aRaptor) conf2 = raptor_data.Variant("conf2") c2var = raptor_data.Variant() c2var.AddOperation(raptor_data.Set("EXEPARAM2", "conf2 p2")) buildunit2 = raptor_data.BuildUnit("conf2.c2var",[conf2,c2var]) - conf2.SetOwner(aRaptor) # delete any old Makefiles makefiles = [testDir.Append("Makefile")] @@ -205,6 +199,7 @@ aRaptor.LoadCache() aRaptor.pruneDuplicateMakefiles = False aRaptor.writeSingleMakefile = False + aRaptor.debugOutput = True # find the test directory testDir = aRaptor.home.Append("test", "tmp") @@ -258,7 +253,6 @@ # top.Else.AddChildSpecification(childF) - top.SetOwner(aRaptor) # Configurations @@ -267,42 +261,36 @@ confAv.AddOperation(raptor_data.Set("SWITCH", "confA switch")) confAv.AddOperation(raptor_data.Set("TOGGLE", "confA toggle")) b1 = raptor_data.BuildUnit("confA.confAv",[confA,confAv]) - confA.SetOwner(aRaptor) confB = raptor_data.Variant("confB") # hit confBv = raptor_data.Variant() confBv.AddOperation(raptor_data.Set("SWITCH", "confB switch")) confBv.AddOperation(raptor_data.Set("TOGGLE", "confB toggle")) b2 = raptor_data.BuildUnit("confB.confBv",[confB,confBv]) - confB.SetOwner(aRaptor) confC = raptor_data.Variant("confC") confCv = raptor_data.Variant() confCv.AddOperation(raptor_data.Set("SWITCH", "confC switch")) confCv.AddOperation(raptor_data.Set("TOGGLE", "confC toggle")) b3 = raptor_data.BuildUnit("confC.confCv",[confC,confCv]) - confC.SetOwner(aRaptor) confD = raptor_data.Variant("confD") confDv = raptor_data.Variant() confDv.AddOperation(raptor_data.Set("SWITCH", "ARM")) # hit confDv.AddOperation(raptor_data.Set("TOGGLE", "confD toggle")) b4 = raptor_data.BuildUnit("confD.confDv",[confD,confDv]) - confD.SetOwner(aRaptor) confE = raptor_data.Variant("confE") confEv = raptor_data.Variant() confEv.AddOperation(raptor_data.Set("SWITCH", "confE switch")) confEv.AddOperation(raptor_data.Set("TOGGLE", "B")) # hit b5 = raptor_data.BuildUnit("confE.confEv",[confE,confEv]) - confE.SetOwner(aRaptor) confF = raptor_data.Variant("confF") confFv = raptor_data.Variant() confFv.AddOperation(raptor_data.Set("SWITCH", "confF switch")) confFv.AddOperation(raptor_data.Set("TOGGLE", "confF toggle")) b6 = raptor_data.BuildUnit("confF.confFv",[confF,confFv]) - confF.SetOwner(aRaptor) # delete any old Makefiles makefiles = [testDir.Append("Makefile")] @@ -322,7 +310,7 @@ # create new Makefiles maker = raptor_make.MakeEngine(aRaptor) - maker.Write(makefiles[0], [top], [b1,b2,b3,b4,b5,b6]) + maker.Write(makefiles[0], specs=[top], configs=[b1,b2,b3,b4,b5,b6]) # test and clean self.failUnless(self.checkMakefiles(makefiles)) @@ -353,25 +341,19 @@ f1 = raptor_data.Filter("f1") f1.SetConfigCondition("c1") - f1.SetOwner(aRaptor) f2 = raptor_data.Filter("f2") f2.SetConfigCondition("c2") f2.SetInterface(iface) - f2.SetOwner(aRaptor) f3 = raptor_data.Filter("f3") f3.SetConfigCondition("c3") f3.SetInterface(iface) - f3.SetOwner(aRaptor) # Configurations c1 = raptor_data.Variant("c1") - c1.SetOwner(aRaptor) c2 = raptor_data.Variant("c2") - c2.SetOwner(aRaptor) c3 = raptor_data.Variant("c3") - c3.SetOwner(aRaptor) # Build Units b1 = raptor_data.BuildUnit("c1",[c1]) diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/unit_suite/raptor_meta_unit.py --- a/sbsv2/raptor/test/unit_suite/raptor_meta_unit.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/unit_suite/raptor_meta_unit.py Mon Nov 16 20:39:37 2009 +0000 @@ -147,7 +147,7 @@ self.__gnucpp = "cpp" if os.environ.has_key('GNUCPP'): self.__gnucpp = os.environ['GNUCPP'] - + def testPreProcessor(self): # Just test for correct behaviour on failure, other tests excercise correct behaviour on success preProcessor = raptor_meta.PreProcessor('cpp_that_does_not_exist', @@ -202,7 +202,8 @@ bldInfFile = aRootBldInfLocation.Append(aBldInfFile) self.failUnless(bldInfFile) - bldInfObject = raptor_meta.BldInfFile(bldInfFile, self.__gnucpp, self.raptor) + depfiles=[] + bldInfObject = raptor_meta.BldInfFile(bldInfFile, self.__gnucpp, depfiles=depfiles, log=self.raptor) bp = bldInfObject.getBuildPlatforms(self.defaultPlatform) self.assertEquals(bp, aExpectedBldInfPlatforms) @@ -246,7 +247,8 @@ bldInfTestRoot = self.__testRoot.Append('metadata/project/mmps/test_mmps') bldInfFile = bldInfTestRoot.Append('test_mmps.inf') - bldInfObject = raptor_meta.BldInfFile(bldInfFile, self.__gnucpp, self.raptor) + depfiles = [] + bldInfObject = raptor_meta.BldInfFile(bldInfFile, self.__gnucpp, depfiles=depfiles, log=self.raptor) testArmv5Platform = self.ARMV5 testArmv5Platform["TESTCODE"] = True bldInfObject.getRomTestType(testArmv5Platform) @@ -273,8 +275,9 @@ bldInfTestRoot = self.__testRoot.Append('metadata/project/bld.infs') bldInfMakefilePathTestRoot = str(self.__makefilePathTestRoot) + '/metadata/project/' + depfiles = [] bldInfObject = raptor_meta.BldInfFile(bldInfTestRoot.Append('exports.inf'), - self.__gnucpp, self.raptor) + self.__gnucpp, depfiles=depfiles, log=self.raptor) exports = bldInfObject.getExports(self.defaultPlatform) @@ -491,8 +494,9 @@ def testBldInfExtensions(self): bldInfTestRoot = self.__testRoot.Append('metadata/project/bld.infs') bldInfMakefilePathTestRoot = str(self.__makefilePathTestRoot)+'/metadata/project/bld.infs' + depfiles = [] bldInfObject = raptor_meta.BldInfFile(bldInfTestRoot.Append('extensions.inf'), - self.__gnucpp, self.raptor) + self.__gnucpp, depfiles=depfiles, log=self.raptor) extensions = bldInfObject.getExtensions(self.ARMV5) @@ -565,8 +569,9 @@ def testBldInfIncludes(self): bldInfTestRoot = self.__testRoot.Append('metadata/project/bld.infs/includes') + depfiles=[] bldInfObject = raptor_meta.BldInfFile(bldInfTestRoot.Append('top_level.inf'), - self.__gnucpp, self.raptor) + self.__gnucpp, depfiles=depfiles, log=self.raptor) Root = str(bldInfTestRoot) mmpFiles = bldInfObject.getMMPList(self.ARMV5) @@ -582,15 +587,19 @@ def testMmpIncludes(self): mmpTestRoot = self.__testRoot.Append('metadata/project/mmps/includes') - mmpMakefilePathTestRoot = str(self.__makefilePathTestRoot)+'/metadata/project/mmps/includes' + mmpMakefilePathTestRoot = str(self.__makefilePathTestRoot)+'/metadata/project/mmps/includes' + + depfiles=[] bldInfObject = raptor_meta.BldInfFile(mmpTestRoot.Append('top_level.inf'), - self.__gnucpp, self.raptor) + self.__gnucpp, depfiles=depfiles, log=self.raptor) mmpFiles = bldInfObject.getMMPList(self.ARMV5) + mmpdeps = [] mmpFile = raptor_meta.MMPFile(mmpFiles['mmpFileList'][0].filename, self.__gnucpp, bldInfObject, - self.raptor) + depfiles=mmpdeps, + log=self.raptor) self.assertEquals(str(mmpFile.filename), str(mmpTestRoot.Append("top_level.mmp"))) @@ -728,20 +737,32 @@ for t in defFileTests: self.assertEquals(t.test(self.raptor), True) - + + def dummyMetaReader(self): + "make raptor_meta.MetaReader.__init__ into a none operation" + self.savedInit = raptor_meta.MetaReader.__init__ + + def DummyMetaReaderInit(self, aRaptor): + self._MetaReader__Raptor = aRaptor + + raptor_meta.MetaReader.__init__ = DummyMetaReaderInit + + def restoreMetaReader(self): + "make raptor_meta.MetaReader.__init__ operational again" + raptor_meta.MetaReader.__init__ = self.savedInit + def testApplyOsVariant(self): + self.dummyMetaReader() + # Mock output class class OutputMock(object): def write(self, text): pass - def MetaReaderInitFunction(self, aRaptor): - self._MetaReader__Raptor = aRaptor - bu = raptor_data.BuildUnit("os_variant", []) self.raptor.keepGoing = False - raptor_meta.MetaReader.__init__ = MetaReaderInitFunction + metaReader = raptor_meta.MetaReader(self.raptor) metaReader.ApplyOSVariant(bu, ".") @@ -750,6 +771,8 @@ metaReader = raptor_meta.MetaReader(self.raptor) metaReader.ApplyOSVariant(bu, ".") + self.restoreMetaReader() + def __assertEqualStringList(self, aListOne, aListTwo): self.assertEquals(len(aListOne), len(aListTwo)) @@ -799,6 +822,8 @@ self.__assertEqualStringList(results, ['--assignmentArgU=value1<->--assignmentArgV=value2']) def testModuleName(self): + self.dummyMetaReader() + # Test how we resolve known permutations of values given to the .mmp file OPTION_REPLACE keyword mockBackend = raptor_meta.MetaReader(self.raptor) @@ -816,6 +841,8 @@ for result in resultsDictList: moduleName = mockBackend.ModuleName(result["bldinf"]) self.assertEquals(moduleName, result["result"]) + + self.restoreMetaReader() # run all the tests diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/test/unit_suite/raptor_unit.py --- a/sbsv2/raptor/test/unit_suite/raptor_unit.py Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/test/unit_suite/raptor_unit.py Mon Nov 16 20:39:37 2009 +0000 @@ -17,6 +17,8 @@ import raptor import raptor_version +import raptor_meta +import raptor_utilities import re import unittest import generic_path @@ -38,7 +40,7 @@ def testVersion(self): - self.failUnless(re.match("^\d+\.\d+\.", raptor_version.Version())) + self.failUnless(re.match("^\d+\.\d+\.", raptor_version.fullversion())) def testCLISupport(self): @@ -56,10 +58,66 @@ r.SetSysDefBase("C:\\mysysdef") r.AddBuildInfoFile("build.info") r.SetTopMakefile("E:\\epoc32\\build\\Makefile") + + + def testComponentListParsing(self): + expected_spec_output = [ + 'test/smoke_suite/test_resources/simple/bld.inf', + 'test/smoke_suite/test_resources/simple_export/bld.inf', + 'test/smoke_suite/test_resources/simple_dll/bld.inf', + 'test/smoke_suite/test_resources/simple_extension/bld.inf', + 'test/smoke_suite/test_resources/simple_gui/Bld.inf', + 'TOOLS2 SHOULD NOT APPEAR IN THE OUTPUT'] + + r = raptor.Raptor() + null_log_instance = raptor_utilities.NullLog() + r.Info = null_log_instance.Info + r.Debug = null_log_instance.Debug + r.Warn = null_log_instance.Warn + r.ConfigFile() + r.ProcessConfig() + # Note that tools2/bld.inf specifies tools2 as the only supported + # platform, so it should not appear in the component list at the end + r.CommandLine([ + '-b', 'smoke_suite/test_resources/simple/bld.inf', + '-b', 'smoke_suite/test_resources/simple_dll/bld.inf', + '-b', 'smoke_suite/test_resources/simple_export/bld.inf', + '-b', 'smoke_suite/test_resources/simple_extension/bld.inf', + '-b', 'smoke_suite/test_resources/simple_gui/Bld.inf', + '-b', 'smoke_suite/test_resources/tools2/bld.inf', + '-c', 'armv5']) + # establish an object cache + r.LoadCache() + buildUnitsToBuild = r.GetBuildUnitsToBuild(r.configNames) + # find out what components to build, and in what way + layers = [] + layers = r.GetLayersFromCLI() + + generic_specs = r.GenerateGenericSpecs(buildUnitsToBuild) + + specs = [] + specs.extend(generic_specs) + metaReader = raptor_meta.MetaReader(r, buildUnitsToBuild) + specs.extend(metaReader.ReadBldInfFiles(layers[0].children, + False)) + + # See what components are actually built for the given configs + # should be only 5 since 1 is a tools component and we're building armv5 + hits = 0 + for c in layers[0].children: + if len(c.specs) > 0: + # something will be built from this component because + # it has at least one spec + shortname = str(c.bldinf_filename)[len(os.environ['SBS_HOME'])+1:] + self.assertTrue(shortname in expected_spec_output) + hits += 1 + + # Ensure there actually are 5 build specs + self.assertEqual(hits, len(expected_spec_output) - 1) + def setUp(self): self.r = raptor.Raptor() - self.r.out = OutputMock() self.cwd = generic_path.CurrentDir() self.isFileReturningFalse = lambda: False @@ -68,42 +126,44 @@ self.sysDef = self.cwd.Append(self.r.systemDefinition) self.bldInf = self.cwd.Append(self.r.buildInformation) - def testCreateWarningForNonexistingBldInfAndSystemDefinitionFile(self): + def testWarningIfSystemDefinitionFileDoesNotExist(self): """Test if sbs creates warning if executed without specified component to build i.e. default bld.inf (bld.inf in current directory) or system definition file. Uses an empty temporary directory for this.""" + self.r.out = OutputMock() d = tempfile.mkdtemp(prefix='raptor_test') cdir = os.getcwd() os.chdir(d) - self.r.GetComponentGroupsFromCLI() + layers = self.r.GetLayersFromCLI() os.chdir(cdir) # go back os.rmdir(d) self.assertTrue(self.r.out.warningWritten()) - def testCreateWarningForExistingBldInf(self): d = tempfile.mkdtemp(prefix='raptor_test') cdir = os.getcwd() os.chdir(d) f = open("bld.inf","w") f.close() - self.r.GetComponentGroupsFromCLI() + layers = self.r.GetLayersFromCLI() os.unlink("bld.inf") os.chdir(cdir) # go back os.rmdir(d) - self.assertFalse(self.r.out.warningWritten()) + self.assertTrue(self.r.out.warningWritten()) - def testCreateWarningForExistingSystemDefinitionFile(self): + def testNoWarningIfSystemDefinitionFileExists(self): + self.r.out = OutputMock() + d = tempfile.mkdtemp(prefix='raptor_test') cdir = os.getcwd() os.chdir(d) f = open("System_Definition.xml","w") f.close() - self.r.GetComponentGroupsFromCLI() + layers = self.r.GetLayersFromCLI() os.unlink("System_Definition.xml") os.chdir(cdir) # go back os.rmdir(d) @@ -112,32 +172,38 @@ # Test Info, Warn & Error functions can handle attributes def testInfoAttributes(self): + self.r.out = OutputMock() self.r.Info("hello %s", "world", planet="earth") expected = "hello world\n" self.assertEquals(self.r.out.actual, expected) def testWarnAttributes(self): + self.r.out = OutputMock() self.r.Warn("look out", where="behind you") expected = "look out\n" self.assertEquals(self.r.out.actual, expected) def testErrorAttributes(self): + self.r.out = OutputMock() self.r.Error("messed up %s and %s", "all", "sundry", bldinf="bld.inf") expected = "messed up all and sundry\n" self.assertEquals(self.r.out.actual, expected) # Test Info, Warn & Error functions to ensure XML control chars are escaped def testInfoXMLEscaped(self): + self.r.out = OutputMock() self.r.Info("h&l>o<&") expected = "h&l>o<&amp;\n" self.assertEquals(self.r.out.actual, expected) def testWarnXMLEscaped(self): + self.r.out = OutputMock() self.r.Warn("h&l>o<&") expected = "h&l>o<&amp;\n" self.assertEquals(self.r.out.actual, expected) def testErrorXMLEscaped(self): + self.r.out = OutputMock() self.r.Error("h&l>o<&") expected = "h&l>o<&amp;\n" self.assertEquals(self.r.out.actual, expected) @@ -146,14 +212,16 @@ # Mock output class preserving output for checking # Can also check if any warning has been written class OutputMock(object): - actual = "" + warningRegExp = re.compile(".*warning.*") + + def __init__(self): + self.actual = "" def write(self, text): - self.actual = text + self.actual += text def warningWritten(self): - regExp = re.compile(".*warning.*") - if regExp.match(self.actual): + if OutputMock.warningRegExp.match(self.actual): return True return False diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi --- a/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi Mon Nov 16 20:39:37 2009 +0000 @@ -103,17 +103,17 @@ # Install Raptor SetOutPath "$INSTDIR\bin" - File /r ${RAPTOR_LOCATION}\bin\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\bin\*.* SetOutPath "$INSTDIR\examples" - File /r ${RAPTOR_LOCATION}\examples\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\examples\*.* SetOutPath "$INSTDIR\lib" - File /r ${RAPTOR_LOCATION}\lib\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\lib\*.* SetOutPath "$INSTDIR\python" - File /r ${RAPTOR_LOCATION}\python\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\python\*.* SetOutPath "$INSTDIR\schema" - File /r ${RAPTOR_LOCATION}\schema\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\schema\*.* SetOutPath "$INSTDIR\win32" - File /r ${RAPTOR_LOCATION}\win32\*.* + File /r /x distribution.policy.s60 ${RAPTOR_LOCATION}\win32\*.* SetOutPath "$INSTDIR" File ${RAPTOR_LOCATION}\RELEASE-NOTES.txt diff -r e1eecf4d390d -r 593a8820b912 sbsv2/raptor/util/talon/lock.c --- a/sbsv2/raptor/util/talon/lock.c Mon Nov 16 09:46:46 2009 +0000 +++ b/sbsv2/raptor/util/talon/lock.c Mon Nov 16 20:39:37 2009 +0000 @@ -12,7 +12,7 @@ * Contributors: * * Description: -* +* Test program for grabbing and releasing the talon output semaphore. */