summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-11-12 11:01:43 (GMT)
committerSwift Review <review@swift.im>2015-12-17 18:31:50 (GMT)
commit359799239fe61fae51a3a005e588af03a18d8a10 (patch)
tree76c9649af448ca20bf6e76dcc9b50dc3d2d6e569 /3rdParty
parent54b1a705c192c1c0afa3c71db393a275f25fc7ca (diff)
downloadswift-359799239fe61fae51a3a005e588af03a18d8a10.zip
swift-359799239fe61fae51a3a005e588af03a18d8a10.tar.bz2
Update SCons to version 2.4.0
Test-Information: Tested build works with upcoming fixes with VS 2015 Community. Change-Id: Ia4f78cc9efdae56ef78a2b7ae09f11fa1bd8bc37
Diffstat (limited to '3rdParty')
-rw-r--r--3rdParty/SCons/scons-2.4.0/CHANGES.txt5899
-rw-r--r--3rdParty/SCons/scons-2.4.0/LICENSE.txt (renamed from 3rdParty/SCons/scons-LICENSE)7
-rw-r--r--3rdParty/SCons/scons-2.4.0/MANIFEST211
-rw-r--r--3rdParty/SCons/scons-2.4.0/PKG-INFO13
-rw-r--r--3rdParty/SCons/scons-2.4.0/README.txt250
-rw-r--r--3rdParty/SCons/scons-2.4.0/RELEASE.txt48
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Action.py)85
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Builder.py)26
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/CacheDir.py)28
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Conftest.py)10
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Debug.py)34
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Defaults.py)71
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Environment.py)262
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Errors.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Executor.py)171
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Job.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Memoize.py)163
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Alias.py)53
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/FS.py)1168
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Python.py)44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/__init__.py)592
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/PathList.py)22
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py)39
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/aix.py)44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py70
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/irix.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/os2.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py124
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/win32.py)56
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConf.py)72
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConsign.py)50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/C.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/D.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py)10
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py)38
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py)29
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Main.py)237
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py)137
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py)22
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Sig.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Subst.py)18
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Taskmaster.py)80
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py)36
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py)37
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py430
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py)13
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py)10
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py)32
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py)31
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py)118
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py)135
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py)184
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py)29
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py)22
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py)19
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ar.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/as.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/c++.py)9
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cc.py)11
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py94
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/default.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py152
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py882
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f77.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f90.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f95.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g++.py)34
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g77.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gas.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py)62
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py128
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py48
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py)16
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gs.py)34
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icl.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py501
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py)192
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/jar.py)14
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javac.py)16
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javah.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/latex.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py144
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/lex.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py218
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/m4.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/masm.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/midl.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py)52
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py108
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py120
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py104
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py)93
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py)32
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py)799
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwcc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwld.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/nasm.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/__init__.py)20
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/ipk.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/msi.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/rpm.py)27
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_tarbz2.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_targz.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_zip.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/tarbz2.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/targz.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/zip.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdf.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/qt.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rmic.py)12
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpm.py)14
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py543
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgiar.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgic++.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgicc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgilink.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunar.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunc++.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/suncc.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf77.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf90.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf95.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunlink.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/swig.py)23
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tar.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tex.py)313
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/textfile.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tlib.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/wix.py)31
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py339
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/yacc.py)14
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/zip.py)9
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Util.py)40
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.py)6
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Warnings.py)10
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/__init__.py)14
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/__init__.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.py)47
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_collections.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_dbm.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_hashlib.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_io.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_sets.py)0
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_subprocess.py)0
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/cpp.py)11
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/dblite.py)5
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py (renamed from 3rdParty/SCons/scons-local-2.0.0.final.0/SCons/exitfuncs.py)23
-rw-r--r--3rdParty/SCons/scons-2.4.0/scons-time.1795
-rw-r--r--3rdParty/SCons/scons-2.4.0/scons.119588
-rw-r--r--3rdParty/SCons/scons-2.4.0/sconsign.1164
-rw-r--r--[-rwxr-xr-x]3rdParty/SCons/scons-2.4.0/script/scons (renamed from 3rdParty/SCons/scons.py)77
-rw-r--r--[-rwxr-xr-x]3rdParty/SCons/scons-2.4.0/script/scons-time (renamed from 3rdParty/SCons/scons-time.py)4
-rw-r--r--3rdParty/SCons/scons-2.4.0/script/scons.bat34
-rw-r--r--[-rwxr-xr-x]3rdParty/SCons/scons-2.4.0/script/sconsign (renamed from 3rdParty/SCons/sconsign.py)45
-rw-r--r--3rdParty/SCons/scons-2.4.0/setup.cfg5
-rw-r--r--3rdParty/SCons/scons-2.4.0/setup.py515
-rw-r--r--3rdParty/SCons/scons-README204
-rw-r--r--3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/posix.py263
-rw-r--r--3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py223
-rw-r--r--3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/install.py229
-rw-r--r--3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/link.py121
217 files changed, 36481 insertions, 2947 deletions
diff --git a/3rdParty/SCons/scons-2.4.0/CHANGES.txt b/3rdParty/SCons/scons-2.4.0/CHANGES.txt
new file mode 100644
index 0000000..5f96a23
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/CHANGES.txt
@@ -0,0 +1,5899 @@
+
+
+ SCons - a software construction tool
+
+ Change Log
+
+RELEASE 2.4.0 - Mon, 21 Sep 2015 09:07:51 -0700
+
+ From Dirk Baechle:
+ - Switched several core classes to use "slots", to
+ reduce the overall memory consumption in large
+ projects (fixes #2180, #2178, #2198)
+ - Memoizer counting uses decorators now, instead of
+ the old metaclasses approach.
+
+ From Andrew Featherstone
+ - Fixed typo in SWIGPATH description
+
+RELEASE 2.3.6 - Mon, 31 Jul 2015 14:35:03 -0700
+
+ From Rob Smith:
+ - Added support for Visual Studio 2015
+
+RELEASE 2.3.5 - Mon, 17 Jun 2015 21:07:32 -0700
+
+ From Stephen Pollard:
+ - Documentation fixes for libraries.xml and
+ builders-writing.xml (#2989 and #2990)
+
+ From William Deegan:
+ - Extended docs for InstallVersionedLib/SharedLibrary,
+ and added SKIP_WIN_PACKAGES argument to build script
+ bootstrap.py (PR #230, #3002).
+
+ From William Blevins:
+ - Fixed symlink support (PR #227, #2395).
+ - Updated debug-count test case (PR #229).
+
+ From Alexey Klimkin:
+ - Fixed incomplete LIBS flattening and substitution in
+ Program scanner(PR #205, #2954).
+
+ From Dirk Baechle:
+ - Added new method rentry_exists_on_disk to Node.FS (PR #193).
+
+ From Russel Winder:
+ - Fixed several D tests under the different OS.
+ - Add support for f08 file extensions for Fortran 2008 code.
+
+ From Anatoly Techtonik:
+ - Show --config choices if no argument is specified (PR #202).
+ - Fixed build crash when XML toolchain isn't installed, and
+ activated compression for ZIP archives.
+
+ From Alexandre Feblot:
+ - Fix for VersionedSharedLibrary under 'sunos' platform.
+ - Fixed dll link with precompiled headers on MSVC 2012
+ - Added an 'exclude' parameter to Glob()
+
+ From Laurent Marchelli:
+ - Support for multiple cmdargs (one per variant) in VS project files.
+ - Various improvements for TempFileMunge class.
+ - Added an implementation for Visual Studio users files (PR #209).
+
+ From Dan Pidcock:
+ - Added support for the 'PlatformToolset' tag in VS project files (#2978).
+
+ From James McCoy:
+ - Added support for '-isystem' to ParseFlags.
+
+RELEASE 2.3.4 - Mon, 27 Sep 2014 12:50:35 -0400
+
+ From Bernhard Walle and Dirk Baechle:
+ - Fixed the interactive mode, in connection with
+ Configure contexts (#2971).
+
+ From Anatoly Techtonik:
+ - Fix EnsureSConsVersion warning when running packaged version
+
+ From Russel Winder:
+ - Fix D tools for building shared libraries
+
+RELEASE 2.3.3 - Sun, 24 Aug 2014 21:08:33 -0400
+
+ From Roland Stark:
+ - Fixed false line length calculation in the TempFileMunge class (#2970).
+
+ From Gary Oberbrunner:
+ - Improve SWIG detection
+
+ From Russel Winder:
+ - Fix regression on Windows in D language update
+
+ From Anatoly Techtonik:
+ - Do not fail on EnsureSConsVersion when running from checkout
+
+ From Kendrick Boyd and Rob Managan:
+ - Fixed the newglossary action to work with VariantDir (LaTeX).
+
+ From Manuel Francisco Naranjo:
+ - Added a default for the BUILDERS environment variable,
+ to prevent not defined exception on a Clone().
+
+ From Andrew Featherstone:
+ - Added description of CheckTypeSize method (#1991).
+ - Fixed handling of CPPDEFINE var in Append()
+ for several list-dict combinations (#2900).
+
+ From William Blevins:
+ - Added test for Java derived-source dependency tree generation.
+ - Added Copy Action symlink soft-copy support (#2395).
+ - Various contributions to the documentation (UserGuide).
+
+RELEASE 2.3.2
+
+ From veon on bitbucket:
+ - Fixed handling of nested ifs in CPP scanner PreProcessor class.
+
+ From Michael Haubenwallner:
+ - Respect user's CC/CXX values; don't always overwrite in generate()
+ - Delegate linker Tool.exists() to CC/CXX Tool.exists().
+
+ From Amir Szekely:
+ - Fixed NoClean() for multi-target builders (#2353).
+
+ From Russel Winder:
+ - Revamp of the D language support. Tools for DMD, GDC and LDC provided
+ and integrated with the C and C++ linking. NOTE: This is only tested
+ with D v2. Support for D v1 is now deprecated.
+
+ From Paweł Tomulik:
+ - Fix SConf tests that write output
+
+ From Gary Oberbrunner:
+ - get default RPM architecture more robustly when building RPMs
+
+ From Shane Gannon:
+ - Support for Visual Studio 2013 (12.0)
+
+ From Sye van der Veen:
+ - Support for Visual Studio 12.0Exp, and fixes for earlier MSVS
+ versions.
+
+ From Anatoly Techtonik:
+ - Several improvements for running scons.py from source:
+ * engine files form source directory take priority over all other
+ importable versions
+ * message about scons.py running from source is removed to fix tests
+ that were failing because of this extra line in the output
+ * error message when SCons import fails now lists lookup paths
+ - Remove support for QMTest harness from runtest.py
+ - Remove RPM and m4 from default tools on Windows
+ - BitKeeper, CVS, Perforce, RCS, SCCS are deprecated from default
+ tools and will be removed in future SCons versions to speed up
+ SCons initialization (it will still be possible to use these tools
+ explicitly)
+
+ From Dirk Baechle:
+ - Update XML doc editor configuration
+ - Fix: Allow varlist to be specified as list of strings for Actions (#2754)
+
+ From Rob Managan:
+ - Updated the TeX builder to support use of the -synctex=1
+ option and the files it creates.
+ - Updated the TeX builder to correctly clean auxiliary files when
+ the biblatex package is used.
+
+RELEASE 2.3.1
+
+ From Andrew Featherstone:
+ - Added support for EPUB output format to the DocBook tool.
+
+ From Tom Tanner:
+ - Stop leaking file handles to subprocesses by switching to using subprocess
+ always.
+ - Allow multiple options to be specified with --debug=a,b,c
+ - Add support for a readonly cache (--cache-readonly)
+ - Always print stats if requested
+ - Generally try harder to print out a message on build errors
+ - Adds a switch to warn on missing targets
+ - Add Pseudo command to mark targets which should not exist after
+ they are built.
+
+ From Bogdan Tenea:
+ - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly.
+
+ From Alexandre Feblot:
+ - Make sure SharedLibrary depends on all dependent libs (by depending on SHLINKCOM)
+
+ From Stefan Sperling:
+ - Fixed the setup of linker flags for a versioned SharedLibrary
+ under OpenBSD (#2916).
+
+ From Antonio Cavallo:
+ - Improve error if Visual Studio bat file not found.
+
+ From Manuel Francisco Naranjo:
+ - Allow Subst.Literal string objects to be compared with each other,
+ so they work better in AddUnique() and Remove().
+
+ From David Rothenberger:
+ - Added cyglink linker that uses Cygwin naming conventions for
+ shared libraries and automatically generates import libraries.
+
+ From Dirk Baechle:
+ - Update bootstrap.py so it can be used from any dir, to run
+ SCons from a source (non-installed) dir.
+ - Count statistics of instances are now collected only when
+ the --debug=count command-line option is used (#2922).
+ - Added release_target_info() to File nodes, which helps to
+ reduce memory consumption in clean builds and update runs
+ of large projects.
+ - Fixed the handling of long options in the command-line
+ parsing (#2929).
+ - Fixed misspelled variable in intelc.py (#2928).
+
+ From Gary Oberbrunner:
+ - Test harness: fail_test() can now print a message to help debugging.
+
+ From Anatoly Techtonik:
+ - Require rpmbuild when building SCons package.
+ - Print full stack on certain errors, for debugging.
+ - Improve documentation for Textfile builder.
+
+ From William Deegan:
+ - VS2012 & VS2010 Resolve initialization issues by adding path to reg.exe
+ in shell used to run batch files.
+ - MSVC Support fixed defaulting TARGET_ARCH to HOST_ARCH. It should be
+ None if not explicitly set.
+ - MSVC Fixed issue where if more than one Architectures compilers are
+ detected, it would take the last one found, and not the first.
+
+ From Philipp Kraus:
+ - Added optional ZIPROOT to Zip tool.
+
+ From Dirk Baechle:
+ - Replaced old SGML-based documentation toolchain with a more modern
+ approach, that also requires less external dependencies (programs and
+ Python packages). Added a customized Docbook XSD for strict validation of
+ all input XML files.
+
+ From Luca Falavigna:
+ - Fixed spelling errors in MAN pages (#2897).
+
+ From Michael McDougall:
+ - Fixed description of ignore_case for EnumVariable in the
+ MAN page (#2774).
+
+RELEASE 2.3.0 - Mon, 02 Mar 2013 13:22:29 -0400
+
+ From Anatoly Techtonik:
+ - Added ability to run scripts/scons.py directly from source checkout
+ - Hide deprecated --debug={dtree,stree,tree} from --help output
+ - Error messages from option parser now include hints about valid choices
+ - Cleaned up some Python 1.5 and pre-2.3 code, so don't expect SCons
+ to run on anything less than Python 2.4 anymore
+ - Several fixes for runtest.py:
+ * exit with an error if no tests were found
+ * removed --noqmtest option - this behavior is by default
+ * replaced `-o FILE --xml` combination with `--xml FILE`
+ * changed `-o, --output FILE` option to capture stdout/stderr output
+ from runtest.py
+ - Remove os_spawnv_fix.diff patch required to enable parallel builds
+ support prior to Python 2.2
+
+ From Juan Lang:
+ - Fix WiX Tool to use .wixobj rather than .wxiobj for compiler output
+ - Support building with WiX releases after 2.0
+
+ From Alexey Klimkin:
+ - Fix nested LIBPATH expansion by flattening sequences in subst_path.
+
+ From eyan on Bitbucket:
+ - Print target name with command execution time with --debug=time
+
+ From Thomas Berg and Evgeny Podjachev:
+ - Fix subprocess spawning on Windows. Work around a Windows
+ bug that can crash python occasionally when using -jN. (#2449)
+
+ From Dirk Baechle:
+ - Updated test framework to support dir and file fixtures and
+ added ability to test external (out-of-tree) tools (#2862).
+ See doc in QMTest/test-framework.rst.
+ - Fixed several errors in the test suite (Java paths, MSVS version
+ detection, Tool import), additionally
+ * provided MinGW command-line support for the CXX, AS and
+ Fortran tests,
+ * refactored the detection of the gcc version and the according
+ Fortran startup library,
+ * provided a new module rpmutils.py, wrapping the RPM naming rules
+ for target files and further hardware-dependent info (compatibility,
+ compiler flags, ...),
+ * added new test methods must_exist_one_of() and
+ must_not_exist_any_of() and
+ * removed Aegis support from runtest.py. (#2872)
+
+ From Gary Oberbrunner:
+ - Add -jN support to runtest.py to run tests in parallel
+ - Add MSVC10 and MSVC11 support to get_output low-level bat script runner.
+ - Fix MSVS solution generation for VS11, and fixed tests.
+
+ From Rob Managan:
+ - Updated the TeX builder to support the \newglossary command
+ in LaTeX's glossaries package and the files it creates.
+ - Improve support for new versions of biblatex in the TeX builder
+ so biber is called automatically if biblatex requires it.
+ - Add SHLIBVERSION as an option that tells SharedLibrary to build
+ a versioned shared library and create the required symlinks.
+ Add builder InstallVersionedLib to create the required symlinks
+ installing a versioned shared library.
+
+RELEASE 2.2.0 - Mon, 05 Aug 2012 15:37:48 +0000
+
+ From dubcanada on Bitbucket:
+ - Fix 32-bit Visual Express C++ on 64-bit Windows (generate 32-bit code)
+
+ From Paweł Tomulik:
+ - Added gettext toolset
+ - Fixed FindSourceFiles to find final sources (leaf nodes).
+
+ From Greg Ward:
+ - Allow Node objects in Java path (#2825)
+
+ From Joshua Hughes:
+ - Make Windows not redefine builtin file as un-inheritable (#2857)
+ - Fix WINDOWS_INSERT_DEF on MinGW (Windows) (#2856)
+
+ From smallbub on Bitbucket:
+ - Fix LINKCOMSTR, SHLINKCOMSTR, and LDMODULECOMSTR on Windows (#2833).
+
+ From Mortoray:
+ - Make -s (silent mode) be silent about entering subdirs (#2976).
+ - Fix cloning of builders when cloning environment (#2821).
+
+ From Gary Oberbrunner:
+ - Show valid Visual Studio architectures in error message
+ when user passes invalid arch.
+
+ From Alexey Petruchik:
+ - Support for Microsoft Visual Studio 11 (both using it
+ and generating MSVS11 solution files).
+
+ From Alexey Klimkin:
+ - Fixed the Taskmaster, curing spurious build failures in
+ multi-threaded runs (#2720).
+
+ From Dirk Baechle:
+ - Improved documentation of command-line variables (#2809).
+ - Fixed scons-doc.py to properly convert main XML files (#2812).
+
+ From Rob Managan:
+ - Updated the TeX builder to support LaTeX's multibib package.
+ - Updated the TeX builder to support LaTeX's biblatex package.
+ - Added support for using biber instead of bibtex by setting
+ env['BIBTEX'] = 'biber'
+
+ From Arve Knudsen:
+ - Test for FORTRANPPFILESUFFIXES (#2129).
+
+
+RELEASE 2.1.0 - Mon, 09 Sep 2011 20:54:57 -0700
+
+ From Anton Lazarev:
+ - Fix Windows resource compiler scanner to accept DOS line endings.
+
+ From Matthias:
+ - Update MSVS documents to remove note indicating that only one
+ project is currently supported per solution file.
+
+ From Grzegorz Bizoń:
+ - Fix long compile lines in batch mode by using TEMPFILE
+ - Fix MSVC_BATCH=False (was treating it as true)
+
+ From Justin Gullingsrud:
+ - support -std=c++0x and related CXXFLAGS in pkgconfig (ParseFlags)
+
+ From Vincent Beffara:
+ - Support -dylib_file in pkgconfig (ParseFlags)
+
+ From Gary Oberbrunner and Sohail Somani:
+ - new construction variable WINDOWS_EMBED_MANIFEST to automatically
+ embed manifests in Windows EXEs and DLLs.
+
+ From Gary Oberbrunner:
+ - Fix Visual Studio project generation when CPPPATH contains Dir nodes
+ - Ensure Visual Studio project is regenerated when CPPPATH or CPPDEFINES change
+ - Fix unicode error when using non-ASCII filenames with Copy or Install
+ - Put RPATH in LINKCOM rather than LINKFLAGS so resetting
+ LINKFLAGS doesn't kill RPATH
+ - Fix precompiled headers on Windows when variant dir name has spaces.
+ - Adding None to an Action no longer fails (just returns original action)
+ - New --debug=prepare option to show each target as it's being
+ prepared, whether or not anything needs to be done for it.
+ - New debug option --debug=duplicate to print a line for each
+ unlink/relink (or copy) of a variant file from its source file.
+ - Improve error message for EnumVariables to show legal values.
+ - Fix Intel compiler to sort versions >9 correctly (esp. on Linux)
+ - Fix Install() when the source and target are directories and the
+ target directory exists.
+
+ From David Garcia Garzon:
+ - Fix Delete to be able to delete broken symlinks and dir
+ symlinks.
+
+ From Imran Fanaswala and Robert Lehr:
+ - Handle .output file generated by bison/yacc properly. Cleaning it
+ when necessary.
+
+ From Antoine Dechaume:
+ - Handle SWIG file where there is whitespace after the module name
+ properly. Previously the generated files would include
+ the whitespace.
+
+ From Dmitry R.:
+ - Handle Environment in case __semi_deepcopy is None
+
+ From Benoit Belley:
+
+ - Much improved support for Windows UNC paths (\\SERVERNAME).
+
+ From Jean-Baptiste Lab:
+
+ - Fix problems with appending CPPDEFINES that contain
+ dictionaries, and related issues with Parse/MergeFlags and
+ CPPDEFINES.
+
+ From Allen Weeks:
+
+ - Fix for an issue with implicit-cache with multiple targets
+ when dependencies are removed on disk.
+
+ From Evgeny Podjachev and Alexey Petruchick:
+
+ - Support generation of Microsoft Visual Studio 2008 (9.0)
+ and 2010 (10.0) project and solution files.
+
+ From Ken Deeter:
+
+ - Fix a problem when FS Entries which are actually Dirs have builders.
+
+ From Luca Falavigna:
+
+ - Support Fortran 03
+
+ From Gary Oberbrunner:
+
+ - Print the path to the SCons package in scons --version
+
+ From Jean-Fran�ois Colson:
+
+ - Improve Microsoft Visual Studio Solution generation, and fix
+ various errors in the generated solutions especially when using
+ MSVS_SCC_PROVIDER, and when generating multiple projects. The
+ construction variable MSVS_SCC_PROJECT_BASE_PATH, which never
+ worked properly, is removed. Users can use the new variable
+ MSVS_SCC_CONNECTION_ROOT instead if desired.
+
+ From Anatoly Techtonik:
+
+ - Use subprocess in bootstrap.py instead of os.execve to avoid
+ losing output control on Windows (http://bugs.python.org/issue9148)
+
+ - Revert patch for adding SCons to App Paths, because standard cmd
+ shell doesn't search there. This is confusing, because `scons` can
+ be executed from explorer, but fail to start from console.
+
+ - Fix broken installation with easy_install on Windows (issue #2051)
+ SCons traditionally installed in a way that allowed to run multiple
+ versions side by side. This custom logic was incompatible with
+ easy_install way of doing things.
+
+ - Use epydoc module for generating API docs in HTML if command line
+ utility is not found in PATH. Actual for Windows.
+
+ From Alexander Goomenyuk:
+
+ - Add .sx to assembly source scanner list so .sx files
+ get their header file dependencies detected.
+
+ From Arve Knudsen:
+
+ - Set module metadata when loading site_scons/site_init.py
+ so it is treated as a proper module; __doc__, __file__ and
+ __name__ now refer to the site_init.py file.
+
+ From Russel Winder:
+
+ - Users Guide updates explaining that Tools can be packages as
+ well as python modules.
+
+ From Gary Oberbrunner:
+
+ - New systemwide and per-user site_scons dirs.
+
+ From Dirk Baechle:
+
+ - XML fixes in User's Guide.
+ - Fixed the detection of 'jar' and 'rmic' during
+ the initialization of the respective Tools (#2730).
+ - Improved docs for custom Decider functions and
+ custom Scanner objects (#2711, #2713).
+ - Corrected SWIG module names for generated *.i files (#2707).
+
+ From Joe Zuntz:
+
+ - Fixed a case-sensitivity problem with Fortran modules.
+
+ From Bauke Conijn:
+
+ - Added Users Guide example for auto-generated source code
+
+ From Steven Knight:
+
+ - Fix explicit dependencies (Depends()) on Nodes that don't have
+ attached Builders.
+
+ - Fix use of the global Alias() function with command actions.
+
+ From Matt Hughes:
+
+ - Fix the ability to append to default $*FLAGS values (which are
+ implemented as CLVar instances) in a copied construction environment
+ without affecting the original construction environment's value.
+
+ From Rob Managan:
+
+ - Updated the TeX command strings to include a /D on Windows in
+ case the new directory is on a different drive letter.
+
+ - Fixed the LaTeX scanner so dependencies are found in commands that
+ are broken across lines with a comment or have embedded spaces.
+
+ - The TeX builders should now work with tex files that are generated
+ by another program. Thanks to Hans-Martin von Gaudecker for
+ isolating the cause of this bug.
+
+ - Added support for INDEXSTYLE environment variable so makeindex can
+ find style files.
+
+ - Added support for the bibunits package so we call bibtex on all
+ the bu*.aux files.
+
+ - Add support of finding path information on OSX for TeX applications
+ MacPorts and Fink paths need to be added by the user
+
+ From Russel Winder:
+
+ - Add support for DMD version 2 (the phobos2 library).
+
+ From William Deegan:
+
+ - Add initial support for VS/VC 2010 (express and non-express versions)
+ - Remove warning for not finding MS VC/VS install.
+ "scons: warning: No version of Visual Studio compiler found
+ - C/C++ compilers most likely not set correctly"
+ - Add support for Linux 3.0
+
+
+RELEASE 2.0.1 - Mon, 15 Aug 2010 15:46:32 -0700
+
+ From Dirk Baechle:
+
+ - Fix XML in documentation.
+
+ From Joe Zuntz:
+
+ - Fixed a case-sensitivity problem with Fortran modules.
+
+ From Bauke Conijn:
+
+ - Added Users Guide example for auto-generated source code
+
+ From Steven Knight:
+
+ - Fix explicit dependencies (Depends()) on Nodes that don't have
+ attached Builders.
+
+ From Matt Hughes:
+
+ - Fix the ability to append to default $*FLAGS values (which are
+ implemented as CLVar instances) in a copied construction environment
+ without affecting the original construction environment's value.
+
+ From Rob Managan:
+
+ - Updated the TeX command strings to include a /D on Windows in
+ case the new directory is on a different drive letter.
+
+ - Fixed the LaTeX scanner so dependencies are found in commands that
+ are broken across lines with a comment or have embedded spaces.
+
+
+RELEASE 2.0.0.final.0 - Mon, 14 Jun 2010 22:01:37 -0700
+
+ From Dirk Baechle:
+
+ - Fix XML in documentation.
+
+ From Steven Knight:
+
+ - Provide forward compatibility for the 'profile' module.
+
+ - Provide forward compatibility for the 'pickle' module.
+
+ - Provide forward compatibility for the 'io' module.
+
+ - Provide forward compatibility for the 'queue' module.
+
+ - Provide forward compatibility for the 'collections' module.
+
+ - Provide forward compatibility for the 'builtins' module.
+
+ - Provide forward compatibility for 'sys.intern()'.
+
+ - Convert to os.walk() from of os.path.walk().
+
+ - Remove compatibility logic no longer needed.
+
+ - Add a '-3' option to runtest to print 3.x incompatibility warnings.
+
+ - Convert old-style classes into new-style classes.
+
+ - Fix "Ignoring corrupt sconsign entry" warnings when building
+ in a tree with a pre-2.0 .sconsign file.
+
+ - Fix propagation from environment of VS*COMNTOOLS to resolve issues
+ initializing MSVC/MSVS/SDK issues.
+
+ - Handle detecting Visual C++ on Python verions with upper-case
+ platform architectures like 'AMD64'.
+
+ From W. Trevor King:
+
+ - Revisions to README.
+
+ From Greg Noel:
+
+ - Apply numerous Python fixers to update code to more modern idioms.
+ Find where fixers should be applied to code in test strings and
+ apply the fixers there, too.
+
+ - Write a fixer to convert string functions to string methods.
+
+ - Modify the 'dict' fixer to be less conservative.
+
+ - Modify the 'apply' fixer to handle more cases.
+
+ - Create a modified 'types' fixer that converts types to 2.x
+ equivalents rather than 3.x equivalents.
+
+ - Write a 'division' fixer to highlight uses of the old-style
+ division operator. Correct usage where needed.
+
+ - Add forward compatibility for the new 'memoryview' function
+ (which replaces the 'buffer' function).
+
+ - Add forward compatibility for the 'winreg' module.
+
+ - Remove no-longer-needed 'platform' module.
+
+ - Run tests with the '-3' option to Python 2.6 and clear up
+ various reported incompatibilities.
+
+ - Comb out code paths specialized to Pythons older than 2.4.
+
+ - Update deprecation warnings; most now become mandatory.
+
+ - Start deprecation cycle for BuildDir() and build_dir.
+
+ - Start deprecation cycle for SourceCode() and related factories
+
+ - Fixed a problem with is_Dict() not identifying some objects derived
+ from UserDict.
+
+ From Jim Randall:
+
+ - Document the AllowSubstExceptions() function in the User's Guide.
+
+ From William Deegan:
+
+ - Migrate MSVC/MSVS/SDK improvements from 1.3 branch.
+
+
+RELEASE 1.3.0 - Tue, 23 Mar 2010 21:44:19 -0400
+
+ From Steven Knight:
+
+ - Update man page and documentation.
+
+ From William Deegan (plus minor patch from Gary Oberbrunner):
+
+ - Support Visual Studio 8.0 Express
+
+RELEASE 1.2.0.d20100306 - Sat, 06 Mar 2010 16:18:33 -0800
+
+ From Luca Falavigna:
+
+ - Fix typos in the man page.
+
+ From Gottfried Ganssauge:
+
+ - Support execution when SCons is installed via easy_install.
+
+ From Steven Knight:
+
+ - Make the messages for Configure checks of compilers consistent.
+
+ - Issue an error message if a BUILDERS entry is not a Builder
+ object or a callable wrapper.
+
+ From Rob Managan:
+
+ - Update tex builder to handle the case where a \input{foo}
+ command tries to work with a directory named foo instead of the
+ file foo.tex. The builder now ignores a directory and continues
+ searching to find the correct file. Thanks to Lennart Sauerbeck
+ for the test case and initial patch
+
+ Also allow the \include of files in subdirectories when variantDir
+ is used with duplicate=0. Previously latex would crash since
+ the directory in which the .aux file is written was not created.
+ Thanks to Stefan Hepp for finding this and part of the solution.
+
+ From James Teh:
+ - Patches to fix some issues using MS SDK V7.0
+
+ From William Deegan:
+ - Lots of testing and minor patches to handle mixed MS VC and SDK
+ installations, as well as having only the SDK installed.
+
+
+RELEASE 1.2.0.d20100117 - Sun, 17 Jan 2010 14:26:59 -0800
+
+ From Jim Randall:
+ - Fixed temp filename race condition on Windows with long cmd lines.
+
+ From David Cournapeau:
+ - Fixed tryRun when sconf directory is in a variant dir.
+ - Do not add -fPIC for ifort tool on non-posix platforms (darwin and
+ windows).
+ - Fix bug 2294 (spurious CheckCC failures).
+ - Fix scons bootstrap process on windows 64 (wrong wininst name)
+
+ From William Deegan:
+ - Final merge from vs_revamp branch to main
+
+ - Added definition and usage of HOST_OS, HOST_ARCH, TARGET_OS,
+ TARGET_ARCH, currently only defined/used by Visual Studio
+ Compilers. This will be rolled out to other platforms/tools
+ in the future.
+
+ - Add check for python >= 3.0.0 and exit gracefully.
+ For 1.3 python >= 1.5.2 and < 3.0.0 are supported
+
+ - Fix bug 1944 - Handle non-existent .i file in swig emitter, previously
+ it would crash with an IOError exception. Now it will try to make an
+ educated guess on the module name based on the filename.
+
+ From Lukas Erlinghagen:
+
+ - Have AddOption() remove variables from the list of
+ seen-but-unknown variables (which are reported later).
+
+ - An option name and aliases can now be specified as a tuple.
+
+ From Hartmut Goebel:
+
+ - Textfile builder.
+
+ From Jared Grubb:
+
+ - use "is/is not" in comparisons with None instead of "==" or "!=".
+
+ From Jim Hunziker:
+
+ - Avoid adding -gphobos to a command line multiple times
+ when initializing use of the DMD compiler.
+
+ From Jason Kenney:
+
+ - Sugguested HOST/TARGET OS/ARCH separation.
+
+ From Steven Knight:
+
+ - Fix the -n option when used with VariantDir(duplicate=1)
+ and the variant directory doesn't already exist.
+
+ - Fix scanning of Unicode files for both UTF-16 endian flavors.
+
+ - Fix a TypeError on #include of file names with Unicode characters.
+
+ - Fix an exception if a null command-line argument is passed in.
+
+ - Evaluate Requires() prerequisites before a Node's direct children
+ (sources and dependencies).
+
+ From Greg Noel:
+
+ - Remove redundant __metaclass__ initializations in Environment.py.
+
+ - Correct the documentation of text returned by sconf.Result().
+
+ - Document that filenames with '.' as the first character are
+ ignored by Glob() by default (matching UNIX glob semantics).
+
+ - Fix SWIG testing infrastructure to work on Mac OS X.
+
+ - Restructure a test that occasionally hung so that the test would
+ detect when it was stuck and fail instead.
+
+ - Substfile builder.
+
+ From Gary Oberbrunner:
+
+ - When reporting a target that SCons doesn't know how to make,
+ specify whether it's a File, Dir, etc.
+
+ From Ben Webb:
+
+ - Fix use of $SWIGOUTDIR when generating Python wrappers.
+
+ - Add $SWIGDIRECTORSUFFIX and $SWIGVERSION construction variables.
+
+ From Rob Managan:
+
+ - Add -recorder flag to Latex commands and updated internals to
+ use the output to find files TeX creates. This allows the MiKTeX
+ installations to find the created files
+
+ - Notify user of Latex errors that would get buried in the
+ Latex output
+
+ - Remove LATEXSUFFIXES from environments that don't initialize Tex.
+
+ - Add support for the glossaries package for glossaries and acronyms
+
+ - Fix problem that pdftex, latex, and pdflatex tools by themselves did
+ not create the actions for bibtex, makeindex,... by creating them
+ and other environment settings in one routine called by all four
+ tex tools.
+
+ - Fix problem with filenames of sideeffects when the user changes
+ the name of the output file from the latex default
+
+ - Add scanning of files included in Latex by means of \lstinputlisting{}
+ Patch from Stefan Hepp.
+
+ - Change command line for epstopdf to use --outfile= instead of -o
+ since this works on all platforms.
+ Patch from Stefan Hepp.
+
+ - Change scanner to properly search for included file from the
+ directory of the main file instead of the file it is included from.
+ Also update the emitter to add the .aux file associated with
+ \include{filename} commands. This makes sure the required directories
+ if any are created for variantdir cases.
+ Half of the patch from Stefan Hepp.
+
+RELEASE 1.2.0.d20090223 - Mon, 23 Feb 2009 08:41:06 -0800
+
+ From Stanislav Baranov:
+
+ - Make suffix-matching for scanners case-insensitive on Windows.
+
+ From David Cournapeau:
+
+ - Change the way SCons finds versions of Visual C/C++ and Visual
+ Studio to find and use the Microsoft v*vars.bat files.
+
+ From Robert P. J. Day:
+
+ - User's Guide updates.
+
+ From Dan Eaton:
+
+ - Fix generation of Visual Studio 8 project files on x64 platforms.
+
+ From Allan Erskine:
+
+ - Set IncludeSearchPath and PreprocessorDefinitions in generated
+ Visual Studio 8 project files, to help IntelliSense work.
+
+ From Mateusz Gruca:
+
+ - Fix deletion of broken symlinks by the --clean option.
+
+ From Steven Knight:
+
+ - Fix the error message when use of a non-existent drive on Windows
+ is detected.
+
+ - Add sources for files whose targets don't exist in $CHANGED_SOURCES.
+
+ - Detect implicit dependencies on commands even when the command is
+ quoted.
+
+ - Fix interaction of $CHANGED_SOURCES with the --config=force option.
+
+ - Fix finding #include files when the string contains escaped
+ backslashes like "C:\\some\\include.h".
+
+ - Pass $CCFLAGS to Visual C/C++ precompiled header compilation.
+
+ - Remove unnecessary nested $( $) around $_LIBDIRFLAGS on link lines
+ for the Microsoft linker, the OS/2 ilink linker and the Phar Lap
+ linkloc linker.
+
+ - Spell the Windows environment variables consistently "SystemDrive"
+ and "SystemRoot" instead of "SYSTEMDRIVE" and "SYSTEMROOT".
+
+
+
+RELEASE 1.2.0.d20090113 - Tue, 13 Jan 2009 02:50:30 -0800
+
+ From Stanislav Baranov, Ted Johnson and Steven Knight:
+
+ - Add support for batch compilation of Visual Studio C/C++ source
+ files, controlled by a new $MSVC_BATCH construction variable.
+
+ From Steven Knight:
+
+ - Print the message, "scons: Build interrupted." on error output,
+ not standard output.
+
+ - Add a --warn=future-deprecated option for advance warnings about
+ deprecated features that still have warnings hidden by default.
+
+ - Fix use of $SOURCE and $SOURCES attributes when there are no
+ sources specified in the Builder call.
+
+ - Add support for new $CHANGED_SOURCES, $CHANGED_TARGETS,
+ $UNCHANGED_SOURCES and $UNCHANGED_TARGETS variables.
+
+ - Add general support for batch builds through new batch_key= and
+ targets= keywords to Action object creation.
+
+ From Arve Knudsen:
+
+ - Make linker tools differentiate properly between SharedLibrary
+ and LoadableModule.
+
+ - Document TestCommon.shobj_prefix variable.
+
+ - Support $SWIGOUTDIR values with spaces.
+
+ From Rob Managan:
+
+ - Don't automatically try to build .pdf graphics files for
+ .eps files in \includegraphics{} calls in TeX/LaTeX files
+ when building with the PDF builder (and thus using pdflatex).
+
+ From Gary Oberbrunner:
+
+ - Allow AppendENVPath() and PrependENVPath() to interpret '#'
+ for paths relative to the top-level SConstruct directory.
+
+ - Use the Borland ilink -e option to specify the output file name.
+
+ - Document that the msvc Tool module uses $PCH, $PCHSTOP and $PDB.
+
+ - Allow WINDOWS_INSERT_DEF=0 to disable --output-def when linking
+ under MinGW.
+
+ From Zia Sobhani:
+
+ - Fix typos in the User's Guide.
+
+ From Greg Spencer:
+
+ - Support implicit dependency scanning of files encoded in utf-8
+ and utf-16.
+
+ From Roberto de Vecchi:
+
+ - Remove $CCFLAGS from the the default definitions of $CXXFLAGS for
+ Visual C/C++ and MIPSpro C++ on SGI so, they match other tools
+ and avoid flag duplication on C++ command lines.
+
+ From Ben Webb:
+
+ - Handle quoted module names in SWIG source files.
+
+ - Emit *_wrap.h when SWIG generates header file for directors
+
+ From Matthew Wesley:
+
+ - Copy file attributes so we identify, and can link a shared library
+ from, shared object files in a Repository.
+
+
+
+RELEASE 1.2.0 - Sat, 20 Dec 2008 22:47:29 -0800
+
+ From Steven Knight:
+
+ - Don't fail if can't import a _subprocess module on Windows.
+
+ - Add warnings for use of the deprecated Options object.
+
+
+
+RELEASE 1.1.0.d20081207 - Sun, 07 Dec 2008 19:17:23 -0800
+
+ From Benoit Belley:
+
+ - Improve the robustness of GetBuildFailures() by refactoring
+ SCons exception handling (especially BuildError exceptions).
+
+ - Have the --taskmastertrace= option print information about
+ individual Task methods, not just the Taskmaster control flow.
+
+ - Eliminate some spurious dependency cycles by being more aggressive
+ about pruning pending children from the Taskmaster walk.
+
+ - Suppress mistaken reports of a dependency cycle when a child
+ left on the pending list is a single Node in EXECUTED state.
+
+ From David Cournapeau:
+
+ - Fix $FORTRANMODDIRPREFIX for the ifort (Intel Fortran) tool.
+
+ From Brad Fitzpatrick:
+
+ - Don't pre-generate an exception message (which will likely be
+ ignored anyway) when an EntryProxy re-raises an AttributeError.
+
+ From Jared Grubb:
+
+ - Clean up coding style and white space in Node/FS.py.
+
+ - Fix a typo in the documentation for $_CPPDEFFLAGS.
+
+ - Issue 2401: Fix usage of comparisons with None.
+
+ From Ludwig H�hne:
+
+ - Handle Java inner classes declared within a method.
+
+ From Steven Knight:
+
+ - Fix label placement by the "scons-time.py func" subcommand
+ when a profile value was close to (or equal to) 0.0.
+
+ - Fix env.Append() and env.Prepend()'s ability to add a string to
+ list-like variables like $CCFLAGS under Python 2.6.
+
+ - Other Python2.6 portability: don't use "as" (a Python 2.6 keyword).
+ Don't use the deprecated Exception.message attribute.
+
+ - Support using the -f option to search for a different top-level
+ file name when walking up with the -D, -U or -u options.
+
+ - Fix use of VariantDir when the -n option is used and doesn't,
+ therefore, actually create the variant directory.
+
+ - Fix a stack trace from the --debug=includes option when passed a
+ static or shared library as an argument.
+
+ - Speed up the internal find_file() function (used for searching
+ CPPPATH, LIBPATH, etc.).
+
+ - Add support for using the Python "in" keyword on construction
+ environments (for example, if "CPPPATH" in env: ...).
+
+ - Fix use of Glob() when a repository or source directory contains
+ an in-memory Node without a corresponding on-disk file or directory.
+
+ - Add a warning about future reservation of $CHANGED_SOURCES,
+ $CHANGED_TARGETS, $UNCHANGED_SOURCES and $UNCHANGED_TARGETS.
+
+ - Enable by default the existing warnings about setting the resource
+ $SOURCE, $SOURCES, $TARGET and $TARGETS variable.
+
+ From Rob Managan:
+
+ - Scan for TeX files in the paths specified in the $TEXINPUTS
+ construction variable and the $TEXINPUTS environment variable.
+
+ - Configure the PDF() and PostScript() Builders as single_source so
+ they know each source file generates a separate target file.
+
+ - Add $EPSTOPDF, $EPSTOPDFFLAGS and $EPSTOPDFCOM
+
+ - Add .tex as a valid extension for the PDF() builder.
+
+ - Add regular expressions to find \input, \include and
+ \includegraphics.
+
+ - Support generating a .pdf file from a .eps source.
+
+ - Recursive scan included input TeX files.
+
+ - Handle requiring searched-for TeX input graphics files to have
+ extensions (to avoid trying to build a .eps from itself, e.g.).
+
+ From Greg Noel:
+
+ - Make the Action() function handle positional parameters consistently.
+
+ - Clarify use of Configure.CheckType().
+
+ - Make the File.{Dir,Entry,File}() methods create their entries
+ relative to the calling File's directory, not the SConscript
+ directory.
+
+ - Use the Python os.devnull variable to discard error output when
+ looking for the $CC or $CXX version.
+
+ - Mention LoadableModule() in the SharedLibrary() documentation.
+
+ From Gary Oberbrunner:
+
+ - Update the User's Guide to clarify use of the site_scons/
+ directory and the site_init.py module.
+
+ - Make env.AppendUnique() and env.PrependUnique remove duplicates
+ within a passed-in list being added, too.
+
+ From Randall Spangler:
+
+ - Fix Glob() so an on-disk file or directory beginning with '#'
+ doesn't throw an exception.
+
+
+
+RELEASE 1.1.0 - Thu, 09 Oct 2008 08:33:47 -0700
+
+ From Chris AtLee
+
+ - Use the specified environment when checking for the GCC compiler
+ version.
+
+ From Ian P. Cardenas:
+
+ - Fix Glob() polluting LIBPATH by returning copy of list
+
+ From David Cournapeau:
+
+ - Add CheckCC, CheckCXX, CheckSHCC and CheckSHCXX tests to
+ configuration contexts.
+
+ - Have the --profile= argument use the much faster cProfile module
+ (if it's available in the running Python version).
+
+ - Reorder MSVC compilation arguments so the /Fo is first.
+
+ From Bill Deegan:
+
+ - Add scanning Windows resource (.rc) files for implicit dependencies.
+
+ From John Gozde:
+
+ - When scanning for a #include file, don't use a directory that
+ has the same name as the file.
+
+ From Ralf W. Grosse-Kunstleve
+
+ - Suppress error output when checking for the GCC compiler version.
+
+ From Jared Grubb:
+
+ - Fix VariantDir duplication of #included files in subdirectories.
+
+ From Ludwig H�hne:
+
+ - Reduce memory usage when a directory is used as a dependency of
+ another Node (such as an Alias) by returning a concatenation
+ of the children's signatures + names, not the children's contents,
+ as the directory contents.
+
+ - Raise AttributeError, not KeyError, when a Builder can't be found.
+
+ - Invalidate cached Node information (such as the contenst returned
+ by the get_contents() method) when calling actions with Execute().
+
+ - Avoid object reference cycles from frame objects.
+
+ - Reduce memory usage from Null Executor objects.
+
+ - Compute MD5 checksums of large files without reading the entire
+ file contents into memory. Add a new --md5-chunksize option to
+ control the size of each chunk read into memory.
+
+ From Steven Knight:
+
+ - Fix the ability of the add_src_builder() method to add a new
+ source builder to any other builder.
+
+ - Avoid an infinite loop on non-Windows systems trying to find the
+ SCons library directory if the Python library directory does not
+ begin with the string "python".
+
+ - Search for the SCons library directory in "scons-local" (with
+ no version number) after "scons-local-{VERSION}".
+
+ From Rob Managan:
+
+ - Fix the user's ability to interrupt the TeX build chain.
+
+ - Fix the TeX builder's allowing the user to specify the target name,
+ instead of always using its default output name based on the source.
+
+ - Iterate building TeX output files until all warning are gone
+ and the auxiliary files stop changing, or until we reach the
+ (configurable) maximum number of retries.
+
+ - Add TeX scanner support for: glossaries, nomenclatures, lists of
+ figures, lists of tables, hyperref and beamer.
+
+ - Use the $BIBINPUTS, $BSTINPUTS, $TEXINPUTS and $TEXPICTS construction
+ variables as search paths for the relevant types of input file.
+
+ - Fix building TeX with VariantDir(duplicate=0) in effect.
+
+ - Fix the LaTeX scanner to search for graphics on the TEXINPUTS path.
+
+ - Have the PDFLaTeX scanner search for .gif files as well.
+
+ From Greg Noel:
+
+ - Fix typos and format bugs in the man page.
+
+ - Add a first draft of a wrapper module for Python's subprocess
+ module.
+
+ - Refactor use of the SCons.compat module so other modules don't
+ have to import it individually.
+
+ - Add .sx as a suffix for assembly language files that use the
+ C preprocessor.
+
+ From Gary Oberbrunner:
+
+ - Make Glob() sort the returned list of Files or Nodes
+ to prevent spurious rebuilds.
+
+ - Add a delete_existing keyword argument to the AppendENVPath()
+ and PrependENVPath() Environment methods.
+
+ - Add ability to use "$SOURCE" when specifying a target to a builder
+
+ From Damyan Pepper:
+
+ - Add a test case to verify that SConsignFile() files can be
+ created in previously non-existent subdirectories.
+
+ From Jim Randall:
+
+ - Make the subdirectory in which the SConsignFile() file will
+ live, if the subdirectory doesn't already exist.
+
+ From Ali Tofigh:
+
+ - Add a test to verify duplication of files in VariantDir subdirectories.
+
+
+
+RELEASE 1.0.1 - Sat, 06 Sep 2008 07:29:34 -0700
+
+ From Greg Noel:
+
+ - Add a FindFile() section to the User's Guide.
+
+ - Fix the FindFile() documentation in the man page.
+
+ - Fix formatting errors in the Package() description in the man page.
+
+ - Escape parentheses that appear within variable names when spawning
+ command lines using os.system().
+
+
+
+RELEASE 1.0.0 - XXX
+
+ From Jared Grubb:
+
+ - Clear the Node state when turning a generic Entry into a Dir.
+
+ From Ludwig H�hne:
+
+ - Fix sporadic output-order failures in test/GetBuildFailures/parallel.py.
+
+ - Document the ParseDepends() function in the User's Guide.
+
+ From khomenko:
+
+ - Create a separate description and long_description for RPM packages.
+
+ From Steven Knight:
+
+ - Document the GetLaunchDir() function in the User's Guide.
+
+ - Have the env.Execute() method print an error message if the
+ executed command fails.
+
+ - Add a script for creating a standard SCons development system on
+ Ubuntu Hardy. Rewrite subsidiary scripts for install Python and
+ SCons versions in Python (from shell).
+
+ From Greg Noel:
+
+ - Handle yacc/bison on newer Mac OS X versions creating file.hpp,
+ not file.cpp.h.
+
+ - In RPCGEN tests, ignore stderr messages from older versions of
+ rpcgen on some versions of Mac OS X.
+
+ - Fix typos in man page descriptions of Tag() and Package(), and in
+ the scons-time man page.
+
+ - Fix documentation of SConf.CheckLibWithHeader and other SConf methods.
+
+ - Update documentation of SConscript(variant_dir) usage.
+
+ - Fix SWIG tests for (some versions of) Mac OS X.
+
+ From Jonas Olsson:
+
+ - Print the warning about -j on Windows being potentially unreliable if
+ the pywin32 extensions are unavailable or lack file handle operations.
+
+ From Jim Randall:
+
+ - Fix the env.WhereIs() method to expand construction variables.
+
+ From Rogier Schouten:
+
+ - Enable building of shared libraries with the Bordand ilink32 linker.
+
+
+
+RELEASE 1.0.0 - Sat, 09 Aug 2008 12:19:44 -0700
+
+ From Luca Falavigna:
+
+ - Fix SCons man page indentation under Debian's man page macros.
+
+ From Steven Knight:
+
+ - Clarify the man page description of the SConscript(src_dir) argument.
+
+ - User's Guide updates:
+
+ - Document the BUILD_TARGETS, COMMAND_LINE_TARGETS and
+ DEFAULT_TARGETS variables.
+
+ - Document the AddOption(), GetOption() and SetOption() functions.
+
+ - Document the Requires() function; convert to the Variables
+ object, its UnknownOptions() method, and its associated
+ BoolVariable(), EnumVariable(), ListVariable(), PackageVariable()
+ and PathVariable() functions.
+
+ - Document the Progress() function.
+
+ - Reorganize the chapter and sections describing the different
+ types of environments and how they interact. Document the
+ SetDefault() method. Document the PrependENVPath() and
+ AppendENVPath() functions.
+
+ - Reorganize the command-line arguments chapter. Document the
+ ARGLIST variable.
+
+ - Collect some miscellaneous sections into a chapter about
+ configuring build output.
+
+ - Man page updates:
+
+ - Document suggested use of the Visual C/C++ /FC option to fix
+ the ability to double-click on file names in compilation error
+ messages.
+
+ - Document the need to use Clean() for any SideEffect() files that
+ must be explicitly removed when their targets are removed.
+
+ - Explicitly document use of Node lists as input to Dependency().
+
+ From Greg Noel:
+
+ - Document MergeFlags(), ParseConfig(), ParseFlags() and SideEffect()
+ in the User's Guide.
+
+ From Gary Oberbrunner:
+
+ - Document use of the GetBuildFailures() function in the User's Guide.
+
+ From Adam Simpkins:
+
+ - Add man page text clarifying the behavior of AddPreAction() and
+ AddPostAction() when called with multiple targets.
+
+ From Alexey Zezukin:
+
+ - Fix incorrectly swapped man page descriptions of the --warn= options
+ for duplicate-environment and missing-sconscript.
+
+
+
+RELEASE 0.98.5 - Sat, 07 Jun 2008 08:20:35 -0700
+
+ From Benoit Belley:
+
+ - Fix the Intel C++ compiler ABI specification for EMT64 processors.
+
+ From David Cournapeau:
+
+ - Issue a (suppressable) warning, not an error, when trying to link
+ C++ and Fortran object files into the same executable.
+
+ From Steven Knight:
+
+ - Update the scons.bat file so that it returns the real exit status
+ from SCons, even though it uses setlocal + endlocal.
+
+ - Fix the --interactive post-build messages so it doesn't get stuck
+ mistakenly reporting failures after any individual build fails.
+
+ - Fix calling File() as a File object method in some circumstances.
+
+ - Fix setup.py installation on Mac OS X so SCons gets installed
+ under /usr/lcoal by default, not in the Mac OS X Python framework.
+
+
+
+RELEASE 0.98.4 - Sat, 17 May 2008 22:14:46 -0700
+
+ From Benoit Belley:
+
+ - Fix calculation of signatures for Python function actions with
+ closures in Python versions before 2.5.
+
+ From David Cournapeau:
+
+ - Fix the initialization of $SHF77FLAGS so it includes $F77FLAGS.
+
+ From Jonas Olsson:
+
+ - Fix a syntax error in the Intel C compiler support on Windows.
+
+ From Steven Knight:
+
+ - Change how we represent Python Value Nodes when printing and when
+ stored in .sconsign files (to avoid blowing out memory by storing
+ huge strings in .sconsign files after multiple runs using Configure
+ contexts cause the Value strings to be re-escaped each time).
+
+ - Fix a regression in not executing configuration checks after failure
+ of any configuration check that used the same compiler or other tool.
+
+ - Handle multiple destinations in Visual Studio 8 settings for the
+ analogues to the INCLUDE, LIBRARY and PATH variables.
+
+ From Greg Noel:
+
+ - Update man page text for VariantDir().
+
+
+
+RELEASE 0.98.3 - Tue, 29 Apr 2008 22:40:12 -0700
+
+ From Greg Noel:
+
+ - Fix use of $CXXFLAGS when building C++ shared object files.
+
+ From Steven Knight:
+
+ - Fix a regression when a Builder's source_scanner doesn't select
+ a more specific scanner for the suffix of a specified source file.
+
+ - Fix the Options object backwards compatibility so people can still
+ "import SCons.Options.{Bool,Enum,List,Package,Path}Option" submodules.
+
+ - Fix searching for implicit dependencies when an Entry Node shows up
+ in the search path list.
+
+ From Stefano:
+
+ - Fix expansion of $FORTRANMODDIR in the default Fortran command line(s)
+ when it's set to something like ${TARGET.dir}.
+
+
+
+RELEASE 0.98.2 - Sun, 20 Apr 2008 23:38:56 -0700
+
+ From Steven Knight:
+
+ - Fix a bug in Fortran suffix computation that would cause SCons to
+ run out of memory on Windows systems.
+
+ - Fix being able to specify --interactive mode command lines with
+ \ (backslash) path name separators on Windows.
+
+ From Gary Oberbrunner:
+
+ - Document Glob() in the User's Guide.
+
+
+
+RELEASE 0.98.1 - Fri, 18 Apr 2008 19:11:58 -0700
+
+ From Benoit Belley:
+
+ - Speed up the SCons.Util.to_string*() functions.
+
+ - Optimize various Node intialization and calculations.
+
+ - Optimize Executor scanning code.
+
+ - Optimize Taskmaster execution, including dependency-cycle checking.
+
+ - Fix the --debug=stree option so it prints its tree once, not twice.
+
+ From Johan Boul�:
+
+ - Fix the ability to use LoadableModule() under MinGW.
+
+ From David Cournapeau:
+
+ - Various missing Fortran-related construction variables have been added.
+
+ - SCons now uses the program specified in the $FORTRAN construction
+ variable to link Fortran object files.
+
+ - Fortran compilers on Linux (Intel, g77 and gfortran) now add the -fPIC
+ option by default when compilling shared objects.
+
+ - New 'sunf77', 'sunf90' and 'sunf95' Tool modules have been added to
+ support Sun Fortran compilers. On Solaris, the Sun Fortran compilers
+ are used in preference to other compilers by default.
+
+ - Fortran support now uses gfortran in preference to g77.
+
+ - Fortran file suffixes are now configurable through the
+ $F77FILESUFFIXES, $F90FILESUFFIXES, $F95FILESUFFIXES and
+ $FORTRANFILESUFFIXES variables.
+
+ From Steven Knight:
+
+ - Make the -d, -e, -w and --no-print-directory options "Ignored for
+ compatibility." (We're not going to implement them.)
+
+ - Fix a serious inefficiency in how SCons checks for whether any source
+ files are missing when a Builder call creates many targets from many
+ input source files.
+
+ - In Java projects, make the target .class files depend only on the
+ specific source .java files where the individual classes are defined.
+
+ - Don't store duplicate source file entries in the .sconsign file so
+ we don't endlessly rebuild the target(s) for no reason.
+
+ - Add a Variables object as the first step towards deprecating the
+ Options object name. Similarly, add BoolVariable(), EnumVariable(),
+ ListVariable(), PackageVariable() and PathVariable() functions
+ as first steps towards replacing BoolOption(), EnumOption(),
+ ListOption(), PackageOption() and PathOption().
+
+ - Change the options= keyword argument to the Environment() function
+ to variables=, to avoid confusion with SCons command-line options.
+ Continue supporting the options= keyword for backwards compatibility.
+
+ - When $SWIGFLAGS contains the -python flag, expect the generated .py
+ file to be in the same (sub)directory as the target.
+
+ - When compiling C++ files, allow $CCFLAGS settings to show up on the
+ command line even when $CXXFLAGS has been redefined.
+
+ - Fix --interactive with -u/-U/-D when a VariantDir() is used.
+
+ From Anatoly Techtonik:
+
+ - Have the scons.bat file add the script execution directory to its
+ local %PATH% on Windows, so the Python executable can be found.
+
+ From Mike Wake:
+
+ - Fix passing variable names as a list to the Return() function.
+
+ From Matthew Wesley:
+
+ - Add support for the GDC 'D' language compiler.
+
+
+
+RELEASE 0.98 - Sun, 30 Mar 2008 23:33:05 -0700
+
+ From Benoit Belley:
+
+ - Fix the --keep-going flag so it builds all possible targets even when
+ a later top-level target depends on a child that failed its build.
+
+ - Fix being able to use $PDB and $WINDWOWS_INSERT_MANIFEST together.
+
+ - Don't crash if un-installing the Intel C compiler leaves left-over,
+ dangling entries in the Windows registry.
+
+ - Improve support for non-standard library prefixes and suffixes by
+ stripping all prefixes/suffixes from file name string as appropriate.
+
+ - Reduce the default stack size for -j worker threads to 256 Kbytes.
+ Provide user control over this value by adding --stack-size and
+ --warn=stack-size options, and a SetOption('stack_size') function.
+
+ - Fix a crash on Linux systems when trying to use the Intel C compiler
+ and no /opt/intel_cc_* directories are found.
+
+ - Improve using Python functions as actions by incorporating into
+ a FunctionAction's signature:
+ - literal values referenced by the byte code.
+ - values of default arguments
+ - code of nested functions
+ - values of variables captured by closures
+ - names of referenced global variables and functions
+
+ - Fix the closing message when --clean and --keep-going are both
+ used and no errors occur.
+
+ - Add support for the Intel C compiler on Mac OS X.
+
+ - Speed up reading SConscript files by about 20% (for some
+ configurations) by: 1) optimizing the SCons.Util.is_*() and
+ SCons.Util.flatten() functions; 2) avoiding unnecessary os.stat()
+ calls by using a File's .suffix attribute directly instead of
+ stringifying it.
+
+ From Jérôme Berger:
+
+ - Have the D language scanner search for .di files as well as .d files.
+
+ - Add a find_include_names() method to the Scanner.Classic class to
+ abstract out how included names can be generated by subclasses.
+
+ - Allow the D language scanner to detect multiple modules imported by
+ a single statement.
+
+ From Konstantin Bozhikov:
+
+ - Support expansion of construction variables that contain or refer
+ to lists of other variables or Nodes within expansions like $CPPPATH.
+
+ - Change variable substitution (the env.subst() method) so that an
+ input sequence (list or tuple) is preserved as a list in the output.
+
+ From David Cournapeau:
+
+ - Add a CheckDeclaration() call to configure contexts.
+
+ - Improve the CheckTypeSize() code.
+
+ - Add a Define() call to configure contexts, to add arbitrary #define
+ lines to a generated configure header file.
+
+ - Add a "gfortran" Tool module for the GNU F95/F2003 compiler.
+
+ - Avoid use of -rpath with the Mac OS X linker.
+
+ - Add comment lines to the generated config.h file to describe what
+ the various #define/#undef lines are doing.
+
+ From Steven Knight:
+
+ - Support the ability to subclass the new-style "str" class as input
+ to Builders.
+
+ - Improve the performance of our type-checking by using isinstance()
+ with new-style classes.
+
+ - Fix #include (and other $*PATH variables searches) of files with
+ absolute path names. Don't die if they don't exist (due to being
+ #ifdef'ed out or the like).
+
+ - Fix --interactive mode when Default(None) is used.
+
+ - Fix --debug=memoizer to work around a bug in base Python 2.2 metaclass
+ initialization (by just not allowing Memoization in Python versions
+ that have the bug).
+
+ - Have the "scons-time time" subcommand handle empty log files, and
+ log files that contain no results specified by the --which option.
+
+ - Fix the max Y of vertical bars drawn by "scons-time --fmt=gnuplot".
+
+ - On Mac OS X, account for the fact that the header file generated
+ from a C++ file will be named (e.g.) file.cpp.h, not file.hpp.
+
+ - Fix floating-point numbers confusing the Java parser about
+ generated .class file names in some configurations.
+
+ - Document (nearly) all the values you can now fetch with GetOption().
+
+ - Fix use of file names containing strings of multiple spaces when
+ using ActionFactory instances like the Copy() or Move() function.
+
+ - Fix a 0.97 regression when using a variable expansion (like
+ $OBJSUFFIX) in a source file name to a builder with attached source
+ builders that match suffix (like Program()+Object()).
+
+ - Have the Java parser recognize generics (surrounded by angle brackets)
+ so they don't interfere with identifying anonymous inner classes.
+
+ - Avoid an infinite loop when trying to use saved copies of the
+ env.Install() or env.InstallAs() after replacing the method
+ attributes.
+
+ - Improve the performance of setting construction variables.
+
+ - When cloning a construction environment, avoid over-writing an
+ attribute for an added method if the user explicitly replaced it.
+
+ - Add a warning about deprecated support for Python 1.5, 2.0 and 2.1.
+
+ - Fix being able to SetOption('warn', ...) in SConscript files.
+
+ - Add a warning about env.Copy() being deprecated.
+
+ - Add warnings about the --debug={dtree,stree,tree} options
+ being deprecated.
+
+ - Add VariantDir() as the first step towards deprecating BuildDir().
+ Add the keyword argument "variant_dir" as the replacement for
+ "build_dir".
+
+ - Add warnings about the {Target,Source}Signatures() methods and
+ functions being deprecated.
+
+ From Rob Managan:
+
+ - Enhance TeX and LaTeX support to work with BuildDir(duplicate=0).
+
+ - Re-run LaTeX when it issues a package warning that it must be re-run.
+
+ From Leanid Nazdrynau:
+
+ - Have the Copy() action factory preserve file modes and times
+ when copying individual files.
+
+ From Jan Nijtmans:
+
+ - If $JARCHDIR isn't set explicitly, use the .java_classdir attribute
+ that was set when the Java() Builder built the .class files.
+
+ From Greg Noel:
+
+ - Document the Dir(), File() and Entry() methods of Dir and File Nodes.
+
+ - Add the parse_flags option when creating Environments
+
+ From Gary Oberbrunner:
+
+ - Make File(), Dir() and Entry() return a list of Nodes when passed
+ a list of names, instead of trying to make a string from the name
+ list and making a Node from that string.
+
+ - Fix the ability to build an Alias in --interactive mode.
+
+ - Fix the ability to hash the contents of actions for nested Python
+ functions on Python versions where the inability to pickle them
+ returns a TypeError (instead of the documented PicklingError).
+
+ From Jonas Olsson:
+
+ - Fix use of the Intel C compiler when the top compiler directory,
+ but not the compiler version, is specified.
+
+ - Handle Intel C compiler network license files (port@system).
+
+ From Jim Randall:
+
+ - Fix how Python Value Nodes are printed in --debug=explain output.
+
+ From Adam Simpkins:
+
+ - Add a --interactive option that starts a session for building (or
+ cleaning) targets without re-reading the SConscript files every time.
+
+ - Fix use of readline command-line editing in --interactive mode.
+
+ - Have the --interactive mode "build" command with no arguments
+ build the specified Default() targets.
+
+ - Fix the Chmod(), Delete(), Mkdir() and Touch() Action factories to
+ take a list (of Nodes or strings) as arguments.
+
+ From Vaclav Smilauer:
+
+ - Fix saving and restoring an Options value of 'all' on Python
+ versions where all() is a builtin function.
+
+ From Daniel Svensson:
+
+ - Code correction in SCons.Util.is_List().
+
+ From Ben Webb:
+
+ - Support the SWIG %module statement with following modifiers in
+ parenthese (e.g., '%module(directors="1")').
+
+
+
+RELEASE 0.97.0d20071212 - Wed, 12 Dec 2007 09:29:32 -0600
+
+ From Benoit Belley:
+
+ - Fix occasional spurious rebuilds and inefficiency when using
+ --implicit-cache and Builders that produce multiple targets.
+
+ - Allow SCons to not have to know about the builders of generated
+ files when BuildDir(duplicate=0) is used, potentially allowing some
+ SConscript files to be ignored for smaller builds.
+
+ From David Cournapeau:
+
+ - Add a CheckTypeSize() call to configure contexts.
+
+ From Ken Deeter:
+
+ - Make the "contents" of Alias Nodes a concatenation of the children's
+ content signatures (MD5 checksums), not a concatenation of the
+ children's contents, to avoid using large amounts of memory during
+ signature calculation.
+
+ From Malte Helmert:
+
+ - Fix a lot of typos in the man page and User's Guide.
+
+ From Geoffrey Irving:
+
+ - Speed up conversion of paths in .sconsign files to File or Dir Nodes.
+
+ From Steven Knight:
+
+ - Add an Options.UnknownOptions() method that returns any settings
+ (from the command line, or whatever dictionary was passed in)
+ that aren't known to the Options object.
+
+ - Add a Glob() function.
+
+ - When removing targets with the -c option, use the absolute path (to
+ avoid problems interpreting BuildDir() when the top-level directory
+ is the source directory).
+
+ - Fix problems with Install() and InstallAs() when called through a
+ clone (of a clone, ...) of a cloned construction environment.
+
+ - When executing a file containing Options() settings, add the file's
+ directory to sys.path (so modules can be imported from there) and
+ explicity set __name__ to the name of the file so the statement's
+ in the file can deduce the location if they need to.
+
+ - Fix an O(n^2) performance problem when adding sources to a target
+ through calls to a multi Builder (including Aliases).
+
+ - Redefine the $WINDOWSPROGMANIFESTSUFFIX and
+ $WINDOWSSHLIBMANIFESTSUFFIX variables so they pick up changes to
+ the underlying $SHLIBSUFFIX and $PROGSUFFIX variables.
+
+ - Add a GetBuildFailures() function that can be called from functions
+ registered with the Python atexit module to print summary information
+ about any failures encountered while building.
+
+ - Return a NodeList object, not a Python list, when a single_source
+ Builder like Object() is called with more than one file.
+
+ - When searching for implicit dependency files in the directories
+ in a $*PATH list, don't create Dir Nodes for directories that
+ don't actually exist on-disk.
+
+ - Add a Requires() function to allow the specification of order-only
+ prerequisites, which will be updated before specified "downstream"
+ targets but which don't actually cause the target to be rebuilt.
+
+ - Restore the FS.{Dir,File,Entry}.rel_path() method.
+
+ - Make the default behavior of {Source,Target}Signatures('timestamp')
+ be equivalent to 'timestamp-match', not 'timestamp-newer'.
+
+ - Fix use of CacheDir with Decider('timestamp-newer') by updating
+ the modification time when copying files from the cache.
+
+ - Fix random issues with parallel (-j) builds on Windows when Python
+ holds open file handles (especially for SCons temporary files,
+ or targets built by Python function actions) across process creation.
+
+ From Maxim Kartashev:
+
+ - Fix test scripts when run on Solaris.
+
+ From Gary Oberbrunner:
+
+ - Fix Glob() when a pattern is in an explicitly-named subdirectory.
+
+ From Philipp Scholl:
+
+ - Fix setting up targets if multiple Package builders are specified
+ at once.
+
+
+
+RELEASE 0.97.0d20070918 - Tue, 18 Sep 2007 10:51:27 -0500
+
+ From Steven Knight:
+
+ - Fix the wix Tool module to handle null entries in $PATH variables.
+
+ - Move the documentation of Install() and InstallAs() from the list
+ of functions to the list of Builders (now that they're implemented
+ as such).
+
+ - Allow env.CacheDir() to be set per construction environment. The
+ global CacheDir() function now sets an overridable global default.
+
+ - Add an env.Decider() method and a Node.Decider() method that allow
+ flexible specification of an arbitrary function to decide if a given
+ dependency has changed since the last time a target was built.
+
+ - Don't execute Configure actions (while reading SConscript files)
+ when cleaning (-c) or getting help (-h or -H).
+
+ - Add to each target an implicit dependency on the external command(s)
+ used to build the target, as found by searching env['ENV']['PATH']
+ for the first argument on each executed command line.
+
+ - Add support for a $IMPLICIT_COMMAND_DEPENDENCIES construction
+ variabe that can be used to disable the automatic implicit
+ dependency on executed commands.
+
+ - Add an "ensure_suffix" keyword to Builder() definitions that, when
+ true, will add the configured suffix to the targets even if it looks
+ like they already have a different suffix.
+
+ - Add a Progress() function that allows for calling a function or string
+ (or list of strings) to display progress while walking the DAG.
+
+ - Allow ParseConfig(), MergeFlags() and ParseFlags() to handle output
+ from a *config command with quoted path names that contain spaces.
+
+ - Make the Return() function stop processing the SConscript file and
+ return immediately. Add a "stop=" keyword argument that can be set
+ to False to preserve the old behavior.
+
+ - Fix use of exitstatfunc on an Action.
+
+ - Introduce all man page function examples with "Example:" or "Examples:".
+
+ - When a file gets added to a directory, make sure the directory gets
+ re-scanned for the new implicit dependency.
+
+ - Fix handling a file that's specified multiple times in a target
+ list so that it doesn't cause dependent Nodes to "disappear" from
+ the dependency graph walk.
+
+ From Carsten Koch:
+
+ - Avoid race conditions with same-named files and directory creation
+ when pushing copies of files to CacheDir().
+
+ From Tzvetan Mikov:
+
+ - Handle $ in Java class names.
+
+ From Gary Oberbrunner:
+
+ - Add support for the Intel C compiler on Windows64.
+
+ - On SGI IRIX, have $SHCXX use $CXX by default (like other platforms).
+
+ From Sohail Somani:
+
+ - When Cloning a construction environment, set any variables before
+ applying tools (so the tool module can access the configured settings)
+ and re-set them after (so they end up matching what the user set).
+
+ From Matthias Troffaes:
+
+ - Make sure extra auxiliary files generated by some LaTeX packages
+ and not ending in .aux also get deleted by scons -c.
+
+ From Greg Ward:
+
+ - Add a $JAVABOOTCLASSPATH variable for directories to be passed to the
+ javac -bootclasspath option.
+
+ From Christoph Wiedemann:
+
+ - Add implicit dependencies on the commands used to build a target.
+
+
+
+
+RELEASE 0.97.0d20070809 - Fri, 10 Aug 2007 10:51:27 -0500
+
+ From Lars Albertsson:
+
+ - Don't error if a #include line happens to match a directory
+ somewhere on a path (like $CPPPATH, $FORTRANPATH, etc.).
+
+ From Mark Bertoglio:
+
+ - Fix listing multiple projects in Visual Studio 7.[01] solution files,
+ including generating individual project GUIDs instead of re-using
+ the solution GUID.
+
+ From Jean Brouwers:
+
+ - Add /opt/SUNWspro/bin to the default execution PATH on Solaris.
+
+ From Allan Erskine:
+
+ - Only expect the Microsoft IDL compiler to emit *_p.c and *_data.c
+ files if the /proxy and /dlldata switches are used (respectively).
+
+ From Steven Knight:
+
+ - Have --debug=explain report if a target is being rebuilt because
+ AlwaysBuild() is specified (instead of "unknown reasons").
+
+ - Support {Get,Set}Option('help') to make it easier for SConscript
+ files to tell if a help option (-h, --help, etc.) has been specified.
+
+ - Support {Get,Set}Option('random') so random-dependency interaction
+ with CacheDir() is controllable from SConscript files.
+
+ - Add a new AddOption() function to support user-defined command-
+ line flags (like --prefix=, --force, etc.).
+
+ - Replace modified Optik version with new optparse compatibility module
+ for command line processing in Scripts/SConsOptions.py
+
+ - Push and retrieve built symlinks to/from a CacheDir() as actual
+ symlinks, not by copying the file contents.
+
+ - Fix how the Action module handles stringifying the shared library
+ generator in the Tool/mingw.py module.
+
+ - When generating a config.h file, print "#define HAVE_{FEATURE} 1"
+ instad of just "#define HAVE_{FEATURE}", for more compatibility
+ with Autoconf-style projects.
+
+ - Fix expansion of $TARGET, $TARGETS, $SOURCE and $SOURCES keywords in
+ Visual C/C++ PDB file names.
+
+ - Fix locating Visual C/C++ PDB files in build directories.
+
+ - Support an env.AddMethod() method and an AddMethod() global function
+ for adding a new method, respectively, to a construction environment
+ or an arbitrary object (such as a class).
+
+ - Fix the --debug=time option when the -j option is specified and all
+ files are up to date.
+
+ - Add a $SWIGOUTDIR variable to allow setting the swig -outdir option,
+ and use it to identify files created by the swig -java option.
+
+ - Add a $SWIGPATH variable that specifies the path to be searched
+ for included SWIG files, Also add related $SWIGINCPREFIX and
+ $SWIGINCSUFFIX variables that specify the prefix and suffix to
+ be be added to each $SWIGPATH directory when expanded on the SWIG
+ command line.
+
+ - More efficient copying of construction environments (mostly borrowed
+ from copy.deepcopy() in the standard Python library).
+
+ - When printing --tree=prune output, don't print [brackets] around
+ source files, only do so for built targets with children.
+
+ - Fix interpretation of Builder source arguments when the Builder has
+ a src_suffix *and* a source_builder and the argument has no suffix.
+
+ - Fix use of expansions like ${TARGET.dir} or ${SOURCE.dir} in the
+ following construction variables: $FORTRANMODDIR, $JARCHDIR,
+ $JARFLAGS, $LEXFLAGS, $SWIGFLAGS, $SWIGOUTDIR and $YACCFLAGS.
+
+ - Fix dependencies on Java files generated by SWIG so they can be
+ detected and built in one pass.
+
+ - Fix SWIG when used with a BuildDir().
+
+ From Leanid Nazdrynau:
+
+ - When applying Tool modules after a construction environment has
+ already been created, don't overwrite existing $CFILESUFFIX and
+ $CXXFILESUFFIX value.
+
+ - Support passing the Java() builder a list of explicit .java files
+ (not only a list of directories to be scanned for .java files).
+
+ - Support passing .java files to the Jar() and JavaH() builders, which
+ then use the builder underlying the Java() builder to turn them into
+ .class files. (That is, the Jar()-Java() chain of builders become
+ multi-step, like the Program()-Object()-CFile() builders.)
+
+ - Support passing SWIG .i files to the Java builders (Java(),
+ Jar(), JavaH()), to cause intermediate .java files to be created
+ automatically.
+
+ - Add $JAVACLASSPATH and $JAVASOURCEPATH variables, that get added to
+ the javac "-classpath" and "-sourcepath" options. (Note that SCons
+ does *not* currently search these paths for implicit dependencies.)
+
+ - Commonize initialization of Java-related builders.
+
+ From Jan Nijtmans:
+
+ - Find Java anonymous classes when the next token after the name is
+ an open parenthesis.
+
+ From Gary Oberbrunner:
+
+ - Fix a code example in the man page.
+
+ From Tilo Prutz:
+
+ - Add support for the file names that Java 1.5 (and 1.6) generates for
+ nested anonymous inner classes, which are different from Java 1.4.
+
+ From Adam Simpkins:
+
+ - Allow worker threads to terminate gracefully when all jobs are
+ finished.
+
+ From Sohail Somani:
+
+ - Add LaTeX scanner support for finding dependencies specified with
+ the \usepackage{} directive.
+
+
+
+RELEASE 0.97 - Thu, 17 May 2007 08:59:41 -0500
+
+ From Steven Knight:
+
+ - Fix a bug that would make parallel builds stop in their tracks if
+ Nodes that depended on lists that contained some Nodes built together
+ caused the reference count to drop below 0 if the Nodes were visited
+ and commands finished in the wrong order.
+
+ - Make sure the DirEntryScanner doesn't choke if it's handed something
+ that's not a directory (Node.FS.Dir) Node.
+
+
+
+RELEASE 0.96.96 - Thu, 12 Apr 2007 12:36:25 -0500
+
+ NOTE: This is (Yet) a(nother) pre-release of 0.97 for testing purposes.
+
+ From Joe Bloggs:
+
+ - Man page fix: remove cut-and-paste sentence in NoCache() description.
+
+ From Dmitry Grigorenko and Gary Oberbrunner:
+
+ - Use the Intel C++ compiler, not $CC, to link C++ source.
+
+ From Helmut Grohne:
+
+ - Fix the man page example of propagating a user's external environment.
+
+ From Steven Knight:
+
+ - Back out (most of) the Windows registry installer patch, which
+ seems to not work on some versions of Windows.
+
+ - Don't treat Java ".class" attributes as defining an inner class.
+
+ - Fix detecting an erroneous Java anonymous class when the first
+ non-skipped token after a "new" keyword is a closing brace.
+
+ - Fix a regression when a CPPDEFINES list contains a tuple, the second
+ item of which (the option value) is a construction variable expansion
+ (e.g. $VALUE) and the value of the variable isn't a string.
+
+ - Improve the error message if an IOError (like trying to read a
+ directory as a file) occurs while deciding if a node is up-to-date.
+
+ - Fix "maximum recursion" / "unhashable type" errors in $CPPPATH
+ PathList expansion if a subsidiary expansion yields a stringable,
+ non-Node object.
+
+ - Generate API documentation from the docstrings (using epydoc).
+
+ - Fix use of --debug=presub with Actions for out-of-the-box Builders.
+
+ - Fix handling nested lists within $CPPPATH, $LIBPATH, etc.
+
+ - Fix a "builders_used" AttributeError that real-world Qt initialization
+ triggered in the refactored suffix handling for Builders.
+
+ - Make the reported --debug=time timings meaningful when used with -j.
+ Better documentation of what the times mean.
+
+ - User Guide updates: --random, AlwaysBuild(), --tree=,
+ --debug=findlibs, --debug=presub, --debug=stacktrace,
+ --taskmastertrace.
+
+ - Document (in both man page and User's Guide) that --implicit-cache
+ ignores changes in $CPPPATH, $LIBPATH, etc.
+
+ From Jean-Baptiste Lab:
+
+ - Remove hard-coded dependency on Python 2.2 from Debian packaging files.
+
+ From Jeff Mahovsky:
+
+ - Handle spaces in the build target name in Visual Studio project files.
+
+ From Rob Managan:
+
+ - Re-run LaTeX after BibTeX has been re-run in response to a changed
+ .bib file.
+
+ From Joel B. Mohler:
+
+ - Make additional TeX auxiliary files (.toc, .idx and .bbl files)
+ Precious so their removal doesn't affect whether the necessary
+ sections are included in output PDF or PostScript files.
+
+ From Gary Oberbrunner:
+
+ - Fix the ability to import modules in the site_scons directory from
+ a subdirectory.
+
+ From Adam Simpkins:
+
+ - Make sure parallel (-j) builds all targets even if they show up
+ multiple times in the child list (as a source and a dependency).
+
+ From Matthias Troffaes:
+
+ - Don't re-run TeX if the triggering strings (\makeindex, \bibliography
+ \tableofcontents) are commented out.
+
+ From Richard Viney:
+
+ - Fix use of custom include and lib paths with Visual Studio 8.
+
+ - Select the default .NET Framework SDK Dir based on the version of
+ Visual Studio being used.
+
+
+
+RELEASE 0.96.95 - Mon, 12 Feb 2007 20:25:16 -0600
+
+ From Anatoly Techtonik:
+
+ - Add the scons.org URL and a package description to the setup.py
+ arguments.
+
+ - Have the Windows installer add a registry entry for scons.bat in the
+ "App Paths" key, so scons.bat can be executed without adding the
+ directory to the %PATH%. (Python itself works this way.)
+
+ From Anonymous:
+
+ - Fix looking for default paths in Visual Studio 8.0 (and later).
+
+ - Add -lm to the list of default D libraries for linking.
+
+ From Matt Doar:
+
+ - Provide a more complete write-your-own-Scanner example in the man page.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Contributed upstream Python change to our copied subprocess.py module
+ for more efficient standard input processing.
+
+ From Steven Knight:
+
+ - Fix the Node.FS.Base.rel_path() method when the two nodes are on
+ different drive letters. (This caused an infinite loop when
+ trying to write .sconsign files.)
+
+ - Fully support Scanners that use a dictionary to map file suffixes
+ to other scanners.
+
+ - Support delayed evaluation of the $SPAWN variable to allow selection
+ of a function via ${} string expansions.
+
+ - Add --srcdir as a synonym for -Y/--repository.
+
+ - Document limitations of #include "file.h" with Repository().
+
+ - Fix use of a toolpath under the source directory of a BuildDir().
+
+ - Fix env.Install() with a file name portion that begins with '#'.
+
+ - Fix ParseConfig()'s handling of multiple options in a string that's
+ replaced a *FLAGS construction variable.
+
+ - Have the C++ tools initialize common C compilation variables ($CCFLAGS,
+ $SHCCFLAGS and $_CCCOMCOM) even if the 'cc' Tool isn't loaded.
+
+ From Leanid Nazdrynau:
+
+ - Fix detection of Java anonymous classes if a newline precedes the
+ opening brace.
+
+ From Gary Oberbrunner:
+
+ - Document use of ${} to execute arbitrary Python code.
+
+ - Add support for:
+ 1) automatically adding a site_scons subdirectory (in the top-level
+ SConstruct directory) to sys.path (PYTHONPATH);
+ 2) automatically importing site_scons/site_init.py;
+ 3) automatically adding site_scons/site_tools to the toolpath.
+
+ From John Pye:
+
+ - Change ParseConfig() to preserve white space in arguments passed in
+ as a list.
+
+ From a smith:
+
+ - Fix adding explicitly-named Java inner class files (and any
+ other file names that may contain a '$') to Jar files.
+
+ From David Vitek:
+
+ - Add a NoCache() function to mark targets as unsuitable for propagating
+ to (or retrieving from) a CacheDir().
+
+ From Ben Webb:
+
+ - If the swig -noproxy option is used, it won't generate a .py file,
+ so don't emit it as a target that we expect to be built.
+
+
+
+RELEASE 0.96.94 - Sun, 07 Jan 2007 18:36:20 -0600
+
+ NOTE: This is a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Allow arbitrary white space after a SWIG %module declaration.
+
+ From Paul:
+
+ - When compiling resources under MinGW, make sure there's a space
+ between the --include-dir option and its argument.
+
+ From Jay Kint:
+
+ - Alleviate long command line issues on Windows by executing command
+ lines directly via os.spawnv() if the command line doesn't need
+ shell interpretation (has no pipes, redirection, etc.).
+
+ From Walter Franzini:
+
+ - Exclude additional Debian packaging files from the copyright check.
+
+ From Fawad Halim:
+
+ - Handle the conflict between the impending Python 2.6 'as' keyword
+ and our Tool/as.py module name.
+
+ From Steven Knight:
+
+ - Speed up the Node.FS.Dir.rel_path() method used to generate path names
+ that get put into the .sconsign* file(s).
+
+ - Optimize Node.FS.Base.get_suffix() by computing the suffix once, up
+ front, when we set the Node's name. (Duh...)
+
+ - Reduce the Memoizer's responsibilities to simply counting hits and
+ misses when the --debug=memoizer option is used, not to actually
+ handling the key calculation and memoization itself. This speeds
+ up some configurations significantly, and should cause no functional
+ differences.
+
+ - Add a new scons-time script with subcommands for generating
+ consistent timing output from SCons configurations, extracting
+ various information from those timings, and displaying them in
+ different formats.
+
+ - Reduce some unnecessary stat() calls from on-disk entry type checks.
+
+ - Fix SideEffect() when used with -j, which was badly broken in 0.96.93.
+
+ - Propagate TypeError exceptions when evaluating construction variable
+ expansions up the stack, so users can see what's going on.
+
+ - When disambiguating a Node.FS.Entry into a Dir or File, don't look
+ in the on-disk source directory until we've confirmed there's no
+ on-disk entry locally and there *is* one in the srcdir. This avoids
+ creating a phantom Node that can interfere with dependencies on
+ directory contents.
+
+ - Add an AllowSubstExceptions() function that gives the SConscript
+ files control over what exceptions cause a string to expand to ''
+ vs. terminating processing with an error.
+
+ - Allow the f90.py and f95.py Tool modules to compile earlier source
+ source files of earlier Fortran version.
+
+ - Fix storing signatures of files retrieved from CacheDir() so they're
+ correctly identified as up-to-date next invocation.
+
+ - Make sure lists of computed source suffixes cached by Builder objects
+ don't persist across changes to the list of source Builders (so the
+ addition of suffixes like .ui by the qt.py Tool module take effect).
+
+ - Enhance the bootstrap.py script to allow it to be used to execute
+ SCons more easily from a checked-out source tree.
+
+ From Ben Leslie:
+
+ - Fix post-Memoizer value caching misspellings in Node.FS._doLookup().
+
+ From Rob Managan, Dmitry Mikhin and Joel B. Mohler:
+
+ - Handle TeX/LaTeX files in subdirectories by changing directory
+ before invoking TeX/LaTeX.
+
+ - Scan LaTeX files for \bibliography lines.
+
+ - Support multiple file names in a "\bibliography{file1,file2}" string.
+
+ - Handle TeX warnings about undefined citations.
+
+ - Support re-running LaTeX if necessary due to a Table of Contents.
+
+ From Dmitry Mikhin:
+
+ - Return LaTeX if "Rerun to get citations correct" shows up on the next
+ line after the "Warning:" string.
+
+ From Gary Oberbrunner:
+
+ - Add #include lines to fix portability issues in two tests.
+
+ - Eliminate some unnecessary os.path.normpath() calls.
+
+ - Add a $CFLAGS variable for C-specific options, leaving $CCFLAGS
+ for options common to C and C++.
+
+ From Tom Parker:
+
+ - Have the error message print the missing file that Qt can't find.
+
+ From John Pye:
+
+ - Fix env.MergeFlags() appending to construction variable value of None.
+
+ From Steve Robbins:
+
+ - Fix the "sconsign" script when the .sconsign.dblite file is explicitly
+ specified on the command line (and not intuited from the old way of
+ calling it with just ".sconsign").
+
+ From Jose Pablo Ezequiel "Pupeno" Fernandez Silva:
+
+ - Give the 'lex' tool knowledge of the additional target files produced
+ by the flex "--header-file=" and "--tables-file=" options.
+
+ - Give the 'yacc' tool knowledge of the additional target files produced
+ by the bison "-g", "--defines=" and "--graph=" options.
+
+ - Generate intermediate files with Objective C file suffixes (.m) when
+ the lex and yacc source files have appropriate suffixes (.lm and .ym).
+
+ From Sohail Somain:
+
+ - Have the mslink.py Tool only look for a 'link' executable on Windows
+ systems.
+
+ From Vaclav Smilauer:
+
+ - Add support for a "srcdir" keyword argument when calling a Builder,
+ which will add a srcdir prefix to all non-relative string sources.
+
+ From Jonathan Ultis:
+
+ - Allow Options converters to take the construction environment as
+ an optional argument.
+
+
+
+RELEASE 0.96.93 - Mon, 06 Nov 2006 00:44:11 -0600
+
+ NOTE: This is a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Allow Python Value Nodes to be Builder targets.
+
+ From Matthias:
+
+ - Only filter Visual Studio common filename prefixes on complete
+ directory names.
+
+ From Chad Austin:
+
+ - Fix the build of the SCons documentation on systems that don't
+ have "python" in the $PATH.
+
+ From Ken Boortz:
+
+ - Enhance ParseConfig() to recognize options that begin with '+'.
+
+ From John Calcote, Elliot Murphy:
+
+ - Document ways to override the CCPDBFLAGS variable to use the
+ Microsoft linker's /Zi option instead of the default /Z7.
+
+ From Christopher Drexler:
+
+ - Make SCons aware bibtex must be called if any \include files
+ cause creation of a bibliography.
+
+ - Make SCons aware that "\bilbiography" in TeX source files means
+ that related .bbl and .blg bibliography files will be created.
+ (NOTE: This still needs to search for the string in \include files.)
+
+ From David Gruener:
+
+ - Fix inconsistent handling of Action strfunction arguments.
+
+ - Preserve white space in display Action strfunction strings.
+
+ From James Y. Knight and Gerard Patel:
+
+ - Support creation of shared object files from assembly language.
+
+ From Steven Knight:
+
+ - Speed up the Taskmaster significantly by avoiding unnecessary
+ re-scans of Nodes to find out if there's work to be done, having it
+ track the currently-executed top-level target directly and not
+ through its presence on the target list, and eliminating some other
+ minor list(s), method(s) and manipulation.
+
+ - Fix the expansion of $TARGET and $SOURCE in the expansion of
+ $INSTALLSTR displayed for non-environment calls to InstallAs().
+
+ - Fix the ability to have an Alias() call refer to a directory
+ name that's not identified as a directory until later.
+
+ - Enhance runtest.py with an option to use QMTest as the harness.
+ This will become the default behavior as we add more functionality
+ to the QMTest side.
+
+ - Let linking on mingw use the default function that chooses $CC (gcc)
+ or $CXX (g++) depending on whether there are any C++ source files.
+
+ - Work around a bug in early versions of the Python 2.4 profile module
+ that caused the --profile= option to fail.
+
+ - Only call Options validators and converters once when initializing a
+ construction environment.
+
+ - Fix the ability of env.Append() and env.Prepend(), in all known Python
+ versions, to handle different input value types when the construction
+ variable being updated is a dictionary.
+
+ - Add a --cache-debug option for information about what files it's
+ looking for in a CacheDir().
+
+ - Document the difference in construction variable expansion between
+ {Action,Builder}() and env.{Action,Builder}().
+
+ - Change the name of env.Copy() to env.Clone(), keeping the old name
+ around for backwards compatibility (with the intention of eventually
+ phasing it out to avoid confusion with the Copy() Action factory).
+
+ From Arve Knudsen:
+
+ - Support cleaning and scanning SWIG-generated files.
+
+ From Carsten Koch:
+
+ - Allow selection of Visual Studio version by setting $MSVS_VERSION
+ after construction environment initialization.
+
+ From Jean-Baptiste Lab:
+
+ - Try using zipimport if we can't import Tool or Platform modules
+ using the normal "imp" module. This allows SCons to be packaged
+ using py2exe's all-in-one-zip-file approach.
+
+ From Ben Liblit:
+
+ - Do not re-scan files if the scanner returns no implicit dependencies.
+
+ From Sanjoy Mahajan:
+
+ - Change use of $SOURCES to $SOURCE in all TeX-related Tool modules.
+
+ From Joel B. Mohler:
+
+ - Make SCons aware that "\makeindex" in TeX source files means that
+ related .ilg, .ind and .idx index files will be created.
+ (NOTE: This still needs to search for the string in \include files.)
+
+ - Prevent scanning the TeX .aux file for additional files from
+ trying to remove it twice when the -c option is used.
+
+ From Leanid Nazdrynau:
+
+ - Give the MSVC RES (resource) Builder a src_builder list and a .rc
+ src_suffix so other builders can generate .rc files.
+
+ From Matthew A. Nicholson:
+
+ - Enhance Install() and InstallAs() to handle directory trees as sources.
+
+ From Jan Nijtmans:
+
+ - Don't use the -fPIC flag when using gcc on Windows (e.g. MinGW).
+
+ From Greg Noel:
+
+ - Add an env.ParseFlags() method that provides separate logic for
+ parsing GNU tool chain flags into a dictionary.
+
+ - Add an env.MergeFlags() method to apply an arbitrary dictionary
+ of flags to a construction environment's variables.
+
+ From Gary Oberbrunner:
+
+ - Fix parsing tripartite Intel C compiler version numbers on Linux.
+
+ - Extend the ParseConfig() function to recognize -arch and
+ -isysroot options.
+
+ - Have the error message list the known suffixes when a Builder call
+ can't build a source file with an unknown suffix.
+
+ From Karol Pietrzak:
+
+ - Avoid recursive calls to main() in the program snippet used by the
+ SConf subsystem to test linking against libraries. This changes the
+ default behavior of CheckLib() and CheckLibWithHeader() to print
+ "Checking for C library foo..." instead of "Checking for main()
+ in C library foo...".
+
+ From John Pye:
+
+ - Throw an exception if a command called by ParseConfig() or
+ ParseFlags() returns an error.
+
+ From Stefan Seefeld:
+
+ - Initial infrastructure for running SCons tests under QMTest.
+
+ From Sohail Somani:
+
+ - Fix tests that fail due to gcc warnings.
+
+ From Dobes Vandermeer:
+
+ - In stack traces, print the full paths of SConscript files.
+
+ From Atul Varma:
+
+ - Fix detection of Visual C++ Express Edition.
+
+ From Dobes Vandermeer:
+
+ - Let the src_dir option to the SConscript() function affect all the
+ the source file paths, instead of treating all source files paths
+ as relative to the SConscript directory itself.
+
+ From Nicolas Vigier:
+
+ - Fix finding Fortran modules in build directories.
+
+ - Fix use of BuildDir() when the source file in the source directory
+ is a symlink with a relative path.
+
+ From Edward Wang:
+
+ - Fix the Memoizer when the SCons Python modules are executed from
+ .pyo files at different locations from where they were compiled.
+
+ From Johan Zander:
+
+ - Fix missing os.path.join() when constructing the $FRAMEWORKSDKDIR/bin.
+
+
+
+RELEASE 0.96.92 - Mon, 10 Apr 2006 21:08:22 -0400
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Fix the intelc.py Tool module to not throw an exception if the
+ only installed version is something other than ia32.
+
+ - Set $CCVERSION when using gcc.
+
+ From Matthias:
+
+ - Support generating project and solution files for Microsoft
+ Visual Studio version 8.
+
+ - Support generating more than one project file for a Microsoft
+ Visual Studio solution file.
+
+ - Add support for a support "runfile" parameter to Microsoft
+ Visual Studio project file creation.
+
+ - Put the project GUID, not the solution GUID, in the right spot
+ in the solution file.
+
+ From Erling Andersen:
+
+ - Fix interpretation of Node.FS objects wrapped in Proxy instances,
+ allowing expansion of things like ${File(TARGET)} in command lines.
+
+ From Stanislav Baranov:
+
+ - Add a separate MSVSSolution() Builder, with support for the
+ following new construction variables: $MSVSBUILDCOM, $MSVSCLEANCOM,
+ $MSVSENCODING, $MSVSREBUILDCOM, $MSVSSCONS, $MSVSSCONSCOM,
+ $MSVSSCONSFLAGS, $MSVSSCONSCRIPT and $MSVSSOLUTIONCOM.
+
+ From Ralph W. Grosse-Kunstleve and Patrick Mezard:
+
+ - Remove unneceesary (and incorrect) SCons.Util strings on some function
+ calls in SCons.Util.
+
+ From Bob Halley:
+
+ - Fix C/C++ compiler selection on AIX to not always use the external $CC
+ environment variable.
+
+ From August Hörandl:
+
+ - Add a scanner for \include and \import files, with support for
+ searching a directory list in $TEXINPUTS (imported from the external
+ environment).
+
+ - Support $MAKEINDEX, $MAKEINDEXCOM, $MAKEINDEXCOMSTR and
+ $MAKEINDEXFLAGS for generating indices from .idx files.
+
+ From Steven Johnson:
+
+ - Add a NoClean() Environment method and function to override removal
+ of targets during a -c clean, including documentation and tests.
+
+ From Steven Knight:
+
+ - Check for whether files exist on disk by listing the directory
+ contents, not calling os.path.exists() file by file. This is
+ somewhat more efficient in general, and may be significantly
+ more efficient on Windows.
+
+ - Minor speedups in the internal is_Dict(), is_List() and is_String()
+ functions.
+
+ - Fix a signature refactoring bug that caused Qt header files to
+ get re-generated every time.
+
+ - Don't fail when writing signatures if the .sconsign.dblite file is
+ owned by a different user (e.g. root) from a previous run.
+
+ - When deleting variables from stacked OverrideEnvironments, don't
+ throw a KeyError if we were able to delte the variable from any
+ Environment in the stack.
+
+ - Get rid of the last indentation tabs in the SCons source files and
+ add -tt to the Python invocations in the packaging build and the
+ tests so they don't creep back in.
+
+ - In Visual Studio project files, put quotes around the -C directory
+ so everything works even if the path has spaces in it.
+
+ - The Intel Fortran compiler uses -object:$TARGET, not "-o $TARGET",
+ when building object files on Windows. Have the the ifort Tool
+ modify the default command lines appropriately.
+
+ - Document the --debug=explain option in the man page. (How did we
+ miss this?)
+
+ - Add a $LATEXRETRIES variable to allow configuration of the number of
+ times LaTex can be re-called to try to resolve undefined references.
+
+ - Change the order of the arguments to Configure.Checklib() to match
+ the documentation.
+
+ - Handle signature calculation properly when the Python function used
+ for a FunctionAction is an object method.
+
+ - On Windows, assume that absolute path names without a drive letter
+ refer to the drive on which the SConstruct file lives.
+
+ - Add /usr/ccs/bin to the end of the the default external execution
+ PATH on Solaris.
+
+ - Add $PKGCHK and $PKGINFO variables for use on Solaris when searching
+ for the SunPRO C++ compiler. Make the default value for $PKGCHK
+ be /usr/sbin/pgkchk (since /usr/sbin isn't usually on the external
+ execution $PATH).
+
+ - Fix a man page example of overriding variables when calling
+ SharedLibrary() to also set the $LIBSUFFIXES variable.
+
+ - Add a --taskmastertrace=FILE option to give some insight on how
+ the taskmaster decides what Node to build next.
+
+ - Changed the names of the old $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
+ $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX construction variables to
+ new $WINDOWSDEFPREFIX, $WINDOWSDEFSUFFIX, $WINDOWSDLLPREFIX and
+ $WINDOWSIMPLIBPREFIX construction variables. The old names are now
+ deprecated, but preserved for backwards compatibility.
+
+ - Fix (?) a runtest.py hang on Windows when the --xml option is used.
+
+ - Change the message when an error occurs trying to interact with the
+ file system to report the target(s) in square brackets (as before) and
+ the actual file or directory that encountered the error afterwards.
+
+ From Chen Lee:
+
+ - Add x64 support for Microsoft Visual Studio 8.
+
+ From Baptiste Lepilleur:
+
+ - Support the --debug=memory option on Windows when the Python version
+ has the win32process and win32api modules.
+
+ - Add support for Visual Studio 2005 Pro.
+
+ - Fix portability issues in various tests: test/Case.py,
+ Test/Java/{JAR,JARCHDIR,JARFLAGS,JAVAC,JAVACFLAGS,JAVAH,RMIC}.py,
+ test/MSVS/vs-{6.0,7.0,7.1,8.0}-exec.py,
+ test/Repository/{Java,JavaH,RMIC}.py,
+ test/QT/{generated-ui,installed,up-to-date,warnings}.py,
+ test/ZIP/ZIP.py.
+
+ - Ignore pkgchk errors on Solaris when searching for the C++ compiler.
+
+ - Speed up the SCons/EnvironmentTests.py unit tests.
+
+ - Add a --verbose= option to runtest.py to print executed commands
+ and their output at various levels.
+
+ From Christian Maaser:
+
+ - Add support for Visual Studio Express Editions.
+
+ - Add support for Visual Studio 8 *.manifest files, includng
+ new $WINDOWS_INSERT_MANIFEST, $WINDOWSPROGMANIFESTSUFFIX,
+ $WINDOWSPROGMANIFESTPREFIX, $WINDOWSPROGMANIFESTSUFFIX,
+ $WINDOWSSHLIBMANIFESTPREFIX and $WINDOWSSHLIBMANIFESTSUFFIX
+ construction variables.
+
+ From Adam MacBeth:
+
+ - Fix detection of additional Java inner classes following use of a
+ "new" keyword inside an inner class.
+
+ From Sanjoy Mahajan:
+
+ - Correct TeX-related command lines to just $SOURCE, not $SOURCES
+
+ From Patrick Mezard:
+
+ - Execute build commands for a command-line target if any of the
+ files built along with the target is out of date or non-existent,
+ not just if the command-line target itself is out of date.
+
+ - Fix the -n option when used with -c to print all of the targets
+ that will be removed for a multi-target Builder call.
+
+ - If there's no file in the source directory, make sure there isn't
+ one in the build directory, too, to avoid dangling files left
+ over from previous runs when a source file is removed.
+
+ - Allow AppendUnique() and PrependUnique() to append strings (and
+ other atomic objects) to lists.
+
+ From Joel B. Mohler:
+
+ - Extend latex.py, pdflatex.py, pdftex.py and tex.py so that building
+ from both TeX and LaTeX files uses the same logic to call $BIBTEX
+ when it's necessary, to call $MAKEINDEX when it's necessary, and to
+ call $TEX or $LATEX multiple times to handle undefined references.
+
+ - Add an emitter to the various TeX builders so that the generated
+ .aux and .log files also get deleted by the -c option.
+
+ From Leanid Nazdrynau:
+
+ - Fix the Qt UIC scanner to work with generated .ui files (by using
+ the FindFile() function instead of checking by-hand for the file).
+
+ From Jan Nieuwenhuizen:
+
+ - Fix a problem with interpreting quoted argument lists on command lines.
+
+ From Greg Noel:
+
+ - Add /sw/bin to the default execution PATH on Mac OS X.
+
+ From Kian Win Ong:
+
+ - When building a .jar file and there is a $JARCHDIR, put the -C
+ in front of each .class file on the command line.
+
+ - Recognize the Java 1.5 enum keyword.
+
+ From Asfand Yar Qazi:
+
+ - Add /opt/bin to the default execution PATH on all POSIX platforms
+ (between /usr/local/bin and /bin).
+
+ From Jon Rafkind:
+
+ - Fix the use of Configure() contexts from nested subsidiary
+ SConscript files.
+
+ From Christoph Schulz:
+
+ - Add support for $CONFIGUREDIR and $CONFIGURELOG variables to control
+ the directory and logs for configuration tests.
+
+ - Add support for a $INSTALLSTR variable.
+
+ - Add support for $RANLIBCOM and $RANLIBCOMSTR variables (which fixes
+ a bug when setting $ARCOMSTR).
+
+ From Amir Szekely:
+
+ - Add use of $CPPDEFINES to $RCCOM (resource file compilation) on MinGW.
+
+ From Erick Tryzelaar:
+
+ - Fix the error message when trying to report that a given option is
+ not gettable/settable from an SConscript file.
+
+ From Dobes Vandermeer:
+
+ - Add support for SCC and other settings in Microsoft Visual
+ Studio project and solution files: $MSVS_PROJECT_BASE_PATH,
+ $MSVS_PROJECT_GUID, $MSVS_SCC_AUX_PATH, $MSVS_SCC_LOCAL_PATH,
+ $MSVS_SCC_PROJECT_NAME, $MSVS_SCC_PROVIDER,
+
+ - Add support for using a $SCONS_HOME variable (imported from the
+ external environment, or settable internally) to put a shortened
+ SCons execution line in the Visual Studio project file.
+
+ From David J. Van Maren:
+
+ - Only filter common prefixes from source files names in Visual Studio
+ project files if the prefix is a complete (sub)directory name.
+
+ From Thad Ward:
+
+ - If $MSVSVERSIONS is already set, don't overwrite it with
+ information from the registry.
+
+
+
+RELEASE 0.96.91 - Thu, 08 Sep 2005 07:18:23 -0400
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Chad Austin:
+
+ - Have the environment store the toolpath and re-use it to find Tools
+ modules during later Copy() or Tool() calls (unless overridden).
+
+ - Normalize the directory path names in SConsignFile() database
+ files so the same signature file can interoperate on Windows and
+ non-Windows systems.
+
+ - Make --debug=stacktrace print a stacktrace when a UserError is thrown.
+
+ - Remove an old, erroneous cut-and-paste comment in Scanner/Dir.py.
+
+ From Stanislav Baranov:
+
+ - Make it possible to support with custom Alias (sub-)classes.
+
+ - Allow Builders to take empty source lists when called.
+
+ - Allow access to both TARGET and SOURCE in $*PATH expansions.
+
+ - Allow SConscript files to modify BUILD_TARGETS.
+
+ From Timothee Besset:
+
+ - Add support for Objective C/C++ .m and .mm file suffixes (for
+ Mac OS X).
+
+ From Charles Crain
+
+ - Fix the PharLap linkloc.py module to use target+source arguments
+ when calling env.subst().
+
+ From Bjorn Eriksson:
+
+ - Fix an incorrect Command() keyword argument in the man page.
+
+ - Add a $TEMPFILEPREFIX variable to control the prefix or flag used
+ to pass a long-command-line-execution tempfile to a command.
+
+ From Steven Knight:
+
+ - Enhanced the SCons setup.py script to install man pages on
+ UNIX/Linux systems.
+
+ - Add support for an Options.FormatOptionHelpText() method that can
+ be overridden to customize the format of Options help text.
+
+ - Add a global name for the Entry class (which had already been
+ documented).
+
+ - Fix re-scanning of generated source files for implicit dependencies
+ when the -j option is used.
+
+ - Fix a dependency problem that caused $LIBS scans to not be added
+ to all of the targets in a multiple-target builder call, which
+ could cause out-of-order builds when the -j option is used.
+
+ - Store the paths of source files and dependencies in the .sconsign*
+ file(s) relative to the target's directory, not relative to the
+ top-level SConstruct directory. This starts to make it possible to
+ subdivide the dependency tree arbitrarily by putting an SConstruct
+ file in every directory and using content signatures.
+
+ - Add support for $YACCHFILESUFFIX and $YACCHXXFILESUFFIX variables
+ that accomodate parser generators that write header files to a
+ different suffix than the hard-coded .hpp when the -d option is used.
+
+ - The default behavior is now to store signature information in a
+ single .sconsign.dblite file in the top-level SConstruct directory.
+ The old behavior of a separate .sconsign file in each directory can
+ be specified by calling SConsignFile(None).
+
+ - Remove line number byte codes within the signature calculation
+ of Python function actions, so that changing the location of an
+ otherwise unmodified Python function doesn't cause rebuilds.
+
+ - Fix AddPreAction() and AddPostAction() when an action has more than
+ one target file: attach the actions to the Executor, not the Node.
+
+ - Allow the source directory of a BuildDir / build_dir to be outside
+ of the top-level SConstruct directory tree.
+
+ - Add a --debug=nomemoizer option that disables the Memoizer for clearer
+ looks at the counts and profiles of the underlying function calls,
+ not the Memoizer wrappers.
+
+ - Print various --debug= stats even if we exit early (e.g. using -h).
+
+ - Really only use the cached content signature value if the file
+ is older than --max-drift, not just if --max-drift is set.
+
+ - Remove support for conversion from old (pre 0.96) .sconsign formats.
+
+ - Add support for a --diskcheck option to enable or disable various
+ on-disk checks: that File and Dir nodes match on-disk entries;
+ whether an RCS file exists for a missing source file; whether an
+ SCCS file exists for a missing source file.
+
+ - Add a --raw argument to the sconsign script, so it can print a
+ raw representation of each entry's NodeInfo dictionary.
+
+ - Add the 'f90' and 'f95' tools to the list of Fortran compilers
+ searched for by default.
+
+ - Add the +Z option by default when compiling shared objects on
+ HP-UX.
+
+ From Chen Lee:
+
+ - Handle Visual Studio project and solution files in Unicode.
+
+ From Sanjoy Mahajan:
+
+ - Fix a bad use of Copy() in an example in the man page, and a
+ bad regular expression example in the man page and User's Guide.
+
+ From Shannon Mann:
+
+ - Have the Visual Studio project file(s) echo "Starting SCons" before
+ executing SCons, mainly to work around a quote-stripping bug in
+ (some versions of?) the Windows cmd command executor.
+
+ From Georg Mischler:
+
+ - Remove the space after the -o option when invoking the Borland
+ BCC compiler; some versions apparently require that the file name
+ argument be concatenated with the option.
+
+ From Leanid Nazdrynau:
+
+ - Fix the Java parser's handling of backslashes in strings.
+
+ From Greg Noel:
+
+ - Add construction variables to support frameworks on Mac OS X:
+ $FRAMEWORKS, $FRAMEWORKPREFIX, $FRAMEWORKPATH, $FRAMEWORKPATHPREFIX.
+
+ - Re-order link lines so the -o option always comes right after the
+ command name.
+
+ From Gary Oberbrunner:
+
+ - Add support for Intel C++ beta 9.0 (both 32 and 64 bit versions).
+
+ - Document the new $FRAMEWORK* variables for Mac OS X.
+
+ From Karol Pietrzak:
+
+ - Add $RPATH (-R) support to the Sun linker Tool (sunlink).
+
+ - Add a description of env.subst() to the man page.
+
+ From Chris Prince:
+
+ - Look in the right directory, not always the local directory, for a
+ same-named file or directory conflict on disk.
+
+ - On Windows, preserve the external environment's %SYSTEMDRIVE%
+ variable, too.
+
+ From Craig Scott:
+
+ - Have the Fortran module emitter look for Fortan modules to be created
+ relative to $FORTRANMODDIR, not the top-level directory.
+
+ - When saving Options to a file, run default values through the
+ converter before comparing them with the set values. This correctly
+ suppresses Boolean Option values from getting written to the saved
+ file when they're one of the many synonyms for a default True or
+ False value.
+
+ - Fix the Fortran Scanner's ability to handle a module being used
+ in the same file in which it is defined.
+
+ From Steve-o:
+
+ - Add the -KPIC option by default when compiling shared objects on
+ Solaris.
+
+ - Change the default suffix for Solaris objects to .o, to conform to
+ Sun WorkShop's expectations. Change the profix to so_ so they can
+ still be differentiated from static objects in the same directory.
+
+ From Amir Szekely:
+
+ - When calling the resource compiler on MinGW, add --include-dir and
+ the source directory so it finds the source file.
+
+ - Update EnsureSConsVersion() to support revision numbers.
+
+ From Greg Ward:
+
+ - Fix a misplaced line in the man page.
+
+
+
+RELEASE 0.96.90 - Tue, 15 Feb 2005 21:21:12 +0000
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Fix Java parsing to avoid erroneously identifying a new array
+ of class instances as an anonymous inner class.
+
+ - Fix a typo in the man page description of PathIsDirCreate.
+
+ From Chad Austin:
+
+ - Allow Help() to be called multiple times, appending to the help
+ text each call.
+
+ - Allow Tools found on a toolpath to import Python modules from
+ their local directory.
+
+ From Steve Christensen:
+
+ - Handle exceptions from Python functions as build actions.
+
+ - Add a set of canned PathOption validators: PathExists (the default),
+ PathIsFile, PathIsDir and PathIsDirCreate.
+
+ From Matthew Doar:
+
+ - Add support for .lex and .yacc file suffixes for Lex and Yacc files.
+
+ From Eric Frias:
+
+ - Huge performance improvement: wrap the tuples representing an
+ include path in an object, so that the time it takes to hash the
+ path doesn't grow porportionally to the length of the path.
+
+ From Gottfried Ganssauge:
+
+ - Fix SCons on SuSE/AMD-64 Linux by having the wrapper script also
+ check for the build engine in the parent directory of the Python
+ library directory (/usr/lib64 instead of /usr/lib).
+
+ From Stephen Kennedy:
+
+ - Speed up writing the .sconsign file at the end of a run by only
+ calling sync() once at the end, not after every entry.
+
+ From Steven Knight:
+
+ - When compiling with Microsoft Visual Studio, don't include the ATL and
+ MFC directories in the default INCLUDE and LIB environment variables.
+
+ - Remove the following deprecated features: the ParseConfig()
+ global function (deprecated in 0.93); the misspelled "validater"
+ keyword to the Options.Add() method (deprecated in 0.91); the
+ SetBuildSignatureType(), SetContentSignatureType(), SetJobs() and
+ GetJobs() global functions (deprecated in 0.14).
+
+ - Fix problems with corrupting the .sconsign.dblite file when
+ interrupting builds by writing to a temporary file and renaming,
+ not writing the file directly.
+
+ - Fix a 0.96 regression where when running with -k, targets built from
+ walking dependencies later on the command line would not realize
+ that a dependency had failed an earlier build attempt, and would
+ try to rebuild the dependent targets.
+
+ - Change the final messages when using -k and errors occur from
+ "{building,cleaning} terminated because of errors" to "done
+ {building,cleaning} targets (errors occurred during {build,clean})."
+
+ - Allow Configure.CheckFunc() to take an optional header argument
+ (already supported by Conftest.py) to specify text at the top of
+ the compiled test file.
+
+ - Fix the --debug=explain output when a Python function action changed
+ so it prints a meaningful string, not the binary representation of
+ the function contents.
+
+ - Allow a ListOption's default value(s) to be a Python list of specified
+ values, not just a string containing a comma-separated list of names.
+
+ - Add a ParseDepends() function that will parse up a list of explicit
+ dependencies from a "make depend" style file.
+
+ - Support the ability to change directory when executing an Action
+ through "chdir" keyword arguments to Action and Builder creation
+ and calls.
+
+ - Fix handling of Action ojects (and other callables that don't match
+ our calling arguments) in construction variable expansions.
+
+ - On Win32, install scons.bat in the Python directory when installing
+ from setup.py. (The bdist_wininst installer was already doing this.)
+
+ - Fix env.SConscript() when called with a list of SConscipt files.
+ (The SConscript() global function already worked properly.)
+
+ - Add a missing newline to the end of the --debug=explain "unknown
+ reasons" message.
+
+ - Enhance ParseConfig() to work properly for spaces in between the -I,
+ -L and -l options and their arguments.
+
+ - Packaging build fix: Rebuild the files that are use to report the
+ --version of SCons whenever the development version number changes.
+
+ - Fix the ability to specify a target_factory of Dir() to a Builder,
+ which the default create-a-directory Builder was interfering with.
+
+ - Mark a directory as built if it's created as part of the preparation
+ for another target, to avoid trying to build it again when it comes
+ up in the target list.
+
+ - Allow a function with the right calling signature to be put directly
+ in an Environment's BUILDERS dictionary, making for easier creation
+ and use of wrappers (pseudo-Builders) that call other Builders.
+
+ - On Python 2.x, wrap lists of Nodes returned by Builders in a UserList
+ object that adds a method that makes str() object return a string
+ with all of the Nodes expanded to their path names. (Builders under
+ Python 1.5.2 still return lists to avoid TypeErrors when trying
+ to extend() list, so Python 1.5.2 doesn't get pretty-printing of Node
+ lists, but everything should still function.)
+
+ - Allow Aliases to have actions that will be executed whenever
+ any of the expanded Alias targets are out of date.
+
+ - Fix expansion of env.Command() overrides within target and
+ source file names.
+
+ - Support easier customization of what's displayed by various default
+ actions by adding lots of new construction variables: $ARCOMSTR,
+ $ASCOMSTR, $ASPPCOMSTR, $BIBTEXCOMSTR, $BITKEEPERCOMSTR, $CCCOMSTR,
+ $CVSCOMSTR, $CXXCOMSTR, $DCOMSTR, $DVIPDFCOMSTR, $F77COMSTR,
+ $F90COMSTR, $F95COMSTR, $FORTRANCOMSTR, $GSCOMSTR, $JARCOMSTR,
+ $JAVACCOMSTR, $JAVAHCOMSTR, $LATEXCOMSTR, $LEXCOMSTR, $LINKCOMSTR,
+ $M4COMSTR, $MIDLCOMSTR, $P4COMSTR, $PCHCOMSTR, $PDFLATEXCOMSTR,
+ $PDFTEXCOMSTR, $PSCOMSTR, $QT_MOCFROMCXXCOMSTR, $QT_MOCFROMHCOMSTR,
+ $QT_UICCOMSTR, $RCCOMSTR, $REGSVRCOMSTR, $RCS_COCOMSTR, $RMICCOMSTR,
+ $SCCSCOMSTR, $SHCCCOMSTR, $SHCXXCOMSTR, $SHF77COMSTR, $SHF90COMSTR,
+ $SHF95COMSTR, $SHFORTRANCOMSTR, $SHLINKCOMSTR, $SWIGCOMSTR,
+ $TARCOMSTR, $TEXCOMSTR, $YACCCOMSTR and $ZIPCOMSTR.
+
+ - Add an optional "map" keyword argument to ListOption() that takes a
+ dictionary to map user-specified values to legal values from the list
+ (like EnumOption() already doee).
+
+ - Add specific exceptions to try:-except: blocks without any listed,
+ so that they won't catch and mask keyboard interrupts.
+
+ - Make --debug={tree,dtree,stree} print something even when there's
+ a build failure.
+
+ - Fix how Scanners sort the found dependencies so that it doesn't
+ matter whether the dependency file is in a Repository or not.
+ This may cause recompilations upon upgrade to this version.
+
+ - Make AlwaysBuild() work with Alias and Python value Nodes (making
+ it much simpler to support aliases like "clean" that just invoke
+ an arbitrary action).
+
+ - Have env.ParseConfig() use AppendUnique() by default to suppress
+ duplicate entries from multiple calls. Add a "unique" keyword
+ argument to allow the old behavior to be specified.
+
+ - Allow the library modules imported by an SConscript file to get at
+ all of the normally-available global functions and variables by saying
+ "from SCons.Script import *".
+
+ - Add a --debug=memoizer option to print Memoizer hit/mass statistics.
+
+ - Allow more than one --debug= option to be set at a time.
+
+ - Change --debug=count to report object counts before and after
+ reading SConscript files and before and after building targets.
+
+ - Change --debug=memory output to line up the numbers and to better
+ match (more or less) the headers on the --debug=count columns.
+
+ - Speed things up when there are lists of targets and/or sources by
+ getting rid of some N^2 walks of the lists involved.
+
+ - Cache evaluation of LazyActions so we don't create a new object
+ for each invocation.
+
+ - When scanning, don't create Nodes for include files that don't
+ actually exist on disk.
+
+ - Make supported global variables CScanner, DScanner, ProgramScanner and
+ SourceFileScanner. Make SourceFileScanner.add_scanner() a supported
+ part of the public interface. Keep the old SCons.Defaults.*Scan names
+ around for a while longer since some people were already using them.
+
+ - By default, don't scan directories for on-disk files. Add a
+ DirScanner global scanner that can be used in Builders or Command()
+ calls that want source directory trees scanned for on-disk changes.
+ Have the Tar() and Zip() Builders use the new DirScanner to preserve
+ the behavior of rebuilding a .tar or .zip file if any file or
+ directory under a source tree changes. Add Command() support for
+ a source_scanner keyword argument to Command() that can be set to
+ DirScanner to get this behavior.
+
+ - Documentation changes: Explain that $CXXFLAGS contains $CCFLAGS
+ by default. Fix a bad target_factory example in the man page.
+ Add appendices to the User's Guide to cover the available Tools,
+ Builders and construction variables. Comment out the build of
+ the old Python 10 paper, which doesn't build on all systems and
+ is old enough at this point that it probably isn't worth the
+ effort to make it do so.
+
+ From Wayne Lee:
+
+ - Avoid "maximum recursion limit" errors when removing $(-$) pairs
+ from long command lines.
+
+ From Clive Levinson:
+
+ - Make ParseConfig() recognize and add -mno-cygwin to $LINKFLAGS and
+ $CCFLAGS, and -mwindows to $LINKFLAGS.
+
+ From Michael McCracken:
+
+ - Add a new "applelink" tool to handle the things like Frameworks and
+ bundles that Apple has added to gcc for linking.
+
+ - Use more appropriate default search lists of linkers, compilers and
+ and other tools for the 'darwin' platform.
+
+ - Add a LoadableModule Builder that builds a bundle on Mac OS X (Darwin)
+ and a shared library on other systems.
+
+ - Improve SWIG tests for use on Mac OS X (Darwin).
+
+ From Elliot Murphy:
+
+ - Enhance the tests to guarantee persistence of ListOption
+ values in saved options files.
+
+ - Supply the help text when -h is used with the -u, -U or -D options.
+
+ From Christian Neeb:
+
+ - Fix the Java parser's handling of string definitions to avoid ignoring
+ subsequent code.
+
+ From Han-Wen Nienhuys:
+
+ - Optimize variable expansion by: using the re.sub() method (when
+ possible); not using "eval" for variables for which we can fetch the
+ value directory; avoiding slowing substitution logic when there's no
+ '$' in the string.
+
+ From Gary Oberbrunner:
+
+ - Add an Environment.Dump() method to print the contents of a
+ construction environment.
+
+ - Allow $LIBS (and similar variables) to contain explicit File Nodes.
+
+ - Change ParseConfig to add the found library names directly to the
+ $LIBS variable, instead of returning them.
+
+ - Add ParseConfig() support for the -framework GNU linker option.
+
+ - Add a PRINT_CMD_LINE_FUNC construction variable to allow people
+ to filter (or log) command-line output.
+
+ - Print an internal Python stack trace in response to an otherwise
+ unexplained error when --debug=stacktrace is specified.
+
+ - Add a --debug=findlibs option to print what's happening when
+ the scanner is searching for libraries.
+
+ - Allow Tool specifications to be passed a dictionary of keyword
+ arguments.
+
+ - Support an Options default value of None, in which case the variable
+ will not be added to the construction environment unless it's set
+ explicitly by the user or from an Options file.
+
+ - Avoid copying __builtin__ values into a construction environment's
+ dictionary when evaluating construction variables.
+
+ - Add a new cross-platform intelc.py Tool that can detect and
+ configure the Intel C++ v8 compiler on both Windows, where it's
+ named icl, and Linux, where it's named icc. It also checks that
+ the directory specified in the Windows registry exists, and sets a
+ new $INTEL_C_COMPILER_VERSION construction variable to identify the
+ version being used. (Niall Douglas contributed an early prototype
+ of parts of this module.)
+
+ - Fix the private Conftest._Have() function so it doesn't change
+ non-alphanumeric characters to underscores.
+
+ - Supply a better error message when a construction variable expansion
+ has an unknown attribute.
+
+ - Documentation changes: Update the man page to describe use of
+ filenames or Nodes in $LIBS.
+
+ From Chris Pawling:
+
+ - Have the linkloc tool use $MSVS_VERSION to select the Microsoft
+ Visual Studio version to use.
+
+ From Kevin Quick:
+
+ - Fix the Builder name returned from ListBuilders and other instances
+ of subclasses of the BuilderBase class.
+
+ - Add Builders and construction variables to support rpcgen:
+ RPCGenClient(), RPCGenHeader(), RPCGenService(), RPCGenXDR(),
+ $RPCGEN, $RPCGENFLAGS, $RPCGENCLIENTFLAGS, $RPCGENHEADERFLAGS,
+ $RPCGENSERVICEFLAGS, $RPCGENXDRFLAGS.
+
+ - Update the man page to document that prefix and suffix Builder
+ keyword arguments can be strings, callables or dictionaries.
+
+ - Provide more info in the error message when a user tries to build
+ a target multiple ways.
+
+ - Fix Delete() when a file doesn't exist and must_exist=1. (We were
+ unintentionally dependent on a bug in versions of the Python shutil.py
+ module prior to Python 2.3, which would generate an exception for
+ a nonexistent file even when ignore_errors was set.)
+
+ - Only replace a Node's builder with a non-null source builder.
+
+ - Fix a stack trace when a suffix selection dictionary is passed
+ an empty source file list.
+
+ - Allow optional names to be attached to Builders, for default
+ Builders that don't get attached to construction environments.
+
+ - Fix problems with Parallel Task Exception handling.
+
+ - Build targets in an associated BuildDir even if there are targets
+ or subdirectories locally in the source directory.
+
+ - If a FunctionAction has a callable class as its underlying Python
+ function, use its strfunction() method (if any) to display the
+ action.
+
+ - Fix handling when BuildDir() exists but is unwriteable. Add
+ "Stop." to those error messages for consistency.
+
+ - Catch incidents of bad builder creation (without an action) and
+ supply meaningful error messages.
+
+ - Fix handling of src_suffix values that aren't extensions (don't
+ begin with a '.').
+
+ - Don't retrieve files from a CacheDir, but report what would happen,
+ when the -n option is used.
+
+ - Use the source_scanner from the target Node, not the source node
+ itself.
+
+ - Internal Scanners fixes: Make sure Scanners are only passed Nodes.
+ Fix how a Scanner.Selector called its base class initialization.
+ Make comparisons of Scanner objects more robust. Add a name to
+ an internal default ObjSourceScanner.
+
+ - Add a deprecated warning for use of the old "scanner" keyword argument
+ to Builder creation.
+
+ - Improve the --debug=explain message when the build action changes.
+
+ - Test enhancements in SourceCode.py, option-n.py, midl.py. Better
+ Command() and Scanner test coverage. Improved test infrastructure
+ for -c output.
+
+ - Refactor the interface between Action and Executor objects to treat
+ Actions atomically.
+
+ - The --debug=presub option will now report the pre-substitution
+ each action seprately, instead of reporting the entire list before
+ executing the actions one by one.
+
+ - The --debug=explain option explaining a changed action will now
+ (more correctly) show pre-substitution action strings, instead of
+ the commands with substituted file names.
+
+ - A Node (file) will now be rebuilt if its PreAction or PostAction
+ actions change.
+
+ - Python Function actions now have their calling signature (target,
+ source, env) reported correctly when displayed.
+
+ - Fix BuildDir()/build_dir handling when the build_dir is underneath
+ the source directory and trying to use entries from the build_dir
+ as sources for other targets in the build-dir.
+
+ - Fix hard-coding of JDK path names in various Java tests.
+
+ - Handle Python stack traces consistently (stop at the SConscript stack
+ frame, by default) even if the Python source code isn't available.
+
+ - Improve the performance of the --debug={tree,dtree} options.
+
+ - Add --debug=objects logging of creation of OverrideWarner,
+ EnvironmentCopy and EnvironmentOverride objects.
+
+ - Fix command-line expansion of Python Value Nodes.
+
+ - Internal cleanups: Remove an unnecessary scan argument. Associate
+ Scanners only with Builders, not nodes. Apply overrides once when
+ a Builder is called, not in multiple places. Cache results from the
+ Node.FS.get_suffix() and Node.get_build_env() methods. Use the Python
+ md5 modules' hexdigest() method, if there is one. Have Taskmaster
+ call get_stat() once for each Node and re-use the value instead of
+ calling it each time it needs the value. Have Node.depends_on()
+ re-use the list from the children() method instead of calling it
+ multiple times.
+
+ - Use the correct scanner if the same source file is used for targets in
+ two different environments with the same path but different scanners.
+
+ - Collect logic for caching values in memory in a Memoizer class,
+ which cleans up a lot of special-case code in various methods and
+ caches additional values to speed up most configurations.
+
+ - Add a PathAccept validator to the list of new canned PathOption
+ validators.
+
+ From Jeff Squyres:
+
+ - Documentation changes: Use $CPPDEFINES instead of $CCFLAGS in man
+ page examples.
+
+ From Levi Stephen:
+
+ - Allow $JARCHDIR to be expanded to other construction variables.
+
+ From Christoph Wiedemann:
+
+ - Add an Environment.SetDefault() method that only sets values if
+ they aren't already set.
+
+ - Have the qt.py Tool not override variables already set by the user.
+
+ - Add separate $QT_BINPATH, $QT_CPPPATH and $QT_LIBPATH variables
+ so these can be set individually, instead of being hard-wired
+ relative to $QTDIR.
+
+ - The %TEMP% and %TMP% external environment variables are now propagated
+ automatically to the command execution environment on Windows systems.
+
+ - A new --config= command-line option allows explicit control of
+ of when the Configure() tests are run: --config=force forces all
+ checks to be run, --config=cache uses all previously cached values,
+ --config=auto (the default) runs tests only when dependency analysis
+ determines it's necessary.
+
+ - The Configure() subsystem can now write a config.h file with values
+ like HAVE_STDIO_H, HAVE_LIBM, etc.
+
+ - The Configure() subsystem now executes its checks silently when the
+ -Q option is specified.
+
+ - The Configure() subsystem now reports if a test result is being
+ taken from cache, and prints the standard output and error output
+ of tests even when cached.
+
+ - Configure() test results are now reported as "yes" or "no" instead of
+ "ok" or "failed."
+
+ - Fixed traceback printing when calling the env.Configure() method
+ instead of the Configure() global function.
+
+ - The Configure() subsystem now caches build failures in a .sconsign
+ file in the subdirectory, not a .cache file. This may cause
+ tests to be re-executed the first time after you install 0.97.
+
+ - Additional significant internal cleanups in the Configure() subsystem
+ and its tests.
+
+ - Have the Qt Builder make uic-generated files dependent on the .ui.h
+ file, if one exists.
+
+ - Add a test to make sure that SCons source code does not contain
+ try:-except: blocks that catch all errors, which potentially catch
+ and mask keyboard interrupts.
+
+ - Fix us of TargetSignatures('content') with the SConf subsystem.
+
+ From Russell Yanofsky:
+
+ - Add support for the Metrowerks Codewarrior compiler and linker
+ (mwcc and mwld).
+
+
+
+RELEASE 0.96.1 - Mon, 23 Aug 2004 12:55:50 +0000
+
+ From Craig Bachelor:
+
+ - Handle white space in the executable Python path name within in MSVS
+ project files by quoting the path.
+
+ - Correct the format of a GUID string in a solution (.dsw) file so
+ MSVS can correctly "build enable" a project.
+
+ From Steven Knight:
+
+ - Add a must_exist flag to Delete() to let the user control whether
+ it's an error if the specified entry doesn't exist. The default
+ behavior is now to silently do nothing if it doesn't exist.
+
+ - Package up the new Platform/darwin.py, mistakenly left out of 0.96.
+
+ - Make the scons.bat REM statements into @REM so they aren't printed.
+
+ - Make the SCons packaging SConscript files platform independent.
+
+ From Anthony Roach:
+
+ - Fix scanning of pre-compiled header (.pch) files for #includes,
+ broken in 0.96.
+
+
+
+RELEASE 0.96 - Wed, 18 Aug 2004 13:36:40 +0000
+
+ From Chad Austin:
+
+ - Make the CacheDir() directory if it doesn't already exist.
+
+ - Allow construction variable substitutions in $LIBS specifications.
+
+ - Allow the emitter argument to a Builder() to be or expand to a list
+ of emitter functions, which will be called in sequence.
+
+ - Suppress null values in construction variables like $LIBS that use
+ the internal _concat() function.
+
+ - Remove .dll files from the construction variables searched for
+ libraries that can be fed to Win32 compilers.
+
+ From Chad Austin and Christoph Wiedemann:
+
+ - Add support for a $RPATH variable to supply a list of directories
+ to search for shared libraries when linking a program. Used by
+ the GNU and IRIX linkers (gnulink and sgilink).
+
+ From Charles Crain:
+
+ - Restore the ability to do construction variable substitutions in all
+ kinds of *PATH variables, even when the substitution returns a Node
+ or other object.
+
+ From Tom Epperly:
+
+ - Allow the Java() Builder to take more than one source directory.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Have SConsignFile() use, by default, a custom "dblite.py" that we can
+ control and guarantee to work on all Python versions (or nearly so).
+
+ From Jonathan Gurley:
+
+ - Add support for the newer "ifort" versions of the Intel Fortran
+ Compiler for Linux.
+
+ From Bob Halley:
+
+ - Make the new *FLAGS variable type work with copied Environments.
+
+ From Chris Hoeppler:
+
+ - Initialize the name of a Scanner.Classic scanner correctly.
+
+ From James Juhasz:
+
+ - Add support for the .dylib shared library suffix and the -dynamiclib
+ linker option on Mac OS X.
+
+ From Steven Knight:
+
+ - Add an Execute() method for executing actions directly.
+
+ - Support passing environment override keyword arguments to Command().
+
+ - Fix use of $MSVS_IGNORE_IDE_PATHS, which was broken when we added
+ support for $MSVS_USE_MFC_DIRS last release.
+
+ - Make env.Append() and env.Prepend() act like the underlying Python
+ behavior when the variable being appended to is a UserList object.
+
+ - Fix a regression that prevented the Command() global function in
+ 0.95 from working with command-line strings as actions.
+
+ - Fix checking out a file from a source code management system when
+ the env.SourceCode() method was called with an individual file name
+ or node, not a directory name or node.
+
+ - Enhance the Task.make_ready() method to create a list of the
+ out-of-date Nodes for the task for use by the wrapping interface.
+
+ - Allow Scanners to pull the list of suffixes from the construction
+ environment when the "skeys" keyword argument is a string containing
+ a construction variable to be expanded.
+
+ - Support new $CPPSUFFIXES, $DSUFFIXES $FORTRANSUFFIXES, and
+ $IDLSUFFIXES. construction variables that contain the default list
+ of suffixes to be scanned by a given type of scanner, allowing these
+ suffix lists to be easily added to or overridden.
+
+ - Speed up Node creation when calling a Builder by comparing whether two
+ Environments are the same object, not if their underlying dictionaries
+ are equivalent.
+
+ - Add a --debug=explain option that reports the reason(s) why SCons
+ thinks it must rebuild something.
+
+ - Add support for functions that return platform-independent Actions
+ to Chmod(), Copy(), Delete(), Mkdir(), Move() and Touch() files
+ and/or directories. Like any other Actions, the returned Action
+ object may be executed directly using the Execute() global function
+ or env.Execute() environment method, or may be used as a Builder
+ action or in an env.Command() action list.
+
+ - Add support for the strfunction argument to all types of Actions:
+ CommandAction, ListAction, and CommandGeneratorAction.
+
+ - Speed up turning file system Nodes into strings by caching the
+ values after we're finished reading the SConscript files.
+
+ - Have ParseConfig() recognize and supporting adding the -Wa, -Wl,
+ and -Wp, flags to ASFLAGS, LINKFLAGS and CPPFLAGS, respectively.
+
+ - Change the .sconsign format and the checks for whether a Node is
+ up-to-date to make dependency checks more efficient and correct.
+
+ - Add wrapper Actions to SCons.Defaults for $ASCOM, $ASPPCOM, $LINKCOM,
+ $SHLINKCOM, $ARCOM, $LEXCOM and $YACCCOM. This makes it possible
+ to replace the default print behavior with a custom strfunction()
+ for each of these.
+
+ - When a Node has been built, don't walk the whole tree back to delete
+ the parents's implicit dependencies, let returning up the normal
+ Taskmaster descent take care of it for us.
+
+ - Add documented support for separate target_scanner and source_scanner
+ arguments to Builder creation, which allows different scanners to
+ be applied to source files
+
+ - Don't re-install or (re-generate) .h files when a subsidiary #included
+ .h file changes. This eliminates incorrect circular dependencies
+ with .h files generated from other source files.
+
+ - Slim down the internal Sig.Calculator class by eliminating methods
+ whose functionality is now covered by Node methods.
+
+ - Document use of the target_factory and source_factory keyword
+ arguments when creating Builder objects. Enhance Dir Nodes so that
+ they can be created with user-specified Builder objects.
+
+ - Don't blow up with stack trace when the external $PATH environment
+ variable isn't set.
+
+ - Make Builder calls return lists all the time, even if there's only
+ one target. This keeps things consistent and easier to program to
+ across platforms.
+
+ - Add a Flatten() function to make it easier to deal with the Builders
+ all returning lists of targets, not individual targets.
+
+ - Performance optimizations in Node.FS.__doLookup().
+
+ - Man page fixes: formatting typos, misspellings, bad example.
+
+ - User's Guide fixes: Fix the signatures of the various example
+ *Options() calls. Triple-quote properly a multi-line Split example.
+
+ - User's Guide additions: Chapter describing File and Directory
+ Nodes. Section describing declarative nature of SCons functions in
+ SConscript files. Better organization and clarification of points
+ raised by Robert P. J. Day. Chapter describing SConf (Autoconf-like)
+ functionality. Chapter describing how to install Python and
+ SCons. Chapter describing Java builds.
+
+ From Chris Murray:
+
+ - Add a .win32 attribute to force file names to expand with
+ Windows backslash path separators.
+
+ - Fix escaping file names on command lines when the expansion is
+ concatenated with another string.
+
+ - Add support for Fortran 90 and Fortran 95. This adds $FORTRAN*
+ variables that specify a default compiler, command-line, flags,
+ etc. for all Fortran versions, plus separate $F90* and $F95*
+ variables for when different compilers/flags/etc. must be specified
+ for different Fortran versions.
+
+ - Have individual tools that create libraries override the default
+ $LIBPREFIX and $LIBSUFFIX values set by the platform. This makes
+ it easier to use Microsoft Visual Studio tools on a CygWin platform.
+
+ From Gary Oberbrunner:
+
+ - Add a --debug=presub option to print actions prior to substitution.
+
+ - Add a warning upon use of the override keywords "targets" and
+ "sources" when calling Builders. These are usually mistakes which
+ are otherwise silently (and confusingly) turned into construction
+ variable overrides.
+
+ - Try to find the ICL license file path name in the external environment
+ and the registry before resorting to the hard-coded path name.
+
+ - Add support for fetching command-line keyword=value arguments in
+ order from an ARGLIST list.
+
+ - Avoid stack traces when trying to read dangling symlinks.
+
+ - Treat file "extensions" that only contain digits as part of the
+ file basename. This supports version numbers as part of shared
+ library names, for example.
+
+ - Avoid problems when there are null entries (None or '') in tool
+ lists or CPPPATH.
+
+ - Add an example and explanation of how to use "tools = ['default', ..."
+ when creating a construction environment.
+
+ - Add a section describing File and Directory Nodes and some of their
+ attributes and methods.
+
+ - Have ParseConfig() add a returned -pthread flag to both $CCFLAGS
+ and $LINKFLAGS.
+
+ - Fix some test portability issues on Mac OS X (darwin).
+
+ From Simon Perkins:
+
+ - Fix a bug introduced in building shared libraries under MinGW.
+
+ From Kevin Quick:
+
+ - Handling SCons exceptions according to Pythonic standards.
+
+ - Fix test/chained-build.py on systems that execute within one second.
+
+ - Fix tests on systems where 'ar' warns about archive creation.
+
+ From Anthony Roach:
+
+ - Fix use of the --implicit-cache option with timestamp signatures.
+
+ - If Visual Studio is installed, assume the C/C++ compiler, the linker
+ and the MIDL compiler that comes with it are available, too.
+
+ - Better error messages when evaluating a construction variable
+ expansion yields a Python syntax error.
+
+ - Change the generation of PDB files when using Visual Studio from
+ compile time to link time.
+
+ From sam th:
+
+ - Allow SConf.CheckLib() to search a list of libraries, like the
+ Autoconf AC_SEARCH_LIBS macro.
+
+ - Allow the env.WhereIs() method to take a "reject" argument to
+ let it weed out specific path names.
+
+ From Christoph Wiedemann:
+
+ - Add new Moc() and Uic() Builders for more explicit control over
+ Qt builds, plus new construction variables to control them:
+ $QT_AUTOSCAN, $QT_DEBUG, $QT_MOCCXXPREFIX, $QT_MOCCXXSUFFIX,
+ $QT_MOCHPREFIX, $QT_MOCHSUFFIX, $QT_UICDECLPREFIX, $QT_UICDECLSUFFIX,
+ $QT_UICIMPLPREFIX, $QT_UICIMPLSUFFIX and $QT_UISUFFIX.
+
+ - Add a new single_source keyword argument for Builders that enforces
+ a single source file on calls to the Builder.
+
+
+
+RELEASE 0.95 - Mon, 08 Mar 2004 06:43:20 -0600
+
+ From Chad Austin:
+
+ - Replace print statements with calls to sys.stdout.write() so output
+ lines stay together when -j is used.
+
+ - Add portability fixes for a number of tests.
+
+ - Accomodate the fact that Cygwin's os.path.normcase() lies about
+ the underlying system being case-sensitive.
+
+ - Fix an incorrect _concat() call in the $RCINCFLAGS definition for
+ the mingw Tool.
+
+ - Fix a problem with the msvc tool with Python versions prior to 2.3.
+
+ - Add support for a "toolpath" Tool() and Environment keyword that
+ allows Tool modules to be found in specified local directories.
+
+ - Work around Cygwin Python's silly fiction that it's using a
+ case-sensitive file system.
+
+ - More robust handling of data in VCComponents.dat.
+
+ - If the "env" command is available, spawn commands with the more
+ general "env -" instead of "env -i".
+
+ From Kerim Borchaev:
+
+ - Fix a typo in a msvc.py's registry lookup: "VCComponents.dat", not
+ "VSComponents.dat".
+
+ From Chris Burghart:
+
+ - Fix the ability to save/restore a PackageOption to a file.
+
+ From Steve Christensen:
+
+ - Update the MSVS .NET and MSVC 6.0/7.0 path detection.
+
+ From David M. Cooke:
+
+ - Make the Fortran scanner case-insensitive for the INCLUDE string.
+
+ From Charles Crain:
+
+ - If no version of MSVC is detected but the tool is specified,
+ use the MSVC 6.0 paths by default.
+
+ - Ignore any "6.1" version of MSVC found in the registry; this is a
+ phony version number (created by later service packs?) and would
+ throw off the logic if the user had any non-default paths configure.
+
+ - Correctly detect if the user has independently configured the MSVC
+ "include," "lib" or "path" in the registry and use the appropriate
+ values. Previously, SCons would only use the values if all three
+ were set in the registry.
+
+ - Make sure side-effect nodes are prepare()d before building their
+ corresponding target.
+
+ - Preserve the ability to call BuildDir() multiple times with the
+ same target and source directory arguments.
+
+ From Andy Friesen:
+
+ - Add support for the Digital Mars "D" programming language.
+
+ From Scott Lystig Fritchie:
+
+ - Fix the ability to use a custom _concat() function in the
+ construction environment when calling _stripixes().
+
+ - Make the message about ignoring a missing SConscript file into a
+ suppressable Warning, not a hard-coded sys.stderr.write().
+
+ - If a builder can be called multiple times for a target (because
+ the sources and overrides are identical, or it's a builder with the
+ "multi" flag set), allow the builder to be called through multiple
+ environments so long as the builders have the same signature for
+ the environments in questions (that is, they're the same action).
+
+ From Bob Halley:
+
+ - When multiple targets are built by a single action, retrieve all
+ of them from cache, not just the first target, and exec the build
+ command if any of the targets isn't present in the cache.
+
+ From Zephaniah Hull:
+
+ - Fix command-line ARGUMENTS with multiple = in them.
+
+ From Steven Knight:
+
+ - Fix EnsureSConsVersion() so it checks against the SCons version,
+ not the Python version, on Pythons with sys.version_info.
+
+ - Don't swallow the AttributeError when someone uses an expansion like
+ $TARGET.bak, so we can supply a more informative error message.
+
+ - Fix an odd double-quote escape sequence in the man page.
+
+ - Fix looking up a naked drive letter as a directory (Dir('C:')).
+
+ - Support using File nodes in the LIBS construction variable.
+
+ - Allow the LIBS construction variable to be a single string or File
+ node, not a list, when only one library is needed.
+
+ - Fix typos in the man page: JAVACHDIR => JARCHDIR; add "for_signature"
+ to the __call__() example in the "Variable Substitution" section.
+
+ - Correct error message spellings of "non-existant" to "non-existent."
+
+ - When scanning for libraries to link with, don't append $LIBPREFIXES
+ or $LIBSUFFIXES values to the $LIBS values if they're already present.
+
+ - Add a ZIPCOMPRESSION construction variable to control whether the
+ internal Python action for the Zip Builder compresses the file or
+ not. The default value is zipfile.ZIP_DEFLATED, which generates
+ a compressed file.
+
+ - Refactor construction variable expansion to support recursive
+ expansion of variables (e.g. CCFLAGS = "$CCFLAGS -g") without going
+ into an infinite loop. Support this in all construction variable
+ overrides, as well as when copying Environments.
+
+ - Fix calling Configure() from more than one subsidiary SConscript file.
+
+ - Fix the env.Action() method so it returns the correct type of
+ Action for its argument(s).
+
+ - Fix specifying .class files as input to JavaH with the .class suffix
+ when they weren't generated using the Java Builder.
+
+ - Make the check for whether all of the objects going into a
+ SharedLibrary() are shared work even if the object was built in a
+ previous run.
+
+ - Supply meaningful error messages, not stack traces, if we try to add
+ a non-Node as a source, dependency, or ignored dependency of a Node.
+
+ - Generate MSVS Project files that re-invoke SCons properly regardless
+ of whether the file was built via scons.bat or scons.py.
+ (Thanks to Niall Douglas for contributing code and testing.)
+
+ - Fix TestCmd.py, runtest.py and specific tests to accomodate being
+ run from directories whose paths include white space.
+
+ - Provide a more useful error message if a construction variable
+ expansion contains a syntax error during evaluation.
+
+ - Fix transparent checkout of implicit dependency files from SCCS
+ and RCS.
+
+ - Added new --debug=count, --debug=memory and --debug=objects options.
+ --debug=count and --debug=objects only print anything when run
+ under Python 2.1 or later.
+
+ - Deprecate the "overrides" keyword argument to Builder() creation
+ in favor of using keyword argument values directly (like we do
+ for builder execution and the like).
+
+ - Always use the Builder overrides in substitutions, not just if
+ there isn't a target-specific environment.
+
+ - Add new "rsrcpath" and "rsrcdir" and attributes to $TARGET/$SOURCE,
+ so Builder command lines can find things in Repository source
+ directories when using BuildDir.
+
+ - Fix the M4 Builder so that it chdirs to the Repository directory
+ when the input file is in the source directory of a BuildDir.
+
+ - Save memory at build time by allowing Nodes to delete their build
+ environments after they've been built.
+
+ - Add AppendUnique() and PrependUnique() Environment methods, which
+ add values to construction variables like Append() and Prepend()
+ do, but suppress any duplicate elements in the list.
+
+ - Allow the 'qt' tool to still be used successfully from a copied
+ Environment. The include and library directories previously ended up
+ having the same string re-appended to the end, yielding an incorrect
+ path name.
+
+ - Supply a more descriptive error message when the source for a target
+ can't be found.
+
+ - Initialize all *FLAGS variables with objects do the right thing with
+ appending flags as strings or lists.
+
+ - Make things like ${TARGET.dir} work in *PATH construction variables.
+
+ - Allow a $MSVS_USE_MFC_DIRS construction variable to control whether
+ ATL and MFC directories are included in the default INCLUDE and
+ LIB paths.
+
+ - Document the dbm_module argument to the SConsignFile() function.
+
+ From Vincent Risi:
+
+ - Add support for the bcc32, ilink32 and tlib Borland tools.
+
+ From Anthony Roach:
+
+ - Supply an error message if the user tries to configure a BuildDir
+ for a directory that already has one.
+
+ - Remove documentation of the still-unimplemented -e option.
+
+ - Add -H help text listing the legal --debug values.
+
+ - Don't choke if a construction variable is a non-string value.
+
+ - Build Type Libraries in the target directory, not the source
+ directory.
+
+ - Add an appendix to the User's Guide showing how to accomplish
+ various common tasks in Python.
+
+ From Greg Spencer:
+
+ - Add support for Microsoft Visual Studio 2003 (version 7.1).
+
+ - Evaluate $MSVSPROJECTSUFFIX and $MSVSSOLUTIONSUFFIX when the Builder
+ is invoked, not when the tool is initialized.
+
+ From Christoph Wiedemann:
+
+ - When compiling Qt, make sure the moc_*.cc files are compiled using
+ the flags from the environment used to specify the target, not
+ the environment that first has the Qt Builders attached.
+
+
+
+RELEASE 0.94 - Fri, 07 Nov 2003 05:29:48 -0600
+
+ From Hartmut Goebel:
+
+ - Add several new types of canned functions to help create options:
+ BoolOption(), EnumOption(), ListOption(), PackageOption(),
+ PathOption().
+
+ From Steven Knight:
+
+ - Fix use of CPPDEFINES with C++ source files.
+
+ - Fix env.Append() when the operand is an object with a __cmp__()
+ method (like a Scanner instance).
+
+ - Fix subclassing the Environment and Scanner classes.
+
+ - Add BUILD_TARGETS, COMMAND_LINE_TARGETS and DEFAULT_TARGETS variables.
+
+ From Steve Leblanc:
+
+ - SGI fixes: Fix C++ compilation, add a separate Tool/sgic++.py module.
+
+ From Gary Oberbrunner:
+
+ - Fix how the man page un-indents after examples in some browsers.
+
+ From Vincent Risi:
+
+ - Fix the C and C++ tool specifications for AIX.
+
+
+
+RELEASE 0.93 - Thu, 23 Oct 2003 07:26:55 -0500
+
+ From J.T. Conklin:
+
+ - On POSIX, execute commands with the more modern os.spawnvpe()
+ function, if it's available.
+
+ - Scan .S, .spp and .SPP files for C preprocessor dependencies.
+
+ - Refactor the Job.Parallel() class to use a thread pool without a
+ condition variable. This improves parallel build performance and
+ handles keyboard interrupts properly when -j is used.
+
+ From Charles Crain:
+
+ - Add support for a JARCHDIR variable to control changing to a
+ directory using the jar -C option.
+
+ - Add support for detecting Java manifest files when using jar,
+ and specifying them using the jar m flag.
+
+ - Fix some Python 2.2 specific things in various tool modules.
+
+ - Support directories as build sources, so that a rebuild of a target
+ can be triggered if anything underneath the directory changes.
+
+ - Have the scons.bat and scons.py files look for the SCons modules
+ in site-packages as well.
+
+ From Christian Engel:
+
+ - Support more flexible inclusion of separate C and C++ compilers.
+
+ - Use package management tools on AIX and Solaris to find where
+ the comilers are installed, and what version they are.
+
+ - Add support for CCVERSION and CXXVERSION variables for a number
+ of C and C++ compilers.
+
+ From Sergey Fogel:
+
+ - Add test cases for the new capabilities to run bibtex and to rerun
+ latex as needed.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Accomodate anydbm modules that don't have a sync() method.
+
+ - Allow SConsignFile() to take an argument specifying the DBM
+ module to be used.
+
+ From Stephen Kennedy:
+
+ - Add support for a configurable global .sconsign.dbm file which
+ can be used to avoid cluttering each directory with an individual
+ .sconsign file.
+
+ From John Johnson:
+
+ - Fix (re-)scanning of dependencies in generated or installed
+ header files.
+
+ From Steven Knight:
+
+ - The -Q option suppressed too many messages; fix it so that it only
+ suppresses the Reading/Building messages.
+
+ - Support #include when there's no space before the opening quote
+ or angle bracket.
+
+ - Accomodate alphanumeric version strings in EnsurePythonVersion().
+
+ - Support arbitrary expansion of construction variables within
+ file and directory arguments to Builder calls and Environment methods.
+
+ - Add Environment-method versions of the following global functions:
+ Action(), AddPostAction(), AddPreAction(), Alias(), Builder(),
+ BuildDir(), CacheDir(), Clean(), Configure(), Default(),
+ EnsurePythonVersion(), EnsureSConsVersion(), Environment(),
+ Exit(), Export(), FindFile(), GetBuildPath(), GetOption(), Help(),
+ Import(), Literal(), Local(), Platform(), Repository(), Scanner(),
+ SConscriptChdir(), SConsignFile(), SetOption(), SourceSignatures(),
+ Split(), TargetSignatures(), Tool(), Value().
+
+ - Add the following global functions that correspond to the same-named
+ Environment methods: AlwaysBuild(), Command(), Depends(), Ignore(),
+ Install(), InstallAs(), Precious(), SideEffect() and SourceCode().
+
+ - Add the following global functions that correspond to the default
+ Builder methods supported by SCons: CFile(), CXXFile(), DVI(), Jar(),
+ Java(), JavaH(), Library(), M4(), MSVSProject(), Object(), PCH(),
+ PDF(), PostScript(), Program(), RES(), RMIC(), SharedLibrary(),
+ SharedObject(), StaticLibrary(), StaticObject(), Tar(), TypeLibrary()
+ and Zip().
+
+ - Rearrange the man page to show construction environment methods and
+ global functions in the same list, and to explain the difference.
+
+ - Alphabetize the explanations of the builder methods in the man page.
+
+ - Rename the Environment.Environment class to Enviroment.Base.
+ Allow the wrapping interface to extend an Environment by using its own
+ subclass of Environment.Base and setting a new Environment.Environment
+ variable as the calling entry point.
+
+ - Deprecate the ParseConfig() global function in favor of a same-named
+ construction environment method.
+
+ - Allow the Environment.WhereIs() method to take explicit path and
+ pathext arguments (like the underlying SCons.Util.WhereIs() function).
+
+ - Remove the long-obsolete {Get,Set}CommandHandler() functions.
+
+ - Enhance env.Append() to suppress null values when appropriate.
+
+ - Fix ParseConfig() so it works regardless of initial construction
+ variable values.
+
+ Extend CheckHeader(), CheckCHeader(), CheckCXXHeader() and
+ CheckLibWithHeader() to accept a list of header files that will be
+ #included in the test. The last one in the list is assumed to be
+ the one being checked for. (Prototype code contributed by Gerard
+ Patel and Niall Douglas).
+
+ - Supply a warning when -j is used and threading isn't built in to
+ the current version of Python.
+
+ - First release of the User's Guide (finally, and despite a lot
+ of things still missing from it...).
+
+ From Clark McGrew:
+
+ - Generalize the action for .tex files so that it will decide whether
+ a file is TeX or LaTeX, check the .aux output to decide if it should
+ run bibtex, and check the .log output to re-run LaTeX if needed.
+
+ From Bram Moolenaar:
+
+ - Split the non-SCons-specific functionality from SConf.py to a new,
+ re-usable Conftest.py module.
+
+ From Gary Oberbrunner:
+
+ - Allow a directory to be the target or source or dependency of a
+ Depends(), Ignore(), Precious() or SideEffect() call.
+
+ From Gerard Patel:
+
+ - Use the %{_mandir} macro when building our RPM package.
+
+ From Marko Rauhamaa:
+
+ - Have the closing message say "...terminated because of errors" if
+ there were any.
+
+ From Anthony Roach:
+
+ - On Win32 systems, only use "rm" to delete files if Cygwin is being
+ used. ("rm" doesn't understand Win32-format path names.)
+
+ From Christoph Wiedemann:
+
+ - Fix test/SWIG.py to find the Python include directory in all cases.
+
+ - Fix a bug in detection of Qt installed on the local system.
+
+ - Support returning Python 2.3 BooleanType values from Configure checks.
+
+ - Provide an error message if someone mistakenly tries to call a
+ Configure check from within a Builder function.
+
+ - Support calling a Builder when a Configure context is still open.
+
+ - Handle interrupts better by eliminating all try:-except: blocks
+ which caught any and all exceptions, including KeyboardInterrupt.
+
+ - Add a --duplicate= option to control how files are duplicated.
+
+
+
+RELEASE 0.92 - Wed, 20 Aug 2003 03:45:28 -0500
+
+ From Charles Crain and Gary Oberbrunner:
+
+ - Fix Tool import problems with the Intel and PharLap linkers.
+
+ From Steven Knight
+
+ - Refactor the DictCmdGenerator class to be a Selector subclass.
+
+ - Allow the DefaultEnvironment() function to take arguments and pass
+ them to instantiation of the default construction environment.
+
+ - Update the Debian package so it uses Python 2.2 and more closely
+ resembles the currently official Debian packaging info.
+
+ From Gerard Patel
+
+ - When the yacc -d flag is used, take the .h file base name from the
+ target .c file, not the source (matching what yacc does).
+
+
+
+RELEASE 0.91 - Thu, 14 Aug 2003 13:00:44 -0500
+
+ From Chad Austin:
+
+ - Support specifying a list of tools when calling Environment.Copy().
+
+ - Give a Value Nodes a timestamp of the system time when they're
+ created, so they'll work when using timestamp-based signatures.
+
+ - Add a DefaultEnvironment() function that only creates a default
+ environment on-demand (for fetching source files, e.g.).
+
+ - Portability fix for test/M4.py.
+
+ From Steven Knight:
+
+ - Tighten up the scons -H help output.
+
+ - When the input yacc file ends in .yy and the -d flag is specified,
+ recognize that a .hpp file (not a .h file) will be created.
+
+ - Make builder prefixes work correctly when deducing a target
+ from a source file name in another directory.
+
+ - Documentation fixes: typo in the man page; explain up-front about
+ not propagating the external environment.
+
+ - Use "cvs co -d" instead of "cvs co -p >" when checking out something
+ from CVS with a specified module name. This avoids zero-length
+ files when there is a checkout error.
+
+ - Add an "sconsign" script to print the contents of .sconsign files.
+
+ - Speed up maintaining the various lists of Node children by using
+ dictionaries to avoid "x in list" searches.
+
+ - Cache the computed list of Node children minus those being Ignored
+ so it's only calculated once.
+
+ - Fix use of the --cache-show option when building a Program()
+ (or using any other arbitrary action) by making sure all Action
+ instances have strfunction() methods.
+
+ - Allow the source of Command() to be a directory.
+
+ - Better error handling of things like raw TypeErrors in SConscripts.
+
+ - When installing using "setup.py install --prefix=", suppress the
+ distutils warning message about adding the (incorrect) library
+ directory to your search path.
+
+ - Correct the spelling of the "validater" option to "validator."
+ Add a DeprecatedWarning when the old spelling is used.
+
+ - Allow a Builder's emitter to be a dictionary that maps source file
+ suffixes to emitter functions, using the suffix of the first file
+ in the source list to pick the right one.
+
+ - Refactor the creation of the Program, *Object and *Library Builders
+ so that they're moved out of SCons.Defaults and created on demand.
+
+ - Don't split SConscript file names on white space.
+
+ - Document the SConscript function's "dirs" and "name" keywords.
+
+ - Remove the internal (and superfluous) SCons.Util.argmunge() function.
+
+ - Add /TP to the default CXXFLAGS for msvc, so it can compile all
+ of the suffixes we use as C++ files.
+
+ - Allow the "prefix" and "suffix" attributes of a Builder to be
+ callable objects that return generated strings, or dictionaries
+ that map a source file suffix to the right prefix/suffix.
+
+ - Support a MAXLINELINELENGTH construction variable on Win32 systems
+ to control when a temporary file is used for long command lines.
+
+ - Make how we build .rpm packages not depend on the installation
+ locations from the distutils being used.
+
+ - When deducing a target Node, create it directly from the first
+ source Node, not by trying to create the right string to pass to
+ arg2nodes().
+
+ - Add support for SWIG.
+
+ From Bram Moolenaar:
+
+ - Test portability fixes for FreeBSD.
+
+ From Gary Oberbrunner:
+
+ - Report the target being built in error messages when building
+ multiple sources from different extensions, or when the target file
+ extension can't be deduced, or when we don't have an action for a
+ file suffix.
+
+ - Provide helpful error messages when the arguments to env.Install()
+ are incorrect.
+
+ - Fix the value returned by the Node.prevsiginfo() method to conform
+ to a previous change when checking whether a node is current.
+
+ - Supply a stack trace if the Taskmaster catches an exception.
+
+ - When using a temporary file for a long link line on Win32 systems,
+ (also) print the command line that is being executed through the
+ temporary file.
+
+ - Initialize the LIB environment variable when using the Intel
+ compiler (icl).
+
+ - Documentation fixes: better explain the AlwaysBuild() function.
+
+ From Laurent Pelecq:
+
+ - When the -debug=pdb option is specified, use pdb.Pdb().runcall() to
+ call pdb directly, don't call Python recursively.
+
+ From Ben Scott:
+
+ - Add support for a platform-independent CPPDEFINES variable.
+
+ From Christoph Wiedemann:
+
+ - Have the g++ Tool actually use g++ in preference to c++.
+
+ - Have the gcc Tool actually use gcc in preference to cc.
+
+ - Add a gnutools.py test of the GNU tool chain.
+
+ - Be smarter about linking: use $CC by default and $CXX only if we're
+ linking with any C++ objects.
+
+ - Avoid SCons hanging when a piped command has a lot of output to read.
+
+ - Add QT support for preprocessing .ui files into .c files.
+
+
+
+RELEASE 0.90 - Wed, 25 Jun 2003 14:24:52 -0500
+
+ From Chad Austin:
+
+ - Fix the _concat() documentation, and add a test for it.
+
+ - Portability fixes for non-GNU versions of lex and yacc.
+
+ From Matt Balvin:
+
+ - Fix handling of library prefixes when the subdirectory matches
+ the prefix.
+
+ From Timothee Bessett:
+
+ - Add an M4 Builder.
+
+ From Charles Crain:
+
+ - Use '.lnk' as the suffix on the temporary file for linking long
+ command lines (necessary for the Phar Lap linkloc linker).
+
+ - Save non-string Options values as their actual type.
+
+ - Save Options string values that contain a single quote correctly.
+
+ - Save any Options values that are changed from the default
+ Environment values, not just ones changed on the command line or in
+ an Options file.
+
+ - Make closing the Options file descriptor exception-safe.
+
+ From Steven Knight:
+
+ - SCons now enforces (with an error) that construction variables
+ must have the same form as valid Python identifiers.
+
+ - Fix man page bugs: remove duplicate AddPostAction() description;
+ document no_import_lib; mention that CPPFLAGS does not contain
+ $_CPPINCFLAGS; mention that F77FLAGS does not contain $_F77INCFLAGS;
+ mention that LINKFLAGS and SHLINKFLAGS contains neither $_LIBFLAGS
+ nor $_LIBDIRFLAGS.
+
+ - Eliminate a dependency on the distutils.fancy_getopt module by
+ copying and pasting its wrap_text() function directly.
+
+ - Make the Script.Options() subclass match the underlying base class
+ implementation.
+
+ - When reporting a target is up to date, quote the target like make
+ (backquote-quote) instead of with double quotes.
+
+ - Fix handling of ../* targets when using -U, -D or -u.
+
+ From Steve Leblanc:
+
+ - Don't update the .sconsign files when run with -n.
+
+ From Gary Oberbrunner:
+
+ - Add support for the Intel C Compiler (icl.exe).
+
+ From Anthony Roach
+
+ - Fix Import('*').
+
+ From David Snopek
+
+ - Fix use of SConf in paths with white space in them.
+
+ - Add CheckFunc and CheckType functionality to SConf.
+
+ - Fix use of SConf with Builders that return a list of nodes.
+
+ From David Snopek and Christoph Wiedemann
+
+ - Fix use of the SConf subsystem with SConscriptChdir().
+
+ From Greg Spencer
+
+ - Check for the existence of MS Visual Studio on disk before using it,
+ to avoid getting fooled by leftover junk in the registry.
+
+ - Add support for MSVC++ .NET.
+
+ - Add support for MS Visual Studio project files (DSP, DSW,
+ SLN and VCPROJ files).
+
+ From Christoph Wiedemann
+
+ - SConf now works correctly when the -n and -q options are used.
+
+
+
+RELEASE 0.14 - Wed, 21 May 2003 05:16:32 -0500
+
+ From Chad Austin:
+
+ - Use .dll (not .so) for shared libraries on Cygwin; use -fPIC
+ when compiling them.
+
+ - Use 'rm' to remove files under Cygwin.
+
+ - Add a PLATFORM variable to construction environments.
+
+ - Remove the "platform" argument from tool specifications.
+
+ - Propogate PYTHONPATH when running the regression tests so distutils
+ can be found in non-standard locations.
+
+ - Using MSVC long command-line linking when running Cygwin.
+
+ - Portability fixes for a lot of tests.
+
+ - Add a Value Node class for dependencies on in-core Python values.
+
+ From Allen Bierbaum:
+
+ - Pass an Environment to the Options validator method, and
+ add an Options.Save() method.
+
+ From Steve Christensen:
+
+ - Add an optional sort function argument to the GenerateHelpText()
+ Options function.
+
+ - Evaluate the "varlist" variables when computing the signature of a
+ function action.
+
+ From Charles Crain:
+
+ - Parse the source .java files for class names (including inner class
+ names) to figure out the target .class files that will be created.
+
+ - Make Java support work with Repositories and SConscriptChdir(0).
+
+ - Pass Nodes, not strings, to Builder emitter functions.
+
+ - Refactor command-line interpolation and signature calculation
+ so we can use real Node attributes.
+
+ From Steven Knight:
+
+ - Add Java support (javac, javah, jar and rmic).
+
+ - Propagate the external SYSTEMROOT environment variable into ENV on
+ Win32 systems, so external commands that use sockets will work.
+
+ - Add a .posix attribute to PathList expansions.
+
+ - Check out CVS source files using POSIX path names (forward slashes
+ as separators) even on Win32.
+
+ - Add Node.clear() and Node.FS.Entry.clear() methods to wipe out a
+ Node's state, allowing it to be re-evaluated by continuous
+ integration build interfaces.
+
+ - Change the name of the Set{Build,Content}SignatureType() functions
+ to {Target,Source}Signatures(). Deprecate the old names but support
+ them for backwards compatibility.
+
+ - Add internal SCons.Node.FS.{Dir,File}.Entry() methods.
+
+ - Interpolate the null string if an out-of-range subscript is used
+ for a construction variable.
+
+ - Fix the internal Link function so that it properly links or copies
+ files in subsidiary BuildDir directories.
+
+ - Refactor the internal representation of a single execution instance
+ of an action to eliminate redundant signature calculations.
+
+ - Eliminate redundant signature calculations for Nodes.
+
+ - Optimize out calling hasattr() before accessing attributes.
+
+ - Say "Cleaning targets" (not "Building...") when the -c option is
+ used.
+
+ From Damyan Pepper:
+
+ - Quote the "Entering directory" message like Make.
+
+ From Stefan Reichor:
+
+ - Add support for using Ghostscript to convert Postscript to PDF files.
+
+ From Anthony Roach:
+
+ - Add a standalone "Alias" function (separate from an Environment).
+
+ - Make Export() work for local variables.
+
+ - Support passing a dictionary to Export().
+
+ - Support Import('*') to import everything that's been Export()ed.
+
+ - Fix an undefined exitvalmap on Win32 systems.
+
+ - Support new SetOption() and GetOption() functions for setting
+ various command-line options from with an SConscript file.
+
+ - Deprecate the old SetJobs() and GetJobs() functions in favor of
+ using the new generic {Set,Get}Option() functions.
+
+ - Fix a number of tests that searched for a Fortran compiler using the
+ external PATH instead of what SCons would use.
+
+ - Fix the interaction of SideEffect() and BuildDir() so that (for
+ example) PDB files get put correctly in a BuildDir().
+
+ From David Snopek:
+
+ - Contribute the "Autoscons" code for Autoconf-like checking for
+ the existence of libraries, header files and the like.
+
+ - Have the Tool() function add the tool name to the $TOOLS
+ construction variable.
+
+ From Greg Spencer:
+
+ - Support the C preprocessor #import statement.
+
+ - Allow the SharedLibrary() Builder on Win32 systems to be able to
+ register a newly-built dll using regsvr32.
+
+ - Add a Builder for Windows type library (.tlb) files from IDL files.
+
+ - Add an IDL scanner.
+
+ - Refactor the Fortran, C and IDL scanners to share common logic.
+
+ - Add .srcpath and .srcdir attributes to $TARGET and $SOURCE.
+
+ From Christoph Wiedemann:
+
+ - Integrate David Snopek's "Autoscons" code as the new SConf
+ configuration subsystem, including caching of values between
+ runs (using normal SCons dependency mechanisms), tests, and
+ documentation.
+
+
+
+RELEASE 0.13 - Mon, 31 Mar 2003 20:22:00 -0600
+
+ From Charles Crain:
+
+ - Fix a bug when BuildDir(duplicate=0) is used and SConscript
+ files are called from within other SConscript files.
+
+ - Support (older) versions of Perforce which don't set the Windows
+ registry.
+
+
+
+RELEASE 0.12 - Thu, 27 Mar 2003 23:52:09 -0600
+
+ From Charles Crain:
+
+ - Added support for the Perforce source code management system.
+
+ - Fix str(Node.FS) so that it returns a path relative to the calling
+ SConscript file's directory, not the top-level directory.
+
+ - Added support for a separate src_dir argument to SConscript()
+ that allows explicit specification of where the source files
+ for an SConscript file can be found.
+
+ - Support more easily re-usable flavors of command generators by
+ calling callable variables when strings are expanded.
+
+ From Steven Knight:
+
+ - Added an INSTALL construction variable that can be set to a function
+ to control how the Install() and InstallAs() Builders install files.
+ The default INSTALL function now copies, not links, files.
+
+ - Remove deprecated features: the "name" argument to Builder objects,
+ and the Environment.Update() method.
+
+ - Add an Environment.SourceCode() method to support fetching files
+ from source code systems. Add factory methods that create Builders
+ to support BitKeeper, CVS, RCS, and SCCS. Add support for fetching
+ files from RCS or SCCS transparently (like GNU Make).
+
+ - Make the internal to_String() function more efficient.
+
+ - Make the error message the same as other build errors when there's a
+ problem unlinking a target file in preparation for it being built.
+
+ - Make TARGET, TARGETS, SOURCE and SOURCES reserved variable names and
+ warn if the user tries to set them in a construction environment.
+
+ - Add support for Tar and Zip files.
+
+ - Better documentation of the different ways to export variables to a
+ subsidiary SConscript file. Fix documentation bugs in a tools
+ example, places that still assumed SCons split strings on white
+ space, and typos.
+
+ - Support fetching arbitrary files from the TARGETS or SOURCES lists
+ (e.g. ${SOURCES[2]}) when calculating the build signature of a
+ command.
+
+ - Don't silently swallow exceptions thrown by Scanners (or other
+ exceptions while finding a node's dependent children).
+
+ - Push files to CacheDir() before calling the superclass built()
+ method (which may clear the build signature as part of clearing
+ cached implicit dependencies, if the file has a source scanner).
+ (Bug reported by Jeff Petkau.)
+
+ - Raise an internal error if we attempt to push a file to CacheDir()
+ with a build signature of None.
+
+ - Add an explicit Exit() function for terminating early.
+
+ - Change the documentation to correctly describe that the -f option
+ doesn't change to the directory in which the specified file lives.
+
+ - Support changing directories locally with SConscript directory
+ path names relative to any SConstruct file specified with -f.
+ This allows you to build in another directory by simply changing
+ there and pointing at the SConstruct file in another directory.
+
+ - Change the default SConscriptChdir() behavior to change to the
+ SConscript directory while it's being read.
+
+ - Fix an exception thrown when the -U option was used with no
+ Default() target specified.
+
+ - Fix -u so that it builds things in corresponding build directories
+ when used in a source directory.
+
+ From Lachlan O'Dea:
+
+ - Add SharedObject() support to the masm tool.
+
+ - Fix WhereIs() to return normalized paths.
+
+ From Jeff Petkau:
+
+ - Don't copy a built file to a CacheDir() if it's already there.
+
+ - Avoid partial copies of built files in a CacheDir() by copying
+ to a temporary file and renaming.
+
+ From Anthony Roach:
+
+ - Fix incorrect dependency-cycle errors when an Aliased source doesn't
+ exist.
+
+
+
+RELEASE 0.11 - Tue, 11 Feb 2003 05:24:33 -0600
+
+ From Chad Austin:
+
+ - Add support for IRIX and the SGI MIPSPro tool chain.
+
+ - Support using the MSVC tool chain when running Cygwin Python.
+
+ From Michael Cook:
+
+ - Avoid losing signal bits in the exit status from a command,
+ helping terminate builds on interrupt (CTRL+C).
+
+ From Charles Crain:
+
+ - Added new AddPreAction() and AddPostAction() functions that support
+ taking additional actions before or after building specific targets.
+
+ - Add support for the PharLap ETS tool chain.
+
+ From Steven Knight:
+
+ - Allow Python function Actions to specify a list of construction
+ variables that should be included in the Action's signature.
+
+ - Allow libraries in the LIBS variable to explicitly include the prefix
+ and suffix, even when using the GNU linker.
+ (Bug reported by Neal Becker.)
+
+ - Use DOS-standard CR-LF line endings in the scons.bat file.
+ (Bug reported by Gary Ruben.)
+
+ - Doc changes: Eliminate description of deprecated "name" keyword
+ argument from Builder definition (reported by Gary Ruben).
+
+ - Support using env.Append() on BUILDERS (and other dictionaries).
+ (Bug reported by Bj=F6rn Bylander.)
+
+ - Setting the BUILDERS construction variable now properly clears
+ the previous Builder attributes from the construction Environment.
+ (Bug reported by Bj=F6rn Bylander.)
+
+ - Fix adding a prefix to a file when the target isn't specified.
+ (Bug reported by Esa Ilari Vuokko.)
+
+ - Clean up error messages from problems duplicating into read-only
+ BuildDir directories or into read-only files.
+
+ - Add a CommandAction.strfunction() method, and add an "env" argument
+ to the FunctionAction.strfunction() method, so that all Action
+ objects have strfunction() methods, and the functions for building
+ and returning a string both take the same arguments.
+
+ - Add support for new CacheDir() functionality to share derived files
+ between builds, with related options --cache-disable, --cache-force,
+ and --cache-show.
+
+ - Change the default behavior when no targets are specified to build
+ everything in the current directory and below (like Make). This
+ can be disabled by specifying Default(None) in an SConscript.
+
+ - Revamp SCons installation to fix a case-sensitive installation
+ on Win32 systems, and to add SCons-specific --standard-lib,
+ --standalone-lib, and --version-lib options for easier user
+ control of where the libraries get installed.
+
+ - Fix the ability to directly import and use Platform and Tool modules
+ that have been implicitly imported into an Environment().
+
+ - Add support for allowing an embedding interface to annotate a node
+ when it's created.
+
+ - Extend the SConscript() function to accept build_dir and duplicate
+ keyword arguments that function like a BuildDir() call.
+
+ From Steve Leblanc:
+
+ - Fix the output of -c -n when directories are involved, so it
+ matches -c.
+
+ From Anthony Roach:
+
+ - Use a different shared object suffix (.os) when using gcc so shared
+ and static objects can exist side-by-side in the same directory.
+
+ - Allow the same object files on Win32 to be linked into either
+ shared or static libraries.
+
+ - Cache implicit cache values when using --implicit-cache.
+
+
+
+RELEASE 0.10 - Thu, 16 Jan 2003 04:11:46 -0600
+
+ From Derrick 'dman' Hudson:
+
+ - Support Repositories on other file systems by symlinking or
+ copying files when hard linking won't work.
+
+ From Steven Knight:
+
+ - Remove Python bytecode (*.pyc) files from the scons-local packages.
+
+ - Have FunctionActions print a description of what they're doing
+ (a representation of the Python call).
+
+ - Fix the Install() method so that, like other actions, it prints
+ what would have happened when the -n option is used.
+
+ - Don't create duplicate source files in a BuildDir when the -n
+ option is used.
+
+ - Refactor the Scanner interface to eliminate unnecessary Scanner
+ calls and make it easier to write efficient scanners.
+
+ - Added a "recursive" flag to Scanner creation that specifies the
+ Scanner should be invoked recursively on dependency files returned
+ by the scanner.
+
+ - Significant performance improvement from using a more efficient
+ check, throughout the code, for whether a Node has a Builder.
+
+ - Fix specifying only the source file to MultiStepBuilders such as
+ the Program Builder. (Bug reported by Dean Bair.)
+
+ - Fix an exception when building from a file with the same basename as
+ the subdirectory in which it lives. (Bug reported by Gerard Patel.)
+
+ - Fix automatic deduction of a target file name when there are
+ multiple source files specified; the target is now deduced from just
+ the first source file in the list.
+
+ - Documentation fixes: better initial explanation of SConscript files;
+ fix a misformatted "table" in the StaticObject explanation.
+
+ From Steven Knight and Steve Leblanc:
+
+ - Fix the -c option so it will remove symlinks.
+
+ From Steve Leblanc:
+
+ - Add a Clean() method to support removing user-specified targets
+ when using the -c option.
+
+ - Add a development script for running SCons through PyChecker.
+
+ - Clean up things found by PyChecker (mostly unnecessary imports).
+
+ - Add a script to use HappyDoc to create HTML class documentation.
+
+ From Lachlan O'Dea:
+
+ - Make the Environment.get() method return None by default.
+
+ From Anthony Roach:
+
+ - Add SetJobs() and GetJobs() methods to allow configuration of the
+ number of default jobs (still overridden by -j).
+
+ - Convert the .sconsign file format from ASCII to a pickled Python
+ data structure.
+
+ - Error message cleanups: Made consistent the format of error
+ messages (now all start with "scons: ***") and warning messages (now
+ all start with "scons: warning:"). Caught more cases with the "Do
+ not know how to build" error message.
+
+ - Added support for the MinGW tool chain.
+
+ - Added a --debug=includes option.
+
+
+
+RELEASE 0.09 - Thu, 5 Dec 2002 04:48:25 -0600
+
+ From Chad Austin:
+
+ - Add a Prepend() method to Environments, to append values to
+ the beginning of construction variables.
+
+ From Matt Balvin:
+
+ - Add long command-line support to the "lib" Tool (Microsoft library
+ archiver), too.
+
+ From Charles Crain:
+
+ - Allow $$ in a string to be passed through as $.
+
+ - Support file names with odd characters in them.
+
+ - Add support for construction variable substition on scanner
+ directories (in CPPPATH, F77PATH, LIBPATH, etc.).
+
+ From Charles Crain and Steven Knight:
+
+ - Add Repository() functionality, including the -Y option.
+
+ From Steven Knight:
+
+ - Fix auto-deduction of target names so that deduced targets end
+ up in the same subdirectory as the source.
+
+ - Don't remove source files specified on the command line!
+
+ - Suport the Intel Fortran Compiler (ifl.exe).
+
+ - Supply an error message if there are no command-line or
+ Default() targets specified.
+
+ - Fix the ASPPCOM values for the GNU assembler.
+ (Bug reported by Brett Polivka.)
+
+ - Fix an exception thrown when a Default() directory was specified
+ when using the -U option.
+
+ - Issue a warning when -c can't remove a target.
+
+ - Eliminate unnecessary Scanner calls by checking for the
+ existence of a file before scanning it. (This adds a generic
+ hook to check an arbitrary condition before scanning.)
+
+ - Add explicit messages to tell when we're "Reading SConscript files
+ ...," "done reading SConscript files," "Building targets," and
+ "done building targets." Add a -Q option to supress these.
+
+ - Add separate $SHOBJPREFIX and $SHOBJSUFFIX construction variables
+ (by default, the same as $OBJPREFIX and $OBJSUFFIX).
+
+ - Add Make-like error messages when asked to build a source file,
+ and before trying to build a file that doesn't have all its source
+ files (including when an invalid drive letter is used on WIN32).
+
+ - Add an scons-local-{version} package (in both .tar.gz and .zip
+ flavors) to help people who want to ship SCons as a stand-alone
+ build tool in their software packages.
+
+ - Prevent SCons from unlinking files in certain situations when
+ the -n option is used.
+
+ - Change the name of Tool/lib.py to Tool/mslib.py.
+
+ From Steven Knight and Anthony Roach:
+
+ - Man page: document the fact that Builder calls return Node objects.
+
+ From Steve LeBlanc:
+
+ - Refactor option processing to use our own version of Greg Ward's
+ Optik module, modified to run under Python 1.5.2.
+
+ - Add a ParseConfig() command to modify an environment based on
+ parsing output from a *-config command.
+
+ From Jeff Petkau:
+
+ - Fix interpretation of '#/../foo' on Win32 systems.
+
+ From Anthony Roach:
+
+ - Fixed use of command lines with spaces in their arguments,
+ and use of Nodes with spaces in their string representation.
+
+ - Make access and modification times of files in a BuildDir match
+ the source file, even when hard linking isn't available.
+
+ - Make -U be case insensitive on Win32 systems.
+
+ - Issue a warning and continue when finding a corrupt .sconsign file.
+
+ - Fix using an alias as a dependency of a target so that if one of the
+ alias' dependencies gets rebuilt, the resulting target will, too.
+
+ - Fix differently ordered targets causing unnecessary rebuilds
+ on case insensitive systems.
+
+ - Use os.system() to execute external commands whenever the "env"
+ utility is available, which is much faster than fork()/exec(),
+ and fixes the -j option on several platforms.
+
+ - Fix use of -j with multiple targets.
+
+ - Add an Options() object for friendlier accomodation of command-
+ line arguments.
+
+ - Add support for Microsoft VC++ precompiled header (.pch) files,
+ debugger (.pdb) files, and resource (.rc) files.
+
+ - Don't compute the $_CPPINCFLAGS, $_F77INCFLAGS, $_LIBFLAGS and
+ $_LIBDIRFLAGS variables each time a command is executed, define
+ them so they're computed only as needed. Add a new _concat
+ function to the Environment that allows people to define their
+ own similar variables.
+
+ - Fix dependency scans when $LIBS is overridden.
+
+ - Add EnsurePythonVersion() and EnsureSConsVersion() functions.
+
+ - Fix the overly-verbose stack trace on ListBuilder build errors.
+
+ - Add a SetContentSignatureType() function, allowing use of file
+ timestamps instead of MD5 signatures.
+
+ - Make -U and Default('source') fail gracefully.
+
+ - Allow the File() and Dir() methods to take a path-name string as
+ the starting directory, in addition to a Dir object.
+
+ - Allow the command handler to be selected via the SPAWN, SHELL
+ and ESCAPE construction variables.
+
+ - Allow construction variables to be overridden when a Builder
+ is called.
+
+ From sam th:
+
+ - Dynamically check for the existence of utilities with which to
+ initialize Environments by default.
+
+
+
+RELEASE 0.08 - Mon, 15 Jul 2002 12:08:51 -0500
+
+ From Charles Crain:
+
+ - Fixed a bug with relative CPPPATH dirs when using BuildDir().
+ (Bug reported by Bob Summerwill.)
+
+ - Added a warnings framework and a --warn option to enable or
+ disable warnings.
+
+ - Make the C scanner warn users if files referenced by #include
+ directives cannot be found and --warn=dependency is specified.
+
+ - The BUILDERS construction variable should now be a dictionary
+ that maps builder names to actions. Existing uses of lists,
+ and the Builder name= keyword argument, generate warnings
+ about use of deprecated features.
+
+ - Removed the "shared" keyword argument from the Object and
+ Library builders.
+
+ - Added separated StaticObject, SharedObject, StaticLibrary and
+ SharedLibrary builders. Made Object and Library synonyms for
+ StaticObject and StaticLibrary, respectively.
+
+ - Add LIBS and LIBPATH dependencies for shared libraries.
+
+ - Removed support for the prefix, suffix and src_suffix arguments
+ to Builder() to be callable functions.
+
+ - Fix handling file names with multiple dots.
+
+ - Allow a build directory to be outside of the SConstruct tree.
+
+ - Add a FindFile() function that searches for a file node with a
+ specified name.
+
+ - Add $CPPFLAGS to the shared-object command lines for g++ and gcc.
+
+ From Charles Crain and Steven Knight:
+
+ - Add a "tools=" keyword argument to Environment instantiation,
+ and a separate Tools() method, for more flexible specification
+ of tool-specific environment changes.
+
+ From Steven Knight:
+
+ - Add a "platform=" keyword argument to Environment instantiation,
+ and a separate Platform() method, for more flexible specification
+ of platform-specific environment changes.
+
+ - Updated README instructions and setup.py code to catch an
+ installation failure from not having distutils installed.
+
+ - Add descriptions to the -H help text for -D, -u and -U so
+ people can tell them apart.
+
+ - Remove the old feature of automatically splitting strings
+ of file names on white space.
+
+ - Add a dependency Scanner for native Fortran "include" statements,
+ using a new "F77PATH" construction variable.
+
+ - Fix C #include scanning to detect file names with characters like
+ '-' in them.
+
+ - Add more specific version / build output to the -v option.
+
+ - Add support for the GNU as, Microsoft masm, and nasm assemblers.
+
+ - Allow the "target" argument to a Builder call to be omitted, in
+ which case the target(s) are deduced from the source file(s) and the
+ Builder's specified suffix.
+
+ - Add a tar archive builder.
+
+ - Add preliminary support for the OS/2 Platform, including the icc
+ and ilink Tools.
+
+ From Jeff Petkau:
+
+ - Fix --implicit-cache if the scanner returns an empty list.
+
+ From Anthony Roach:
+
+ - Add a "multi" keyword argument to Builder creation that specifies
+ it's okay to call the builder multiple times for a target.
+
+ - Set a "multi" on Aliases so multiple calls will append to an Alias.
+
+ - Fix emitter functions' use of path names when using BuildDir or
+ in subdirectories.
+
+ - Fix --implicit-cache causing redundant rebuilds when the header
+ file list changed.
+
+ - Fix --implicit-cache when a file has no implicit dependencies and
+ its source is generated.
+
+ - Make the drive letters on Windows always be the same case, so that
+ changes in the case of drive letters don't cause a rebuild.
+
+ - Fall back to importing the SCons.TimeStamp module if the SCons.MD5
+ module can't be imported.
+
+ - Fix interrupt handling to guarantee that a single interrupt will
+ halt SCons both when using -j and not.
+
+ - Fix .sconsign signature storage so that output files of one build
+ can be safely used as input files to another build.
+
+ - Added a --debug=time option to print SCons execution times.
+
+ - Print an error message if a file can't be unlinked before being
+ built, rather than just silently terminating the build.
+
+ - Add a SideEffect() method that can be used to tell the build
+ engine that a given file is created as a side effect of building
+ a target. A file can be specified as a side effect of more than
+ one build comand, in which case the commands will not be executed
+ simultaneously.
+
+ - Significant performance gains from not using our own version of
+ the inefficient stock os.path.splitext() method, caching source
+ suffix computation, code cleanup in MultiStepBuilder.__call__(),
+ and replicating some logic in scons_subst().
+
+ - Add --implicit-deps-changed and --implicit-deps-unchanged options.
+
+ - Add a GetLaunchDir() function.
+
+ - Add a SetBuildSignatureType() function.
+
+ From Zed Shaw:
+
+ - Add an Append() method to Environments, to append values to
+ construction variables.
+
+ - Change the name of Update() to Replace(). Keep Update() as a
+ deprecated synonym, at least for now.
+
+ From Terrel Shumway:
+
+ - Use a $PYTHON construction variable, initialized to sys.executable,
+ when using Python to build parts of the SCons packages.
+
+ - Use sys.prefix, not sys.exec_prefix, to find pdb.py.
+
+
+
+RELEASE 0.07 - Thu, 2 May 2002 13:37:16 -0500
+
+ From Chad Austin:
+
+ - Changes to build SCons packages on IRIX (and other *NIces).
+
+ - Don't create a directory Node when a file already exists there,
+ and vice versa.
+
+ - Add 'dirs' and 'names' keyword arguments to SConscript for
+ easier specification of subsidiary SConscript files.
+
+ From Charles Crain:
+
+ - Internal cleanup of environment passing to function Actions.
+
+ - Builders can now take arbitrary keyword arguments to create
+ attributes to be passed to: command generator functions,
+ FunctionAction functions, Builder emitter functions (below),
+ and prefix/suffix generator functions (below).
+
+ - Command generator functions can now return ANYTHING that can be
+ converted into an Action (a function, a string, a CommandGenerator
+ instance, even an ActionBase instance).
+
+ - Actions now call get_contents() with the actual target and source
+ nodes used for the build.
+
+ - A new DictCmdGenerator class replaces CompositeBuilder to support
+ more flexible Builder behavior internally.
+
+ - Builders can now take an emitter= keyword argument. An emitter
+ is a function that takes target, source, and env argument, then
+ return a 2-tuple of (new sources, new targets). The emitter is
+ called when the Builder is __call__'ed, allowing a user to modify
+ source and target lists.
+
+ - The prefix, suffix and src_suffix Builder arguments now take a
+ callable as well a string. The callable is passed the Environment
+ and any extra Builder keyword arguments and is expected to return
+ the appropriate prefix or suffix.
+
+ - CommandActions can now be a string, a list of command + argument
+ strings, or a list of commands (strings or lists).
+
+ - Added shared library support. The Object and Library Builders now
+ take a "shared=1" keyword argument to specify that a shared object
+ or shared library should be built. It is an error to try to build
+ static objects into a shared library or vice versa.
+
+ - Win32 support for .def files has been added. Added the Win32-specific
+ construction variables $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
+ $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX. When building a .dll,
+ the new construction variable $WIN32_INSERT_DEF, controls whether
+ the appropriately-named .def file is inserted into the target
+ list (if not already present). A .lib file is always added to
+ a Library build if not present in the list of targets.
+
+ - ListBuilder now passes all targets to the action, not just the first.
+
+ - Fix so that -c now deletes generated yacc .h files.
+
+ - Builder actions and emitter functions can now be initialized, through
+ construction variables, to things other than strings.
+
+ - Make top-relative '#/dir' lookups work like '#dir'.
+
+ - Fix for relative CPPPATH directories in subsidiary SConscript files
+ (broken in 0.06).
+
+ - Add a for_signature argument to command generators, so that
+ generators that need to can return distinct values for the
+ command signature and for executing the command.
+
+ From Alex Jacques:
+
+ - Create a better scons.bat file from a py2bat.py script on the Python
+ mailing list two years ago (modeled after pl2bat.pl).
+
+ From Steven Knight:
+
+ - Fix so that -c -n does *not* remove the targets!
+
+ - Man page: Add a hierarchical libraries + Program example.
+
+ - Support long MSVC linker command lines through a builder action
+ that writes to a temporary file and uses the magic MSVC "link @file"
+ argument syntax if the line is longer than 2K characters.
+
+ - Fix F77 command-line options on Win32 (use /Fo instead of -o).
+
+ - Use the same action to build from .c (lower case) and .C (upper
+ case) files on case-insensitive systems like Win32.
+
+ - Support building a PDF file directly from a TeX or LaTeX file
+ using pdftex or pdflatex.
+
+ - Add a -x option to runtest.py to specify the script being tested.
+ A -X option indicates it's an executable, not a script to feed
+ to the Python interpreter.
+
+ - Add a Split() function (identical to SCons.Util.argmunge()) for use
+ in the next release, when Builders will no longer automatically split
+ strings on white space.
+
+ From Steve Leblanc:
+
+ - Add the SConscriptChdir() method.
+
+ From Anthony Roach:
+
+ - Fix --debug=tree when used with directory targets.
+
+ - Significant internal restructuring of Scanners and Taskmaster.
+
+ - Added new --debug=dtree option.
+
+ - Fixes for --profile option.
+
+ - Performance improvement in construction variable substitution.
+
+ - Implemented caching of content signatures, plus added --max-drift
+ option to control caching.
+
+ - Implemented caching of dependency signatures, enabled by new
+ --implicit-cache option.
+
+ - Added abspath construction variable modifier.
+
+ - Added $SOURCE variable as a synonym for $SOURCES[0].
+
+ - Write out .sconsign files on error or interrupt so intermediate
+ build results are saved.
+
+ - Change the -U option to -D. Make a new -U that builds just the
+ targets from the local SConscript file.
+
+ - Fixed use of sys.path so Python modules can be imported from
+ the SConscript directory.
+
+ - Fix for using Aliases with the -u, -U and -D options.
+
+ - Fix so that Nodes can be passed to SConscript files.
+
+ From Moshe Zadka:
+
+ - Changes for official Debian packaging.
+
+
+
+RELEASE 0.06 - Thu, 28 Mar 2002 01:24:29 -0600
+
+ From Charles Crain:
+
+ - Fix command generators to expand construction variables.
+
+ - Make FunctionAction arguments be Nodes, not strings.
+
+ From Stephen Kennedy:
+
+ - Performance: Use a dictionary, not a list, for a Node's parents.
+
+ From Steven Knight:
+
+ - Add .zip files to the packages we build.
+
+ - Man page: document LIBS, fix a typo, document ARGUMENTS.
+
+ - Added RANLIB and RANLIBFLAGS construction variables. Only use them
+ in ARCOM if there's a "ranlib" program on the system.
+
+ - Add a configurable CFILESUFFIX for the Builder of .l and .y files
+ into C files.
+
+ - Add a CXXFile Builder that turns .ll and .yy files into .cc files
+ (configurable via a CXXFILESUFFIX construction variable).
+
+ - Use the POSIX-standard lex -t flag, not the GNU-specific -o flag.
+ (Bug reported by Russell Christensen.)
+
+ - Fixed an exception when CPPPATH or LIBPATH is a null string.
+ (Bug reported by Richard Kiss.)
+
+ - Add a --profile=FILE option to make profiling SCons easier.
+
+ - Modify the new DVI builder to create .dvi files from LaTeX (.ltx
+ and .latex) files.
+
+ - Add support for Aliases (phony targets).
+
+ - Add a WhereIs() method for searching for path names to executables.
+
+ - Add PDF and PostScript document builders.
+
+ - Add support for compiling Fortran programs from a variety of
+ suffixes (a la GNU Make): .f, .F, .for, .FOR, .fpp and .FPP
+
+ - Support a CPPFLAGS variable on all default commands that use the
+ C preprocessor.
+
+ From Steve Leblanc:
+
+ - Add support for the -U option.
+
+ - Allow CPPPATH, LIBPATH and LIBS to be specified as white-space
+ separated strings.
+
+ - Add a document builder to create .dvi files from TeX (.tex) files.
+
+ From Anthony Roach:
+
+ - Fix: Construction variables with values of 0 were incorrectly
+ interpolated as ''.
+
+ - Support env['VAR'] to fetch construction variable values.
+
+ - Man page: document Precious().
+
+
+
+RELEASE 0.05 - Thu, 21 Feb 2002 16:50:03 -0600
+
+ From Chad Austin:
+
+ - Set PROGSUFFIX to .exe under Cygwin.
+
+ From Charles Crain:
+
+ - Allow a library to specified as a command-line source file, not just
+ in the LIBS construction variable.
+
+ - Compensate for a bug in os.path.normpath() that returns '' for './'
+ on WIN32.
+
+ - More performance optimizations: cache #include lines from files,
+ eliminate unnecessary calls.
+
+ - If a prefix or suffix contains white space, treat the resulting
+ concatenation as separate arguments.
+
+ - Fix irregularities in the way we fetch DevStudio information from
+ the Windows registry, and in our registry error handling.
+
+ From Steven Knight:
+
+ - Flush stdout after print so it intermixes correctly with stderr
+ when redirected.
+
+ - Allow Scanners to return a list of strings, and document how to
+ write your own Scanners.
+
+ - Look up implicit (scanned) dependencies relative to the directory
+ of file being scanned.
+
+ - Make writing .sconsign files more robust by first trying to write
+ to a temp file that gets renamed.
+
+ - Create all of the directories for a list of targets before trying
+ to build any of the targets.
+
+ - WIN32 portability fixes in tests.
+
+ - Allow the list of variables exported to an SConscript file to be
+ a UserList, too.
+
+ - Document the overlooked LIBPATH construction variable.
+ (Bug reported by Eicke Godehardt.)
+
+ - Fix so that Ignore() ignores indirect, implicit dependencies
+ (included files), not just direct dependencies.
+
+ - Put the man page in the Debian distribution.
+
+ - Run HTML docs through tidy to clean up the HTML (for Konqueror).
+
+ - Add preliminary support for Unicode strings.
+
+ - Efficiency: don't scan dependencies more than once during the
+ walk of a tree.
+
+ - Fix the -c option so it doesn't stop removing targets if one doesn't
+ already exist.
+ (Bug reported by Paul Connell.)
+
+ - Fix the --debug=pdb option when run on Windows NT.
+ (Bug reported by Paul Connell.)
+
+ - Add support for the -q option.
+
+ From Steve Leblanc:
+
+ - Add support for the -u option.
+
+ - Add .cc and .hh file suffixes to the C Scanner.
+
+ From Anthony Roach:
+
+ - Make the scons script return an error code on failures.
+
+ - Add support for using code to generate a command to build a target.
+
+
+
+RELEASE 0.04 - Wed, 30 Jan 2002 11:09:42 -0600
+
+ From Charles Crain:
+
+ - Significant performance improvements in the Node.FS and
+ Scanner subsystems.
+
+ - Fix signatures of binary files on Win32 systems.
+
+ - Allow LIBS and LIBPATH to be strings, not just arrays.
+
+ - Print a traceback if a Python-function builder throws an exception.
+
+ From Steven Knight:
+
+ - Fix using a directory as a Default(), and allow Default() to
+ support white space in file names for strings in arrays.
+
+ - Man page updates: corrected some mistakes, documented various
+ missing Environment methods, alphabetized the construction
+ variables and other functions, defined begin and end macros for
+ the example sections, regularized white space separation, fixed
+ the use of Export() in the Multiple Variants example.
+
+ - Function action fixes: None is now a successful return value.
+ Exceptions are now reported. Document function actions.
+
+ - Add 'Action' and 'Scanner' to the global keywords so SConscript
+ files can use them too.
+
+ - Removed the Wrapper class between Nodes and Walkers.
+
+ - Add examples using Library, LIBS, and LIBPATH.
+
+ - The C Scanner now always returns a sorted list of dependencies
+ so order changes don't cause unnecessary rebuilds.
+
+ - Strip $(-$) bracketed text from command lines. Use this to
+ surround $_INCDIRS and $_LIBDIRS so we don't rebuild in response
+ to changes to -I or -L options.
+
+ - Add the Ignore() method to ignore dependencies.
+
+ - Provide an error message when a nonexistent target is specified
+ on the command line.
+
+ - Remove targets before building them, and add an Environment
+ Precious() method to override that.
+
+ - Eliminate redundant calls to the same builder when the target is a
+ list of targets: Add a ListBuilder class that wraps Builders to
+ handle lists atomically. Extend the Task class to support building
+ and updating multiple targets in a single Task. Simplify the
+ interface between Task and Taskmaster.
+
+ - Add a --debug=pdb option to re-run SCons under the Python debugger.
+
+ - Only compute a build signature once for each node.
+
+ - Changes to our sys.path[] manipulation to support installation into
+ an arbitrary --prefix value.
+
+ From Steve Leblanc:
+
+ - Add var=value command-line arguments.
+
+
+
+RELEASE 0.03 - Fri, 11 Jan 2002 01:09:30 -0600
+
+ From Charles Crain:
+
+ - Performance improvements in the Node.FS and Sig.Calculator classes.
+
+ - Add the InstallAs() method.
+
+ - Execute commands through an external interpreter (sh, cmd.exe, or
+ command.com) to handle redirection metacharacters.
+
+ - Allow the user to supply a command handler.
+
+ From Steven Knight:
+
+ - Search both /usr/lib and /usr/local/lib for scons directories by
+ adding them both to sys.path, with whichever is in sys.prefix first.
+
+ - Fix interpreting strings of multiple white-space separated file names
+ as separate file names, allowing prefixes and suffixes to be appended
+ to each individually.
+
+ - Refactor to move CompositeBuilder initialization logic from the
+ factory wrapper to the __init__() method, and allow a Builder to
+ have both an action and a src_builder (or array of them).
+
+ - Refactor BuilderBase.__call__() to separate Node creation/lookup
+ from initialization of the Node's builder information.
+
+ - Add a CFile Builder object that supports turning lex (.l) and
+ yacc (.y) files into .c files.
+
+ - Document: variable interpretation attributes; how to propogate
+ the user's environment variables to executed commands; how to
+ build variants in multiple BuildDirs.
+
+ - Collect String, Dict, and List type-checking in common utility
+ routines so we can accept User{String,Dict,List}s all over.
+
+ - Put the Action factory and classes into their own module.
+
+ - Use one CPlusPlusAction in the Object Builder's action dictionary,
+ instead of letting it create multiple identical instances.
+
+ - Document the Install() and InstallAs() methods.
+
+ From Steve Leblanc:
+
+ - Require that a Builder be given a name argument, supplying a
+ useful error message when it isn't.
+
+ From Anthony Roach:
+
+ - Add a "duplicate" keyword argument to BuildDir() that can be set
+ to prevent linking/copying source files into build directories.
+
+ - Add a "--debug=tree" option to print an ASCII dependency tree.
+
+ - Fetch the location of the Microsoft Visual C++ compiler(s) from
+ the Registry, instead of hard-coding the location.
+
+ - Made Scanner objects take Nodes, not path names.
+
+ - Have the C Scanner cache the #include file names instead of
+ (re-)scanning the file each time it's called.
+
+ - Created a separate class for parent "nodes" of file system roots,
+ eliminating the need for separate is-parent-null checks everywhere.
+
+ - Removed defined __hash__() and __cmp() methods from FS.Entry, in
+ favor of Python's more efficient built-in identity comparisons.
+
+
+
+RELEASE 0.02 - Sun, 23 Dec 2001 19:05:09 -0600
+
+ From Charles Crain:
+
+ - Added the Install(), BuildDir(), and Export() methods.
+
+ - Fix the -C option by delaying setting the top of the FS tree.
+
+ - Avoid putting the directory path on the libraries in the LIBS
+ construction variable.
+
+ - Added a GetBuildPath() method to return the full path to the
+ Node for a specified string.
+
+ - Fixed variable substitution in CPPPATH and LIBPATH.
+
+ From Steven Knight:
+
+ - Fixed the version comment in the scons.bat (the UNIX geek used
+ # instead of @rem).
+
+ - Fix to setup.py so it doesn't require a sys.argv[1] argument.
+
+ - Provide make-like warning message for "command not found" and
+ similar errors.
+
+ - Added an EXAMPLES section to the man page.
+
+ - Make Default() targets properly relative to their SConscript
+ file's subdirectory.
+
+ From Anthony Roach:
+
+ - Documented CXXFLAGS, CXXCOM, and CPPPATH.
+
+ - Fixed SCONS_LIB_DIR to work as documented.
+
+ - Made Default() accept Nodes as arguments.
+
+ - Changed Export() to make it easier to use.
+
+ - Added the Import() and Return() methods.
+
+
+
+RELEASE 0.01 - Thu Dec 13 19:25:23 CST 2001
+
+A brief overview of important functionality available in release 0.01:
+
+ - C and C++ compilation on POSIX and Windows NT.
+
+ - Automatic scanning of C/C++ source files for #include dependencies.
+
+ - Support for building libraries; setting construction variables
+ allows creation of shared libraries.
+
+ - Library and C preprocessor search paths.
+
+ - File changes detected using MD5 signatures.
+
+ - User-definable Builder objects for building files.
+
+ - User-definable Scanner objects for scanning for dependencies.
+
+ - Parallel build (-j) support.
+
+ - Dependency cycles detected.
+
+ - Linux packages available in RPM and Debian format.
+
+ - Windows installer available.
+
+
+
+Copyright (c) 2001 - 2015 The SCons Foundation
+src/CHANGES.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
diff --git a/3rdParty/SCons/scons-LICENSE b/3rdParty/SCons/scons-2.4.0/LICENSE.txt
index 790d971..a0a96a0 100644
--- a/3rdParty/SCons/scons-LICENSE
+++ b/3rdParty/SCons/scons-2.4.0/LICENSE.txt
@@ -1,9 +1,4 @@
- Copyright and license for SCons - a software construction tool
-
- This copyright and license do not apply to any other software
- with which this software may have been included.
-
-Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+Copyright (c) 2001 - 2015 The SCons Foundation
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
diff --git a/3rdParty/SCons/scons-2.4.0/MANIFEST b/3rdParty/SCons/scons-2.4.0/MANIFEST
new file mode 100644
index 0000000..9c6504f
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/MANIFEST
@@ -0,0 +1,211 @@
+CHANGES.txt
+LICENSE.txt
+MANIFEST
+README.txt
+RELEASE.txt
+engine/SCons/Action.py
+engine/SCons/Builder.py
+engine/SCons/CacheDir.py
+engine/SCons/Conftest.py
+engine/SCons/Debug.py
+engine/SCons/Defaults.py
+engine/SCons/Environment.py
+engine/SCons/Errors.py
+engine/SCons/Executor.py
+engine/SCons/Job.py
+engine/SCons/Memoize.py
+engine/SCons/Node/Alias.py
+engine/SCons/Node/FS.py
+engine/SCons/Node/Python.py
+engine/SCons/Node/__init__.py
+engine/SCons/Options/BoolOption.py
+engine/SCons/Options/EnumOption.py
+engine/SCons/Options/ListOption.py
+engine/SCons/Options/PackageOption.py
+engine/SCons/Options/PathOption.py
+engine/SCons/Options/__init__.py
+engine/SCons/PathList.py
+engine/SCons/Platform/__init__.py
+engine/SCons/Platform/aix.py
+engine/SCons/Platform/cygwin.py
+engine/SCons/Platform/darwin.py
+engine/SCons/Platform/hpux.py
+engine/SCons/Platform/irix.py
+engine/SCons/Platform/os2.py
+engine/SCons/Platform/posix.py
+engine/SCons/Platform/sunos.py
+engine/SCons/Platform/win32.py
+engine/SCons/SConf.py
+engine/SCons/SConsign.py
+engine/SCons/Scanner/C.py
+engine/SCons/Scanner/D.py
+engine/SCons/Scanner/Dir.py
+engine/SCons/Scanner/Fortran.py
+engine/SCons/Scanner/IDL.py
+engine/SCons/Scanner/LaTeX.py
+engine/SCons/Scanner/Prog.py
+engine/SCons/Scanner/RC.py
+engine/SCons/Scanner/__init__.py
+engine/SCons/Script/Interactive.py
+engine/SCons/Script/Main.py
+engine/SCons/Script/SConsOptions.py
+engine/SCons/Script/SConscript.py
+engine/SCons/Script/__init__.py
+engine/SCons/Sig.py
+engine/SCons/Subst.py
+engine/SCons/Taskmaster.py
+engine/SCons/Tool/386asm.py
+engine/SCons/Tool/BitKeeper.py
+engine/SCons/Tool/CVS.py
+engine/SCons/Tool/DCommon.py
+engine/SCons/Tool/FortranCommon.py
+engine/SCons/Tool/GettextCommon.py
+engine/SCons/Tool/JavaCommon.py
+engine/SCons/Tool/MSCommon/__init__.py
+engine/SCons/Tool/MSCommon/arch.py
+engine/SCons/Tool/MSCommon/common.py
+engine/SCons/Tool/MSCommon/netframework.py
+engine/SCons/Tool/MSCommon/sdk.py
+engine/SCons/Tool/MSCommon/vc.py
+engine/SCons/Tool/MSCommon/vs.py
+engine/SCons/Tool/Perforce.py
+engine/SCons/Tool/PharLapCommon.py
+engine/SCons/Tool/RCS.py
+engine/SCons/Tool/SCCS.py
+engine/SCons/Tool/Subversion.py
+engine/SCons/Tool/__init__.py
+engine/SCons/Tool/aixc++.py
+engine/SCons/Tool/aixcc.py
+engine/SCons/Tool/aixf77.py
+engine/SCons/Tool/aixlink.py
+engine/SCons/Tool/applelink.py
+engine/SCons/Tool/ar.py
+engine/SCons/Tool/as.py
+engine/SCons/Tool/bcc32.py
+engine/SCons/Tool/c++.py
+engine/SCons/Tool/cc.py
+engine/SCons/Tool/cvf.py
+engine/SCons/Tool/cyglink.py
+engine/SCons/Tool/default.py
+engine/SCons/Tool/dmd.py
+engine/SCons/Tool/docbook/__init__.py
+engine/SCons/Tool/dvi.py
+engine/SCons/Tool/dvipdf.py
+engine/SCons/Tool/dvips.py
+engine/SCons/Tool/f03.py
+engine/SCons/Tool/f77.py
+engine/SCons/Tool/f90.py
+engine/SCons/Tool/f95.py
+engine/SCons/Tool/filesystem.py
+engine/SCons/Tool/fortran.py
+engine/SCons/Tool/g++.py
+engine/SCons/Tool/g77.py
+engine/SCons/Tool/gas.py
+engine/SCons/Tool/gcc.py
+engine/SCons/Tool/gdc.py
+engine/SCons/Tool/gettext.py
+engine/SCons/Tool/gfortran.py
+engine/SCons/Tool/gnulink.py
+engine/SCons/Tool/gs.py
+engine/SCons/Tool/hpc++.py
+engine/SCons/Tool/hpcc.py
+engine/SCons/Tool/hplink.py
+engine/SCons/Tool/icc.py
+engine/SCons/Tool/icl.py
+engine/SCons/Tool/ifl.py
+engine/SCons/Tool/ifort.py
+engine/SCons/Tool/ilink.py
+engine/SCons/Tool/ilink32.py
+engine/SCons/Tool/install.py
+engine/SCons/Tool/intelc.py
+engine/SCons/Tool/ipkg.py
+engine/SCons/Tool/jar.py
+engine/SCons/Tool/javac.py
+engine/SCons/Tool/javah.py
+engine/SCons/Tool/latex.py
+engine/SCons/Tool/ldc.py
+engine/SCons/Tool/lex.py
+engine/SCons/Tool/link.py
+engine/SCons/Tool/linkloc.py
+engine/SCons/Tool/m4.py
+engine/SCons/Tool/masm.py
+engine/SCons/Tool/midl.py
+engine/SCons/Tool/mingw.py
+engine/SCons/Tool/msgfmt.py
+engine/SCons/Tool/msginit.py
+engine/SCons/Tool/msgmerge.py
+engine/SCons/Tool/mslib.py
+engine/SCons/Tool/mslink.py
+engine/SCons/Tool/mssdk.py
+engine/SCons/Tool/msvc.py
+engine/SCons/Tool/msvs.py
+engine/SCons/Tool/mwcc.py
+engine/SCons/Tool/mwld.py
+engine/SCons/Tool/nasm.py
+engine/SCons/Tool/packaging/__init__.py
+engine/SCons/Tool/packaging/ipk.py
+engine/SCons/Tool/packaging/msi.py
+engine/SCons/Tool/packaging/rpm.py
+engine/SCons/Tool/packaging/src_tarbz2.py
+engine/SCons/Tool/packaging/src_targz.py
+engine/SCons/Tool/packaging/src_zip.py
+engine/SCons/Tool/packaging/tarbz2.py
+engine/SCons/Tool/packaging/targz.py
+engine/SCons/Tool/packaging/zip.py
+engine/SCons/Tool/pdf.py
+engine/SCons/Tool/pdflatex.py
+engine/SCons/Tool/pdftex.py
+engine/SCons/Tool/qt.py
+engine/SCons/Tool/rmic.py
+engine/SCons/Tool/rpcgen.py
+engine/SCons/Tool/rpm.py
+engine/SCons/Tool/rpmutils.py
+engine/SCons/Tool/sgiar.py
+engine/SCons/Tool/sgic++.py
+engine/SCons/Tool/sgicc.py
+engine/SCons/Tool/sgilink.py
+engine/SCons/Tool/sunar.py
+engine/SCons/Tool/sunc++.py
+engine/SCons/Tool/suncc.py
+engine/SCons/Tool/sunf77.py
+engine/SCons/Tool/sunf90.py
+engine/SCons/Tool/sunf95.py
+engine/SCons/Tool/sunlink.py
+engine/SCons/Tool/swig.py
+engine/SCons/Tool/tar.py
+engine/SCons/Tool/tex.py
+engine/SCons/Tool/textfile.py
+engine/SCons/Tool/tlib.py
+engine/SCons/Tool/wix.py
+engine/SCons/Tool/xgettext.py
+engine/SCons/Tool/yacc.py
+engine/SCons/Tool/zip.py
+engine/SCons/Util.py
+engine/SCons/Variables/BoolVariable.py
+engine/SCons/Variables/EnumVariable.py
+engine/SCons/Variables/ListVariable.py
+engine/SCons/Variables/PackageVariable.py
+engine/SCons/Variables/PathVariable.py
+engine/SCons/Variables/__init__.py
+engine/SCons/Warnings.py
+engine/SCons/__init__.py
+engine/SCons/compat/__init__.py
+engine/SCons/compat/_scons_builtins.py
+engine/SCons/compat/_scons_collections.py
+engine/SCons/compat/_scons_dbm.py
+engine/SCons/compat/_scons_hashlib.py
+engine/SCons/compat/_scons_io.py
+engine/SCons/compat/_scons_sets.py
+engine/SCons/compat/_scons_subprocess.py
+engine/SCons/cpp.py
+engine/SCons/dblite.py
+engine/SCons/exitfuncs.py
+scons-time.1
+scons.1
+sconsign.1
+script/scons
+script/scons-time
+script/scons.bat
+script/sconsign
+setup.cfg
+setup.py
diff --git a/3rdParty/SCons/scons-2.4.0/PKG-INFO b/3rdParty/SCons/scons-2.4.0/PKG-INFO
new file mode 100644
index 0000000..7a848af
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/PKG-INFO
@@ -0,0 +1,13 @@
+Metadata-Version: 1.0
+Name: scons
+Version: 2.4.0
+Summary: Open Source next-generation build tool.
+Home-page: http://www.scons.org/
+Author: Steven Knight
+Author-email: knight@baldmt.com
+License: UNKNOWN
+Description: Open Source next-generation build tool.
+ Improved, cross-platform substitute for the classic Make
+ utility. In short, SCons is an easier, more reliable
+ and faster way to build software.
+Platform: UNKNOWN
diff --git a/3rdParty/SCons/scons-2.4.0/README.txt b/3rdParty/SCons/scons-2.4.0/README.txt
new file mode 100644
index 0000000..7f4db66
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/README.txt
@@ -0,0 +1,250 @@
+
+
+ SCons - a software construction tool
+
+ Version 2.4.0
+
+
+This is SCons, a tool for building software (and other files). SCons is
+implemented in Python, and its "configuration files" are actually Python
+scripts, allowing you to use the full power of a real scripting language
+to solve build problems. You do not, however, need to know Python to
+use SCons effectively.
+
+See the RELEASE.txt file for notes about this specific release,
+including known problems. See the CHANGES.txt file for a list of
+changes since the previous release.
+
+
+LATEST VERSION
+==============
+
+Before going further, you can check that this package you have is
+the latest version by checking the SCons download page at:
+
+ http://www.scons.org/download.html
+
+
+EXECUTION REQUIREMENTS
+======================
+
+Running SCons requires Python version 2.7.*. Currently it does not
+run on the Python 3.x release. There should be
+no other dependencies or requirements to run SCons. (There is, however,
+an additional requirement to *install* SCons from this particular
+package; see the next section.)
+
+By default, SCons knows how to search for available programming tools
+on various systems--see the SCons man page for details. You may,
+of course, override the default SCons choices made by appropriate
+configuration of Environment construction variables.
+
+
+INSTALLATION REQUIREMENTS
+=========================
+
+Nothing special.
+
+
+INSTALLATION
+============
+
+Assuming your system satisfies the installation requirements in the
+previous section, install SCons from this package simply by running the
+provided Python-standard setup script as follows:
+
+ # python setup.py install
+
+By default, the above command will do the following:
+
+ -- Install the version-numbered "scons-2.4.0" and "sconsign-2.4.0"
+ scripts in the default system script directory (/usr/bin or
+ C:\Python*\Scripts, for example). This can be disabled by
+ specifying the "--no-version-script" option on the command
+ line.
+
+ -- Install scripts named "scons" and "sconsign" scripts in the
+ default system script directory (/usr/bin or C:\Python*\Scripts,
+ for example). This can be disabled by specifying the
+ "--no-scons-script" option on the command line, which is useful
+ if you want to install and experiment with a new version before
+ making it the default on your system.
+
+ On UNIX or Linux systems, you can have the "scons" and "sconsign"
+ scripts be hard links or symbolic links to the "scons-2.4.0" and
+ "sconsign-2.4.0" scripts by specifying the "--hardlink-scons"
+ or "--symlink-scons" options on the command line.
+
+ -- Install "scons-2.4.0.bat" and "scons.bat" wrapper scripts in the
+ Python prefix directory on Windows (C:\Python*, for example).
+ This can be disabled by specifying the "--no-install-bat" option
+ on the command line.
+
+ On UNIX or Linux systems, the "--install-bat" option may be
+ specified to have "scons-2.4.0.bat" and "scons.bat" files
+ installed in the default system script directory, which is useful
+ if you want to install SCons in a shared file system directory
+ that can be used to execute SCons from both UNIX/Linux and
+ Windows systems.
+
+ -- Install the SCons build engine (a Python module) in an
+ appropriate version-numbered SCons library directory
+ (/usr/lib/scons-2.4.0 or C:\Python*\scons-2.4.0, for example).
+ See below for more options related to installing the build
+ engine library.
+
+ -- Install the troff-format man pages in an appropriate directory
+ on UNIX or Linux systems (/usr/share/man/man1 or /usr/man/man1,
+ for example). This can be disabled by specifying the
+ "--no-install-man" option on the command line. The man pages
+ can be installed on Windows systems by specifying the
+ "--install-man" option on the command line.
+
+Note that, by default, SCons does not install its build engine library
+in the standard Python library directories. If you want to be able to
+use the SCons library modules (the build engine) in other Python
+scripts, specify the "--standard-lib" option on the command line, as
+follows:
+
+ # python setup.py install --standard-lib
+
+This will install the build engine in the standard Python library
+directory (/usr/lib/python*/site-packages or
+C:\Python*\Lib\site-packages).
+
+Alternatively, you can have SCons install its build engine library in a
+hard-coded standalone library directory, instead of the default
+version-numbered directory, by specifying the "--standalone-lib" option
+on the command line, as follows:
+
+ # python setup.py install --standalone-lib
+
+This is usually not recommended, however.
+
+Note that, to install SCons in any of the above system directories,
+you should have system installation privileges (that is, "root" or
+"Administrator") when running the setup.py script. If you don't have
+system installation privileges, you can use the --prefix option to
+specify an alternate installation location, such as your home directory:
+
+ $ python setup.py install --prefix=$HOME
+
+This will install SCons in the appropriate locations relative to
+$HOME--that is, the scons script itself $HOME/bin and the associated
+library in $HOME/lib/scons, for example.
+
+
+DOCUMENTATION
+=============
+
+See the RELEASE.txt file for notes about this specific release,
+including known problems. See the CHANGES.txt file for a list of
+changes since the previous release.
+
+The scons.1 man page is included in this package, and contains a section
+of small examples for getting started using SCons.
+
+Additional documentation for SCons is available at:
+
+ http://www.scons.org/doc.html
+
+
+LICENSING
+=========
+
+SCons is distributed under the MIT license, a full copy of which is
+available in the LICENSE.txt file. The MIT license is an approved Open
+Source license, which means:
+
+ This software is OSI Certified Open Source Software. OSI
+ Certified is a certification mark of the Open Source Initiative.
+
+More information about OSI certifications and Open Source software is
+available at:
+
+ http://www.opensource.org/
+
+
+REPORTING BUGS
+==============
+
+Please report bugs by following the detailed instructions on our Bug
+Submission page:
+
+ http://scons.tigris.org/bug-submission.html
+
+You can also send mail to the SCons developers' mailing list:
+
+ scons-dev@scons.org
+
+But even if you send email to the mailing list please make sure that you
+ALSO submit a bug report to the project page bug tracker, because bug
+reports in email often get overlooked in the general flood of messages.
+
+
+MAILING LISTS
+=============
+
+An active mailing list for users of SCons is available. You may send
+questions or comments to the list at:
+
+ scons-users@scons.org
+
+You may subscribe to the mailing list by sending email to:
+
+ scons-users-join@scons.org
+
+There is also a low-volume mailing list available for announcements
+about SCons. Subscribe by sending email to:
+
+ announce-subscribe@scons.tigris.org
+
+There are other mailing lists available for SCons developers, for
+notification of SCons code changes, and for notification of updated
+bug reports and project documents. Please see our mailing lists page
+for details.
+
+
+DONATIONS
+=========
+
+If you find SCons helpful, please consider making a donation (of cash,
+software, or hardware) to support continued work on the project.
+Information is available at:
+
+ http://www.scons.org/donate.html
+
+
+FOR MORE INFORMATION
+====================
+
+Check the SCons web site at:
+
+ http://www.scons.org/
+
+
+AUTHOR INFO
+===========
+SCons was originally written by Steven Knight, knight at baldmt dot com.
+Since around 2010 it has been maintained by the SCons
+development team, co-managed by Bill Deegan and Gary Oberbrunner, with
+many contributors, including but not at all limited to:
+
+- Chad Austin
+- Dirk Baechle
+- Charles Crain
+- William Deegan
+- Steve Leblanc
+- Rob Managan
+- Greg Noel
+- Gary Oberbrunner
+- Anthony Roach
+- Greg Spencer
+- Tom Tanner
+- Anatoly Techtonik
+- Christoph Wiedemann
+- Russel Winder
+
+\... and many others.
+
+Copyright (c) 2001 - 2015 The SCons Foundation
diff --git a/3rdParty/SCons/scons-2.4.0/RELEASE.txt b/3rdParty/SCons/scons-2.4.0/RELEASE.txt
new file mode 100644
index 0000000..88d176e
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/RELEASE.txt
@@ -0,0 +1,48 @@
+ A new SCons release, 2.4.0, is now available
+ on the SCons download page:
+
+ http://www.scons.org/download.php
+
+ Here is a summary of the changes since 2.3.6:
+
+ NEW FUNCTIONALITY
+
+ - None
+
+ DEPRECATED FUNCTIONALITY
+
+ - None
+
+ CHANGED/ENHANCED EXISTING FUNCTIONALITY
+
+ - None
+
+ FIXES
+
+ - None
+
+ IMPROVEMENTS
+
+ - Switched several core classes to use "slots", to
+ reduce the overall memory consumption in large
+ projects (fixes #2180, #2178, #2198)
+ - Memoizer counting uses decorators now, instead of
+ the old metaclasses approach.
+
+ PACKAGING
+
+ - Added new amd64 windows 64 bit installer
+
+ DOCUMENTATION
+
+ - None
+
+ DEVELOPMENT
+
+ - None
+
+ Thanks to Dirk Baechle, Andrew Featherstone for their contributions to this release.
+ Contributors are listed alphabetically by their last name.
+
+Copyright (c) 2001 - 2015 The SCons Foundation
+src/RELEASE.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Action.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py
index 7cad8a5..7acde46 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Action.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py
@@ -76,7 +76,7 @@ way for wrapping up the functions.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -97,9 +97,7 @@ way for wrapping up the functions.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Action.py 5023 2010/06/14 22:05:46 scons"
-
-import SCons.compat
+__revision__ = "src/engine/SCons/Action.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import dis
import os
@@ -109,9 +107,9 @@ import re
import sys
import subprocess
+import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Errors
-import SCons.Executor
import SCons.Util
import SCons.Subst
@@ -300,8 +298,10 @@ def _actionAppend(act1, act2):
# a single ListAction.
a1 = Action(act1)
a2 = Action(act2)
- if a1 is None or a2 is None:
- raise TypeError("Cannot append %s to %s" % (type(act1), type(act2)))
+ if a1 is None:
+ return a2
+ if a2 is None:
+ return a1
if isinstance(a1, ListAction):
if isinstance(a2, ListAction):
return ListAction(a1.list + a2.list)
@@ -334,7 +334,7 @@ def _do_create_keywords(args, kw):
'You must either pass a string or a callback which '
'accepts (target, source, env) as parameters.')
if len(args) > 1:
- kw['varlist'] = args[1:] + kw['varlist']
+ kw['varlist'] = tuple(SCons.Util.flatten(args[1:])) + kw['varlist']
if kw.get('strfunction', _null) is not _null \
and kw.get('cmdstr', _null) is not _null:
raise SCons.Errors.UserError(
@@ -354,21 +354,6 @@ def _do_create_action(act, kw):
if isinstance(act, ActionBase):
return act
- if is_List(act):
- return CommandAction(act, **kw)
-
- if callable(act):
- try:
- gen = kw['generator']
- del kw['generator']
- except KeyError:
- gen = 0
- if gen:
- action_type = CommandGeneratorAction
- else:
- action_type = FunctionAction
- return action_type(act, kw)
-
if is_String(act):
var=SCons.Util.get_environment_var(act)
if var:
@@ -385,6 +370,26 @@ def _do_create_action(act, kw):
# The list of string commands may include a LazyAction, so we
# reprocess them via _do_create_list_action.
return _do_create_list_action(commands, kw)
+
+ if is_List(act):
+ return CommandAction(act, **kw)
+
+ if callable(act):
+ try:
+ gen = kw['generator']
+ del kw['generator']
+ except KeyError:
+ gen = 0
+ if gen:
+ action_type = CommandGeneratorAction
+ else:
+ action_type = FunctionAction
+ return action_type(act, kw)
+
+ # Catch a common error case with a nice message:
+ if isinstance(act, int) or isinstance(act, float):
+ raise TypeError("Don't know how to create an Action from a number (%s)"%act)
+ # Else fail silently (???)
return None
def _do_create_list_action(act, kw):
@@ -433,7 +438,8 @@ class ActionBase(object):
vl = self.get_varlist(target, source, env)
if is_String(vl): vl = (vl,)
for v in vl:
- result.append(env.subst('${'+v+'}'))
+ # do the subst this way to ignore $(...$) parts:
+ result.append(env.subst_target_source('${'+v+'}', SCons.Subst.SUBST_SIG, target, source))
return ''.join(result)
def __add__(self, other):
@@ -497,7 +503,18 @@ class _ActionAction(ActionBase):
SCons.Util.AddMethod(self, batch_key, 'batch_key')
def print_cmd_line(self, s, target, source, env):
- sys.stdout.write(s + u"\n")
+ # In python 3, and in some of our tests, sys.stdout is
+ # a String io object, and it takes unicode strings only
+ # In other cases it's a regular Python 2.x file object
+ # which takes strings (bytes), and if you pass those a
+ # unicode object they try to decode with 'ascii' codec
+ # which fails if the cmd line has any hi-bit-set chars.
+ # This code assumes s is a regular string, but should
+ # work if it's unicode too.
+ try:
+ sys.stdout.write(unicode(s + "\n"))
+ except UnicodeDecodeError:
+ sys.stdout.write(s + "\n")
def __call__(self, target, source, env,
exitstatfunc=_null,
@@ -523,7 +540,7 @@ class _ActionAction(ActionBase):
if chdir:
save_cwd = os.getcwd()
try:
- chdir = str(chdir.abspath)
+ chdir = str(chdir.get_abspath())
except AttributeError:
if not is_String(chdir):
if executor:
@@ -654,19 +671,19 @@ def _subproc(scons_env, cmd, error = 'ignore', **kw):
kw['env'] = new_env
try:
- #FUTURE return subprocess.Popen(cmd, **kw)
return subprocess.Popen(cmd, **kw)
except EnvironmentError, e:
if error == 'raise': raise
# return a dummy Popen instance that only returns error
class dummyPopen(object):
def __init__(self, e): self.exception = e
- def communicate(self): return ('','')
+ def communicate(self,input=None): return ('','')
def wait(self): return -self.exception.errno
stdin = None
class f(object):
def read(self): return ''
def readline(self): return ''
+ def __iter__(self): return iter(())
stdout = stderr = f()
return dummyPopen(e)
@@ -682,7 +699,7 @@ class CommandAction(_ActionAction):
# factory above does). cmd will be passed to
# Environment.subst_list() for substituting environment
# variables.
- if __debug__: logInstanceCreation(self, 'Action.CommandAction')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandAction')
_ActionAction.__init__(self, **kw)
if is_List(cmd):
@@ -839,7 +856,7 @@ class CommandAction(_ActionAction):
class CommandGeneratorAction(ActionBase):
"""Class for command-generator actions."""
def __init__(self, generator, kw):
- if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandGeneratorAction')
self.generator = generator
self.gen_kw = kw
self.varlist = kw.get('varlist', ())
@@ -883,7 +900,7 @@ class CommandGeneratorAction(ActionBase):
show=_null, execute=_null, chdir=_null, executor=None):
act = self._generate(target, source, env, 0, executor)
if act is None:
- raise UserError("While building `%s': "
+ raise SCons.Errors.UserError("While building `%s': "
"Cannot deduce file extension from source files: %s"
% (repr(list(map(str, target))), repr(list(map(str, source)))))
return act(target, source, env, exitstatfunc, presub,
@@ -928,7 +945,7 @@ class CommandGeneratorAction(ActionBase):
class LazyAction(CommandGeneratorAction, CommandAction):
def __init__(self, var, kw):
- if __debug__: logInstanceCreation(self, 'Action.LazyAction')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.LazyAction')
#FUTURE CommandAction.__init__(self, '${'+var+'}', **kw)
CommandAction.__init__(self, '${'+var+'}', **kw)
self.var = SCons.Util.to_String(var)
@@ -970,7 +987,7 @@ class FunctionAction(_ActionAction):
"""Class for Python function actions."""
def __init__(self, execfunction, kw):
- if __debug__: logInstanceCreation(self, 'Action.FunctionAction')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.FunctionAction')
self.execfunction = execfunction
try:
@@ -1092,7 +1109,7 @@ class FunctionAction(_ActionAction):
class ListAction(ActionBase):
"""Class for lists of other actions."""
def __init__(self, actionlist):
- if __debug__: logInstanceCreation(self, 'Action.ListAction')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.ListAction')
def list_of_actions(x):
if isinstance(x, ActionBase):
return x
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Builder.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py
index 3b4f2e8..4c68d5c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Builder.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py
@@ -76,7 +76,7 @@ There are the following methods for internal use within this module:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -97,17 +97,16 @@ There are the following methods for internal use within this module:
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Builder.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Builder.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import collections
import SCons.Action
+import SCons.Debug
from SCons.Debug import logInstanceCreation
from SCons.Errors import InternalError, UserError
import SCons.Executor
import SCons.Memoize
-import SCons.Node
-import SCons.Node.FS
import SCons.Util
import SCons.Warnings
@@ -225,7 +224,7 @@ class OverrideWarner(collections.UserDict):
"""
def __init__(self, dict):
collections.UserDict.__init__(self, dict)
- if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.OverrideWarner')
self.already_warned = None
def warn(self):
if self.already_warned:
@@ -353,11 +352,6 @@ class BuilderBase(object):
nodes (files) from input nodes (files).
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
- memoizer_counters = []
-
def __init__(self, action = None,
prefix = '',
suffix = '',
@@ -376,7 +370,7 @@ class BuilderBase(object):
src_builder = None,
ensure_suffix = False,
**overrides):
- if __debug__: logInstanceCreation(self, 'Builder.BuilderBase')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.BuilderBase')
self._memo = {}
self.action = action
self.multi = multi
@@ -759,8 +753,7 @@ class BuilderBase(object):
def _get_src_builders_key(self, env):
return id(env)
- memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key))
-
+ @SCons.Memoize.CountDictCall(_get_src_builders_key)
def get_src_builders(self, env):
"""
Returns the list of source Builders for this Builder.
@@ -796,8 +789,7 @@ class BuilderBase(object):
def _subst_src_suffixes_key(self, env):
return id(env)
- memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key))
-
+ @SCons.Memoize.CountDictCall(_subst_src_suffixes_key)
def subst_src_suffixes(self, env):
"""
The suffix list may contain construction variable expansions,
@@ -847,7 +839,7 @@ class CompositeBuilder(SCons.Util.Proxy):
"""
def __init__(self, builder, cmdgen):
- if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.CompositeBuilder')
SCons.Util.Proxy.__init__(self, builder)
# cmdgen should always be an instance of DictCmdGenerator.
@@ -861,7 +853,7 @@ class CompositeBuilder(SCons.Util.Proxy):
self.set_src_suffix(self.cmdgen.src_suffixes())
def is_a_Builder(obj):
- """"Returns True iff the specified obj is one of our Builder classes.
+ """"Returns True if the specified obj is one of our Builder classes.
The test is complicated a bit by the fact that CompositeBuilder
is a proxy, not a subclass of BuilderBase.
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/CacheDir.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py
index 6b2e174..9e3ec6b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/CacheDir.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/CacheDir.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/CacheDir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
CacheDir support
@@ -37,6 +37,7 @@ cache_enabled = True
cache_debug = False
cache_force = False
cache_show = False
+cache_readonly = False
def CacheRetrieveFunc(target, source, env):
t = target[0]
@@ -49,11 +50,11 @@ def CacheRetrieveFunc(target, source, env):
cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile)
if SCons.Action.execute_actions:
if fs.islink(cachefile):
- fs.symlink(fs.readlink(cachefile), t.path)
+ fs.symlink(fs.readlink(cachefile), t.get_internal_path())
else:
- env.copy_from_cache(cachefile, t.path)
+ env.copy_from_cache(cachefile, t.get_internal_path())
st = fs.stat(cachefile)
- fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+ fs.chmod(t.get_internal_path(), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
return 0
def CacheRetrieveString(target, source, env):
@@ -62,7 +63,7 @@ def CacheRetrieveString(target, source, env):
cd = env.get_CacheDir()
cachedir, cachefile = cd.cachepath(t)
if t.fs.exists(cachefile):
- return "Retrieved `%s' from cache" % t.path
+ return "Retrieved `%s' from cache" % t.get_internal_path()
return None
CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString)
@@ -70,6 +71,8 @@ CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString)
CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None)
def CachePushFunc(target, source, env):
+ if cache_readonly: return
+
t = target[0]
if t.nocache:
return
@@ -103,12 +106,12 @@ def CachePushFunc(target, source, env):
raise SCons.Errors.EnvironmentError(msg)
try:
- if fs.islink(t.path):
- fs.symlink(fs.readlink(t.path), tempfile)
+ if fs.islink(t.get_internal_path()):
+ fs.symlink(fs.readlink(t.get_internal_path()), tempfile)
else:
- fs.copy2(t.path, tempfile)
+ fs.copy2(t.get_internal_path(), tempfile)
fs.rename(tempfile, cachefile)
- st = fs.stat(t.path)
+ st = fs.stat(t.get_internal_path())
fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
except EnvironmentError:
# It's possible someone else tried writing the file at the
@@ -150,6 +153,9 @@ class CacheDir(object):
def is_enabled(self):
return (cache_enabled and not self.path is None)
+ def is_readonly(self):
+ return cache_readonly
+
def cachepath(self, node):
"""
"""
@@ -201,7 +207,7 @@ class CacheDir(object):
return False
def push(self, node):
- if not self.is_enabled():
+ if self.is_readonly() or not self.is_enabled():
return
return CachePush(node, [], node.get_build_env())
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Conftest.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py
index 04a6bc2..e9702ff 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Conftest.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py
@@ -156,7 +156,7 @@ def CheckCC(context):
too, so that it can test against non working flags.
"""
- context.Display("Checking whether the C compiler works")
+ context.Display("Checking whether the C compiler works... ")
text = """
int main()
{
@@ -176,7 +176,7 @@ def CheckSHCC(context):
too, so that it can test against non working flags.
"""
- context.Display("Checking whether the (shared) C compiler works")
+ context.Display("Checking whether the (shared) C compiler works... ")
text = """
int foo()
{
@@ -196,7 +196,7 @@ def CheckCXX(context):
too, so that it can test against non working flags.
"""
- context.Display("Checking whether the C++ compiler works")
+ context.Display("Checking whether the C++ compiler works... ")
text = """
int main()
{
@@ -216,7 +216,7 @@ def CheckSHCXX(context):
too, so that it can test against non working flags.
"""
- context.Display("Checking whether the (shared) C++ compiler works")
+ context.Display("Checking whether the (shared) C++ compiler works... ")
text = """
int main()
{
@@ -554,7 +554,7 @@ def CheckDeclaration(context, symbol, includes = None, language = None):
lang, suffix, msg = _lang2suffix(language)
if msg:
- context.Display("Cannot check for declaration %s: %s\n" % (type_name, msg))
+ context.Display("Cannot check for declaration %s: %s\n" % (symbol, msg))
return msg
src = includetext + includes
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Debug.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py
index ec7dbbd..0aa077d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Debug.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py
@@ -6,7 +6,7 @@ needed by most users.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,13 +28,18 @@ needed by most users.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Debug.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Debug.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import sys
import time
import weakref
+import inspect
+# Global variable that gets set to 'True' by the Main script,
+# when the creation of class instances should get tracked.
+track_instances = False
+# List of currently tracked classes
tracked_classes = {}
def logInstanceCreation(instance, name=None):
@@ -42,7 +47,12 @@ def logInstanceCreation(instance, name=None):
name = instance.__class__.__name__
if name not in tracked_classes:
tracked_classes[name] = []
- tracked_classes[name].append(weakref.ref(instance))
+ if hasattr(instance, '__dict__'):
+ tracked_classes[name].append(weakref.ref(instance))
+ else:
+ # weakref doesn't seem to work when the instance
+ # contains only slots...
+ tracked_classes[name].append(instance)
def string_to_classes(s):
if s == '*':
@@ -62,7 +72,10 @@ def listLoggedInstances(classes, file=sys.stdout):
for classname in string_to_classes(classes):
file.write('\n%s:\n' % classname)
for ref in tracked_classes[classname]:
- obj = ref()
+ if inspect.isclass(ref):
+ obj = ref()
+ else:
+ obj = ref
if obj is not None:
file.write(' %s\n' % repr(obj))
@@ -109,14 +122,15 @@ else:
return res[4]
# returns caller's stack
-def caller_stack(*backlist):
+def caller_stack():
import traceback
- if not backlist:
- backlist = [0]
+ tb = traceback.extract_stack()
+ # strip itself and the caller from the output
+ tb = tb[:-2]
result = []
- for back in backlist:
- tb = traceback.extract_stack(limit=3+back)
- key = tb[0][:3]
+ for back in tb:
+ # (filename, line number, function name, text)
+ key = back[:3]
result.append('%s:%d(%s)' % func_shorten(key))
return result
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Defaults.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py
index 8530aa3..b4cbb9a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Defaults.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py
@@ -10,7 +10,7 @@ from distutils.msvccompiler.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -33,7 +33,7 @@ from distutils.msvccompiler.
#
from __future__ import division
-__revision__ = "src/engine/SCons/Defaults.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Defaults.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
@@ -144,6 +144,9 @@ ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR")
CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR")
ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR")
+DAction = SCons.Action.Action("$DCOM", "$DCOMSTR")
+ShDAction = SCons.Action.Action("$SHDCOM", "$SHDCOMSTR")
+
ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR")
ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR")
@@ -178,20 +181,36 @@ def chmod_strfunc(dest, mode):
Chmod = ActionFactory(chmod_func, chmod_strfunc)
-def copy_func(dest, src):
+def copy_func(dest, src, symlinks=True):
+ """
+ If symlinks (is true), then a symbolic link will be
+ shallow copied and recreated as a symbolic link; otherwise, copying
+ a symbolic link will be equivalent to copying the symbolic link's
+ final target regardless of symbolic link depth.
+ """
+
+ dest = str(dest)
+ src = str(src)
+
SCons.Node.FS.invalidate_node_memos(dest)
if SCons.Util.is_List(src) and os.path.isdir(dest):
for file in src:
shutil.copy2(file, dest)
return 0
+ elif os.path.islink(src):
+ if symlinks:
+ return os.symlink(os.readlink(src), dest)
+ else:
+ return copy_func(dest, os.path.realpath(src))
elif os.path.isfile(src):
return shutil.copy2(src, dest)
else:
- return shutil.copytree(src, dest, 1)
+ return shutil.copytree(src, dest, symlinks)
-Copy = ActionFactory(copy_func,
- lambda dest, src: 'Copy("%s", "%s")' % (dest, src),
- convert=str)
+Copy = ActionFactory(
+ copy_func,
+ lambda dest, src, symlinks=True: 'Copy("%s", "%s")' % (dest, src)
+)
def delete_func(dest, must_exist=0):
SCons.Node.FS.invalidate_node_memos(dest)
@@ -199,14 +218,15 @@ def delete_func(dest, must_exist=0):
dest = [dest]
for entry in dest:
entry = str(entry)
- if not must_exist and not os.path.exists(entry):
+ # os.path.exists returns False with broken links that exist
+ entry_exists = os.path.exists(entry) or os.path.islink(entry)
+ if not entry_exists and not must_exist:
continue
- if not os.path.exists(entry) or os.path.isfile(entry):
- os.unlink(entry)
- continue
- else:
+ # os.path.isdir returns True when entry is a link to a dir
+ if os.path.isdir(entry) and not os.path.islink(entry):
shutil.rmtree(entry, 1)
continue
+ os.unlink(entry)
def delete_strfunc(dest, must_exist=0):
return 'Delete(%s)' % get_paths_str(dest)
@@ -320,7 +340,7 @@ def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None):
where it finds them. This is used by tools (like the GNU linker)
that need to turn something like 'libfoo.a' into '-lfoo'.
"""
-
+
if not itms:
return itms
@@ -334,7 +354,7 @@ def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None):
c = env_c
else:
c = _concat_ixes
-
+
stripprefixes = list(map(env.subst, SCons.Util.flatten(stripprefixes)))
stripsuffixes = list(map(env.subst, SCons.Util.flatten(stripsuffixes)))
@@ -372,10 +392,23 @@ def processDefines(defs):
if SCons.Util.is_List(defs):
l = []
for d in defs:
- if SCons.Util.is_List(d) or isinstance(d, tuple):
- l.append(str(d[0]) + '=' + str(d[1]))
- else:
+ if d is None:
+ continue
+ elif SCons.Util.is_List(d) or isinstance(d, tuple):
+ if len(d) >= 2:
+ l.append(str(d[0]) + '=' + str(d[1]))
+ else:
+ l.append(str(d[0]))
+ elif SCons.Util.is_Dict(d):
+ for macro,value in d.iteritems():
+ if value is not None:
+ l.append(str(macro) + '=' + str(value))
+ else:
+ l.append(str(macro))
+ elif SCons.Util.is_String(d):
l.append(str(d))
+ else:
+ raise SCons.Errors.UserError("DEFINE %s is not a list, dict, string or None."%repr(d))
elif SCons.Util.is_Dict(defs):
# The items in a dictionary are stored in random order, but
# if the order of the command-line options changes from
@@ -399,7 +432,7 @@ def _defines(prefix, defs, suffix, env, c=_concat_ixes):
"""
return c(prefix, env.subst_path(processDefines(defs)), suffix, env)
-
+
class NullCmdGenerator(object):
"""This is a callable class that can be used in place of other
command generators if you don't want them to do anything.
@@ -435,7 +468,7 @@ class Variable_Method_Caller(object):
self.method = method
def __call__(self, *args, **kw):
try: 1//0
- except ZeroDivisionError:
+ except ZeroDivisionError:
# Don't start iterating with the current stack-frame to
# prevent creating reference cycles (f_back is safe).
frame = sys.exc_info()[2].tb_frame.f_back
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Environment.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py
index 50a357d..865c821 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Environment.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py
@@ -10,7 +10,7 @@ Environment
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ Environment
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Environment.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Environment.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import copy
@@ -43,6 +43,7 @@ from collections import UserDict
import SCons.Action
import SCons.Builder
+import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Defaults
import SCons.Errors
@@ -72,6 +73,7 @@ CleanTargets = {}
CalculatorArgs = {}
semi_deepcopy = SCons.Util.semi_deepcopy
+semi_deepcopy_dict = SCons.Util.semi_deepcopy_dict
# Pull UserError into the global name space for the benefit of
# Environment().SourceSignatures(), which has some import statements
@@ -303,7 +305,9 @@ class BuilderDict(UserDict):
UserDict.__init__(self, dict)
def __semi_deepcopy__(self):
- return self.__class__(self.data, self.env)
+ # These cannot be copied since they would both modify the same builder object, and indeed
+ # just copying would modify the original builder
+ raise TypeError( 'cannot semi_deepcopy a BuilderDict' )
def __setitem__(self, item, val):
try:
@@ -361,13 +365,10 @@ class SubstitutionEnvironment(object):
class actually becomes useful.)
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
def __init__(self, **kw):
"""Initialization of an underlying SubstitutionEnvironment class.
"""
- if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.SubstitutionEnvironment')
self.fs = SCons.Node.FS.get_default_fs()
self.ans = SCons.Node.Alias.default_ans
self.lookup_list = SCons.Node.arg2nodes_lookups
@@ -649,6 +650,7 @@ class SubstitutionEnvironment(object):
'ASFLAGS' : SCons.Util.CLVar(''),
'CFLAGS' : SCons.Util.CLVar(''),
'CCFLAGS' : SCons.Util.CLVar(''),
+ 'CXXFLAGS' : SCons.Util.CLVar(''),
'CPPDEFINES' : [],
'CPPFLAGS' : SCons.Util.CLVar(''),
'CPPPATH' : [],
@@ -700,7 +702,7 @@ class SubstitutionEnvironment(object):
# -symbolic (linker global binding)
# -R dir (deprecated linker rpath)
# IBM compilers may also accept -qframeworkdir=foo
-
+
params = shlex.split(arg)
append_next_arg_to = None # for multi-word args
for arg in params:
@@ -714,6 +716,9 @@ class SubstitutionEnvironment(object):
t = ('-isysroot', arg)
dict['CCFLAGS'].append(t)
dict['LINKFLAGS'].append(t)
+ elif append_next_arg_to == '-isystem':
+ t = ('-isystem', arg)
+ dict['CCFLAGS'].append(t)
elif append_next_arg_to == '-arch':
t = ('-arch', arg)
dict['CCFLAGS'].append(t)
@@ -723,6 +728,9 @@ class SubstitutionEnvironment(object):
append_next_arg_to = None
elif not arg[0] in ['-', '+']:
dict['LIBS'].append(self.fs.File(arg))
+ elif arg == '-dylib_file':
+ dict['LINKFLAGS'].append(arg)
+ append_next_arg_to = 'LINKFLAGS'
elif arg[:2] == '-L':
if arg[2:]:
dict['LIBPATH'].append(arg[2:])
@@ -766,24 +774,28 @@ class SubstitutionEnvironment(object):
dict['FRAMEWORKPATH'].append(arg[2:])
else:
append_next_arg_to = 'FRAMEWORKPATH'
- elif arg == '-mno-cygwin':
+ elif arg in ['-mno-cygwin',
+ '-pthread',
+ '-openmp',
+ '-fopenmp']:
dict['CCFLAGS'].append(arg)
dict['LINKFLAGS'].append(arg)
elif arg == '-mwindows':
dict['LINKFLAGS'].append(arg)
- elif arg == '-pthread':
- dict['CCFLAGS'].append(arg)
- dict['LINKFLAGS'].append(arg)
elif arg[:5] == '-std=':
- dict['CFLAGS'].append(arg) # C only
+ if arg[5:].find('++')!=-1:
+ key='CXXFLAGS'
+ else:
+ key='CFLAGS'
+ dict[key].append(arg)
elif arg[0] == '+':
dict['CCFLAGS'].append(arg)
dict['LINKFLAGS'].append(arg)
- elif arg in ['-include', '-isysroot', '-arch']:
+ elif arg in ['-include', '-isysroot', '-isystem', '-arch']:
append_next_arg_to = arg
else:
dict['CCFLAGS'].append(arg)
-
+
for arg in flags:
do_parse(arg)
return dict
@@ -847,7 +859,7 @@ class SubstitutionEnvironment(object):
# def MergeShellPaths(self, args, prepend=1):
# """
-# Merge the dict in args into the shell environment in env['ENV'].
+# Merge the dict in args into the shell environment in env['ENV'].
# Shell path elements are appended or prepended according to prepend.
# Uses Pre/AppendENVPath, so it always appends or prepends uniquely.
@@ -887,8 +899,6 @@ class Base(SubstitutionEnvironment):
Environment.
"""
- memoizer_counters = []
-
#######################################################################
# This is THE class for interacting with the SCons build engine,
# and it contains a lot of stuff, so we're going to try to keep this
@@ -920,7 +930,7 @@ class Base(SubstitutionEnvironment):
initialize things in a very specific order that doesn't work
with the much simpler base class initialization.
"""
- if __debug__: logInstanceCreation(self, 'Environment.Base')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.Base')
self._memo = {}
self.fs = SCons.Node.FS.get_default_fs()
self.ans = SCons.Node.Alias.default_ans
@@ -950,14 +960,14 @@ class Base(SubstitutionEnvironment):
platform = SCons.Platform.Platform(platform)
self._dict['PLATFORM'] = str(platform)
platform(self)
-
+
self._dict['HOST_OS'] = self._dict.get('HOST_OS',None)
self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None)
-
+
# Now set defaults for TARGET_{OS|ARCH}
- self._dict['TARGET_OS'] = self._dict.get('HOST_OS',None)
- self._dict['TARGET_ARCH'] = self._dict.get('HOST_ARCH',None)
-
+ self._dict['TARGET_OS'] = self._dict.get('TARGET_OS',None)
+ self._dict['TARGET_ARCH'] = self._dict.get('TARGET_ARCH',None)
+
# Apply the passed-in and customizable variables to the
# environment before calling the tools, because they may use
@@ -1056,8 +1066,7 @@ class Base(SubstitutionEnvironment):
factory = getattr(self.fs, name)
return factory
- memoizer_counters.append(SCons.Memoize.CountValue('_gsm'))
-
+ @SCons.Memoize.CountMethodCall
def _gsm(self):
try:
return self._memo['_gsm']
@@ -1147,11 +1156,16 @@ class Base(SubstitutionEnvironment):
# but Python 1.5.2 apparently doesn't let you use "continue"
# within try:-except: blocks, so we have to nest our code.
try:
+ if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]):
+ self._dict[key] = [self._dict[key]]
orig = self._dict[key]
except KeyError:
# No existing variable in the environment, so just set
# it to the new value.
- self._dict[key] = val
+ if key == 'CPPDEFINES' and SCons.Util.is_String(val):
+ self._dict[key] = [val]
+ else:
+ self._dict[key] = val
else:
try:
# Check if the original looks like a dictionary.
@@ -1188,8 +1202,19 @@ class Base(SubstitutionEnvironment):
# The original looks like a dictionary, so update it
# based on what we think the value looks like.
if SCons.Util.is_List(val):
- for v in val:
- orig[v] = None
+ if key == 'CPPDEFINES':
+ tmp = []
+ for (k, v) in orig.iteritems():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ orig = tmp
+ orig += val
+ self._dict[key] = orig
+ else:
+ for v in val:
+ orig[v] = None
else:
try:
update_dict(val)
@@ -1210,7 +1235,7 @@ class Base(SubstitutionEnvironment):
path = str(self.fs.Dir(path))
return path
- def AppendENVPath(self, name, newpath, envname = 'ENV',
+ def AppendENVPath(self, name, newpath, envname = 'ENV',
sep = os.pathsep, delete_existing=1):
"""Append path elements to the path 'name' in the 'ENV'
dictionary for this environment. Will only add any particular
@@ -1251,8 +1276,46 @@ class Base(SubstitutionEnvironment):
self._dict[key].update(val)
elif SCons.Util.is_List(val):
dk = self._dict[key]
- if not SCons.Util.is_List(dk):
- dk = [dk]
+ if key == 'CPPDEFINES':
+ tmp = []
+ for i in val:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ val = tmp
+ # Construct a list of (key, value) tuples.
+ if SCons.Util.is_Dict(dk):
+ tmp = []
+ for (k, v) in dk.iteritems():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ dk = tmp
+ elif SCons.Util.is_String(dk):
+ dk = [(dk,)]
+ else:
+ tmp = []
+ for i in dk:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ dk = tmp
+ else:
+ if not SCons.Util.is_List(dk):
+ dk = [dk]
if delete_existing:
dk = [x for x in dk if x not in val]
else:
@@ -1261,15 +1324,70 @@ class Base(SubstitutionEnvironment):
else:
dk = self._dict[key]
if SCons.Util.is_List(dk):
- # By elimination, val is not a list. Since dk is a
- # list, wrap val in a list first.
- if delete_existing:
- dk = [x for x in dk if x not in val]
- self._dict[key] = dk + [val]
+ if key == 'CPPDEFINES':
+ tmp = []
+ for i in dk:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ dk = tmp
+ # Construct a list of (key, value) tuples.
+ if SCons.Util.is_Dict(val):
+ tmp = []
+ for (k, v) in val.iteritems():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ val = tmp
+ elif SCons.Util.is_String(val):
+ val = [(val,)]
+ if delete_existing:
+ dk = filter(lambda x, val=val: x not in val, dk)
+ self._dict[key] = dk + val
+ else:
+ dk = [x for x in dk if x not in val]
+ self._dict[key] = dk + val
else:
- if not val in dk:
+ # By elimination, val is not a list. Since dk is a
+ # list, wrap val in a list first.
+ if delete_existing:
+ dk = filter(lambda x, val=val: x not in val, dk)
self._dict[key] = dk + [val]
+ else:
+ if not val in dk:
+ self._dict[key] = dk + [val]
else:
+ if key == 'CPPDEFINES':
+ if SCons.Util.is_String(dk):
+ dk = [dk]
+ elif SCons.Util.is_Dict(dk):
+ tmp = []
+ for (k, v) in dk.iteritems():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ dk = tmp
+ if SCons.Util.is_String(val):
+ if val in dk:
+ val = []
+ else:
+ val = [val]
+ elif SCons.Util.is_Dict(val):
+ tmp = []
+ for i,j in val.iteritems():
+ if j is not None:
+ tmp.append((i,j))
+ else:
+ tmp.append(i)
+ val = tmp
if delete_existing:
dk = [x for x in dk if x not in val]
self._dict[key] = dk + val
@@ -1283,15 +1401,13 @@ class Base(SubstitutionEnvironment):
(like a function). There are no references to any mutable
objects in the original Environment.
"""
- clone = copy.copy(self)
- clone._dict = semi_deepcopy(self._dict)
- try:
- cbd = clone._dict['BUILDERS']
- except KeyError:
- pass
- else:
- clone._dict['BUILDERS'] = BuilderDict(cbd, clone)
+ builders = self._dict.get('BUILDERS', {})
+
+ clone = copy.copy(self)
+ # BUILDERS is not safe to do a simple copy
+ clone._dict = semi_deepcopy_dict(self._dict, ['BUILDERS'])
+ clone._dict['BUILDERS'] = BuilderDict(builders, clone)
# Check the methods added via AddMethod() and re-bind them to
# the cloned environment. Only do this if the attribute hasn't
@@ -1315,12 +1431,12 @@ class Base(SubstitutionEnvironment):
apply_tools(clone, tools, toolpath)
# apply them again in case the tools overwrote them
- clone.Replace(**new)
+ clone.Replace(**new)
# Finally, apply any flags to be merged in
if parse_flags: clone.MergeFlags(parse_flags)
- if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.EnvironmentClone')
return clone
def Copy(self, *args, **kw):
@@ -1406,8 +1522,8 @@ class Base(SubstitutionEnvironment):
def Dump(self, key = None):
"""
- Using the standard Python pretty printer, dump the contents of the
- scons build environment to stdout.
+ Using the standard Python pretty printer, return the contents of the
+ scons build environment as a string.
If the key passed in is anything other than None, then that will
be used as an index into the build environment dictionary and
@@ -1642,7 +1758,7 @@ class Base(SubstitutionEnvironment):
except KeyError:
pass
else:
- kwbd = semi_deepcopy(kwbd)
+ kwbd = BuilderDict(kwbd,self)
del kw['BUILDERS']
self.__setitem__('BUILDERS', kwbd)
kw = copy_non_reserved_keywords(kw)
@@ -1680,7 +1796,7 @@ class Base(SubstitutionEnvironment):
self.Replace(**kw)
def _find_toolpath_dir(self, tp):
- return self.fs.Dir(self.subst(tp)).srcnode().abspath
+ return self.fs.Dir(self.subst(tp)).srcnode().get_abspath()
def Tool(self, tool, toolpath=None, **kw):
if SCons.Util.is_String(tool):
@@ -1708,8 +1824,8 @@ class Base(SubstitutionEnvironment):
pass
elif SCons.Util.is_String(pathext):
pathext = self.subst(pathext)
- prog = self.subst(prog)
- path = SCons.Util.WhereIs(prog, path, pathext, reject)
+ prog = SCons.Util.CLVar(self.subst(prog)) # support "program --with-args"
+ path = SCons.Util.WhereIs(prog[0], path, pathext, reject)
if path: return path
return None
@@ -1958,8 +2074,8 @@ class Base(SubstitutionEnvironment):
else:
return result[0]
- def Glob(self, pattern, ondisk=True, source=False, strings=False):
- return self.fs.Glob(self.subst(pattern), ondisk, source, strings)
+ def Glob(self, pattern, ondisk=True, source=False, strings=False, exclude=None):
+ return self.fs.Glob(self.subst(pattern), ondisk, source, strings, exclude)
def Ignore(self, target, dependency):
"""Ignore a dependency."""
@@ -1992,6 +2108,14 @@ class Base(SubstitutionEnvironment):
t.set_precious()
return tlist
+ def Pseudo(self, *targets):
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_pseudo()
+ return tlist
+
def Repository(self, *dirs, **kw):
dirs = self.arg2nodes(list(dirs), self.fs.Dir)
self.fs.Repository(*dirs, **kw)
@@ -2046,7 +2170,7 @@ class Base(SubstitutionEnvironment):
def SourceCode(self, entry, builder):
"""Arrange for a source code builder for (part of) a tree."""
msg = """SourceCode() has been deprecated and there is no replacement.
-\tIf you need this function, please contact dev@scons.tigris.org."""
+\tIf you need this function, please contact scons-dev@scons.org"""
SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceCodeWarning, msg)
entries = self.arg2nodes(entry, self.fs.Entry)
for entry in entries:
@@ -2137,14 +2261,11 @@ class Base(SubstitutionEnvironment):
sources.append(s)
build_source(node.all_children())
- # THIS CODE APPEARS TO HAVE NO EFFECT
- # # get the final srcnode for all nodes, this means stripping any
- # # attached build node by calling the srcnode function
- # for file in sources:
- # srcnode = file.srcnode()
- # while srcnode != file.srcnode():
- # srcnode = file.srcnode()
-
+ def final_source(node):
+ while (node != node.srcnode()):
+ node = node.srcnode()
+ return node
+ sources = map( final_source, sources );
# remove duplicates
return list(set(sources))
@@ -2156,6 +2277,7 @@ class Base(SubstitutionEnvironment):
install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES)
return install._UNIQUE_INSTALLED_FILES
+
class OverrideEnvironment(Base):
"""A proxy that overrides variables in a wrapped construction
environment by returning values from an overrides dictionary in
@@ -2178,7 +2300,7 @@ class OverrideEnvironment(Base):
"""
def __init__(self, subject, overrides={}):
- if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.OverrideEnvironment')
self.__dict__['__subject'] = subject
self.__dict__['overrides'] = overrides
@@ -2285,6 +2407,12 @@ def NoSubstitutionProxy(subject):
return getattr(self.__dict__['__subject'], name)
def __setattr__(self, name, value):
return setattr(self.__dict__['__subject'], name, value)
+ def executor_to_lvars(self, kwdict):
+ if kwdict.has_key('executor'):
+ kwdict['lvars'] = kwdict['executor'].get_lvars()
+ del kwdict['executor']
+ else:
+ kwdict['lvars'] = {}
def raw_to_mode(self, dict):
try:
raw = dict['raw']
@@ -2301,12 +2429,14 @@ def NoSubstitutionProxy(subject):
nargs = (string, self,) + args
nkw = kwargs.copy()
nkw['gvars'] = {}
+ self.executor_to_lvars(nkw)
self.raw_to_mode(nkw)
return SCons.Subst.scons_subst_list(*nargs, **nkw)
def subst_target_source(self, string, *args, **kwargs):
nargs = (string, self,) + args
nkw = kwargs.copy()
nkw['gvars'] = {}
+ self.executor_to_lvars(nkw)
self.raw_to_mode(nkw)
return SCons.Subst.scons_subst(*nargs, **nkw)
return _NoSubstitutionProxy(subject)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Errors.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py
index 542bc47..998a70d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Errors.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,7 +28,7 @@ and user errors in SCons.
"""
-__revision__ = "src/engine/SCons/Errors.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Errors.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Executor.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py
index 7bb450a..3211fd1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Executor.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py
@@ -6,7 +6,7 @@ Nodes.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,10 +27,11 @@ Nodes.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Executor.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Executor.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import collections
+import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Errors
import SCons.Memoize
@@ -39,6 +40,10 @@ import SCons.Memoize
class Batch(object):
"""Remembers exact association between targets
and sources of executor."""
+
+ __slots__ = ('targets',
+ 'sources')
+
def __init__(self, targets=[], sources=[]):
self.targets = targets
self.sources = sources
@@ -108,6 +113,48 @@ def rfile(node):
return rfile()
+def execute_nothing(obj, target, kw):
+ return 0
+
+def execute_action_list(obj, target, kw):
+ """Actually execute the action list."""
+ env = obj.get_build_env()
+ kw = obj.get_kw(kw)
+ status = 0
+ for act in obj.get_action_list():
+ #args = (self.get_all_targets(), self.get_all_sources(), env)
+ args = ([], [], env)
+ status = act(*args, **kw)
+ if isinstance(status, SCons.Errors.BuildError):
+ status.executor = obj
+ raise status
+ elif status:
+ msg = "Error %s" % status
+ raise SCons.Errors.BuildError(
+ errstr=msg,
+ node=obj.batches[0].targets,
+ executor=obj,
+ action=act)
+ return status
+
+_do_execute_map = {0 : execute_nothing,
+ 1 : execute_action_list}
+
+
+def execute_actions_str(obj):
+ env = obj.get_build_env()
+ return "\n".join([action.genstring(obj.get_all_targets(),
+ obj.get_all_sources(),
+ env)
+ for action in obj.get_action_list()])
+
+def execute_null_str(obj):
+ return ''
+
+_execute_str_map = {0 : execute_null_str,
+ 1 : execute_actions_str}
+
+
class Executor(object):
"""A class for controlling instances of executing an action.
@@ -116,14 +163,25 @@ class Executor(object):
and sources for later processing as needed.
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
- memoizer_counters = []
+ __slots__ = ('pre_actions',
+ 'post_actions',
+ 'env',
+ 'overridelist',
+ 'batches',
+ 'builder_kw',
+ '_memo',
+ 'lvars',
+ '_changed_sources_list',
+ '_changed_targets_list',
+ '_unchanged_sources_list',
+ '_unchanged_targets_list',
+ 'action_list',
+ '_do_execute',
+ '_execute_str')
def __init__(self, action, env=None, overridelist=[{}],
targets=[], sources=[], builder_kw={}):
- if __debug__: logInstanceCreation(self, 'Executor.Executor')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Executor')
self.set_action_list(action)
self.pre_actions = []
self.post_actions = []
@@ -134,6 +192,8 @@ class Executor(object):
else:
self.batches = []
self.builder_kw = builder_kw
+ self._do_execute = 1
+ self._execute_str = 1
self._memo = {}
def get_lvars(self):
@@ -229,6 +289,8 @@ class Executor(object):
self.action_list = action
def get_action_list(self):
+ if self.action_list is None:
+ return []
return self.pre_actions + self.action_list + self.post_actions
def get_all_targets(self):
@@ -267,7 +329,8 @@ class Executor(object):
"""
result = SCons.Util.UniqueList([])
for target in self.get_all_targets():
- result.extend(target.prerequisites)
+ if target.prerequisites is not None:
+ result.extend(target.prerequisites)
return result
def get_action_side_effects(self):
@@ -280,8 +343,7 @@ class Executor(object):
result.extend(target.side_effects)
return result
- memoizer_counters.append(SCons.Memoize.CountValue('get_build_env'))
-
+ @SCons.Memoize.CountMethodCall
def get_build_env(self):
"""Fetch or create the appropriate build Environment
for this Executor.
@@ -326,36 +388,12 @@ class Executor(object):
result['executor'] = self
return result
- def do_nothing(self, target, kw):
- return 0
-
- def do_execute(self, target, kw):
- """Actually execute the action list."""
- env = self.get_build_env()
- kw = self.get_kw(kw)
- status = 0
- for act in self.get_action_list():
- #args = (self.get_all_targets(), self.get_all_sources(), env)
- args = ([], [], env)
- status = act(*args, **kw)
- if isinstance(status, SCons.Errors.BuildError):
- status.executor = self
- raise status
- elif status:
- msg = "Error %s" % status
- raise SCons.Errors.BuildError(
- errstr=msg,
- node=self.batches[0].targets,
- executor=self,
- action=act)
- return status
-
# use extra indirection because with new-style objects (Python 2.2
# and above) we can't override special methods, and nullify() needs
# to be able to do this.
def __call__(self, target, **kw):
- return self.do_execute(target, kw)
+ return _do_execute_map[self._do_execute](self, target, kw)
def cleanup(self):
self._memo = {}
@@ -399,24 +437,15 @@ class Executor(object):
# another extra indirection for new-style objects and nullify...
- def my_str(self):
- env = self.get_build_env()
- return "\n".join([action.genstring(self.get_all_targets(),
- self.get_all_sources(),
- env)
- for action in self.get_action_list()])
-
-
def __str__(self):
- return self.my_str()
+ return _execute_str_map[self._execute_str](self)
def nullify(self):
self.cleanup()
- self.do_execute = self.do_nothing
- self.my_str = lambda: ''
-
- memoizer_counters.append(SCons.Memoize.CountValue('get_contents'))
+ self._do_execute = 0
+ self._execute_str = 0
+ @SCons.Memoize.CountMethodCall
def get_contents(self):
"""Fetch the signature contents. This is the main reason this
class exists, so we can compute this once and cache it regardless
@@ -489,8 +518,7 @@ class Executor(object):
def _get_unignored_sources_key(self, node, ignore=()):
return (node,) + tuple(ignore)
- memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key))
-
+ @SCons.Memoize.CountDictCall(_get_unignored_sources_key)
def get_unignored_sources(self, node, ignore=()):
key = (node,) + tuple(ignore)
try:
@@ -550,19 +578,20 @@ def AddBatchExecutor(key, executor):
nullenv = None
+import SCons.Util
+class NullEnvironment(SCons.Util.Null):
+ import SCons.CacheDir
+ _CacheDir_path = None
+ _CacheDir = SCons.CacheDir.CacheDir(None)
+ def get_CacheDir(self):
+ return self._CacheDir
+
+
def get_NullEnvironment():
"""Use singleton pattern for Null Environments."""
global nullenv
- import SCons.Util
- class NullEnvironment(SCons.Util.Null):
- import SCons.CacheDir
- _CacheDir_path = None
- _CacheDir = SCons.CacheDir.CacheDir(None)
- def get_CacheDir(self):
- return self._CacheDir
-
- if not nullenv:
+ if nullenv is None:
nullenv = NullEnvironment()
return nullenv
@@ -570,12 +599,29 @@ class Null(object):
"""A null Executor, with a null build Environment, that does
nothing when the rest of the methods call it.
- This might be able to disapper when we refactor things to
+ This might be able to disappear when we refactor things to
disassociate Builders from Nodes entirely, so we're not
going to worry about unit tests for this--at least for now.
"""
+
+ __slots__ = ('pre_actions',
+ 'post_actions',
+ 'env',
+ 'overridelist',
+ 'batches',
+ 'builder_kw',
+ '_memo',
+ 'lvars',
+ '_changed_sources_list',
+ '_changed_targets_list',
+ '_unchanged_sources_list',
+ '_unchanged_targets_list',
+ 'action_list',
+ '_do_execute',
+ '_execute_str')
+
def __init__(self, *args, **kw):
- if __debug__: logInstanceCreation(self, 'Executor.Null')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Null')
self.batches = [Batch(kw['targets'][:], [])]
def get_build_env(self):
return get_NullEnvironment()
@@ -596,7 +642,7 @@ class Null(object):
def get_all_sources(self):
return self.batches[0].targets[0].sources
def get_all_children(self):
- return self.get_all_sources()
+ return self.batches[0].targets[0].children()
def get_all_prerequisites(self):
return []
def get_action_side_effects(self):
@@ -625,7 +671,6 @@ class Null(object):
self._morph()
self.set_action_list(action)
-
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Job.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py
index bbf1def..60aa0ae 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Job.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py
@@ -7,7 +7,7 @@ stop, and wait on jobs.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ stop, and wait on jobs.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Job.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Job.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Memoize.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py
index 6be415b..77a8e16 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Memoize.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,21 +21,21 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Memoize.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Memoize.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Memoizer
-A metaclass implementation to count hits and misses of the computed
+A decorator-based implementation to count hits and misses of the computed
values that various methods cache in memory.
Use of this modules assumes that wrapped methods be coded to cache their
-values in a consistent way. Here is an example of wrapping a method
-that returns a computed value, with no input parameters:
+values in a consistent way. In particular, it requires that the class uses a
+dictionary named "_memo" to store the cached values.
- memoizer_counters = [] # Memoization
-
- memoizer_counters.append(SCons.Memoize.CountValue('foo')) # Memoization
+Here is an example of wrapping a method that returns a computed value,
+with no input parameters:
+ @SCons.Memoize.CountMethodCall
def foo(self):
try: # Memoization
@@ -55,8 +55,7 @@ based on one or more input arguments:
def _bar_key(self, argument): # Memoization
return argument # Memoization
- memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization
-
+ @SCons.Memoize.CountDictCall(_bar_key)
def bar(self, argument):
memo_key = argument # Memoization
@@ -77,10 +76,6 @@ based on one or more input arguments:
return result
-At one point we avoided replicating this sort of logic in all the methods
-by putting it right into this module, but we've moved away from that at
-present (see the "Historical Note," below.).
-
Deciding what to cache is tricky, because different configurations
can have radically different performance tradeoffs, and because the
tradeoffs involved are often so non-obvious. Consequently, deciding
@@ -102,51 +97,37 @@ cache return values from a method that's being called a lot:
input arguments, you don't need to use all of the arguments
if some of them don't affect the return values.
-Historical Note: The initial Memoizer implementation actually handled
-the caching of values for the wrapped methods, based on a set of generic
-algorithms for computing hashable values based on the method's arguments.
-This collected caching logic nicely, but had two drawbacks:
-
- Running arguments through a generic key-conversion mechanism is slower
- (and less flexible) than just coding these things directly. Since the
- methods that need memoized values are generally performance-critical,
- slowing them down in order to collect the logic isn't the right
- tradeoff.
-
- Use of the memoizer really obscured what was being called, because
- all the memoized methods were wrapped with re-used generic methods.
- This made it more difficult, for example, to use the Python profiler
- to figure out how to optimize the underlying methods.
"""
-import types
-
# A flag controlling whether or not we actually use memoization.
use_memoizer = None
-CounterList = []
+# Global list of counter objects
+CounterList = {}
class Counter(object):
"""
Base class for counting memoization hits and misses.
- We expect that the metaclass initialization will have filled in
- the .name attribute that represents the name of the function
- being counted.
+ We expect that the initialization in a matching decorator will
+ fill in the correct class name and method name that represents
+ the name of the function being counted.
"""
- def __init__(self, method_name):
+ def __init__(self, cls_name, method_name):
"""
"""
+ self.cls_name = cls_name
self.method_name = method_name
self.hit = 0
self.miss = 0
- CounterList.append(self)
+ def key(self):
+ return self.cls_name+'.'+self.method_name
def display(self):
fmt = " %7d hits %7d misses %s()"
- print fmt % (self.hit, self.miss, self.name)
+ print fmt % (self.hit, self.miss, self.key())
def __cmp__(self, other):
try:
- return cmp(self.name, other.name)
+ return cmp(self.key(), other.key())
except AttributeError:
return 0
@@ -154,45 +135,39 @@ class CountValue(Counter):
"""
A counter class for simple, atomic memoized values.
- A CountValue object should be instantiated in a class for each of
+ A CountValue object should be instantiated in a decorator for each of
the class's methods that memoizes its return value by simply storing
the return value in its _memo dictionary.
-
- We expect that the metaclass initialization will fill in the
- .underlying_method attribute with the method that we're wrapping.
- We then call the underlying_method method after counting whether
- its memoized value has already been set (a hit) or not (a miss).
"""
- def __call__(self, *args, **kw):
+ def count(self, *args, **kw):
+ """ Counts whether the memoized value has already been
+ set (a hit) or not (a miss).
+ """
obj = args[0]
if self.method_name in obj._memo:
self.hit = self.hit + 1
else:
self.miss = self.miss + 1
- return self.underlying_method(*args, **kw)
class CountDict(Counter):
"""
A counter class for memoized values stored in a dictionary, with
keys based on the method's input arguments.
- A CountDict object is instantiated in a class for each of the
+ A CountDict object is instantiated in a decorator for each of the
class's methods that memoizes its return value in a dictionary,
indexed by some key that can be computed from one or more of
its input arguments.
-
- We expect that the metaclass initialization will fill in the
- .underlying_method attribute with the method that we're wrapping.
- We then call the underlying_method method after counting whether the
- computed key value is already present in the memoization dictionary
- (a hit) or not (a miss).
"""
- def __init__(self, method_name, keymaker):
+ def __init__(self, cls_name, method_name, keymaker):
"""
"""
- Counter.__init__(self, method_name)
+ Counter.__init__(self, cls_name, method_name)
self.keymaker = keymaker
- def __call__(self, *args, **kw):
+ def count(self, *args, **kw):
+ """ Counts whether the computed key value is already present
+ in the memoization dictionary (a hit) or not (a miss).
+ """
obj = args[0]
try:
memo_dict = obj._memo[self.method_name]
@@ -204,39 +179,65 @@ class CountDict(Counter):
self.hit = self.hit + 1
else:
self.miss = self.miss + 1
- return self.underlying_method(*args, **kw)
-
-class Memoizer(object):
- """Object which performs caching of method calls for its 'primary'
- instance."""
-
- def __init__(self):
- pass
def Dump(title=None):
+ """ Dump the hit/miss count for all the counters
+ collected so far.
+ """
if title:
print title
- CounterList.sort()
- for counter in CounterList:
- counter.display()
-
-class Memoized_Metaclass(type):
- def __init__(cls, name, bases, cls_dict):
- super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict)
-
- for counter in cls_dict.get('memoizer_counters', []):
- method_name = counter.method_name
-
- counter.name = cls.__name__ + '.' + method_name
- counter.underlying_method = cls_dict[method_name]
-
- replacement_method = types.MethodType(counter, None, cls)
- setattr(cls, method_name, replacement_method)
+ for counter in sorted(CounterList):
+ CounterList[counter].display()
def EnableMemoization():
global use_memoizer
use_memoizer = 1
+def CountMethodCall(fn):
+ """ Decorator for counting memoizer hits/misses while retrieving
+ a simple value in a class method. It wraps the given method
+ fn and uses a CountValue object to keep track of the
+ caching statistics.
+ Wrapping gets enabled by calling EnableMemoization().
+ """
+ if use_memoizer:
+ def wrapper(self, *args, **kwargs):
+ global CounterList
+ key = self.__class__.__name__+'.'+fn.__name__
+ if key not in CounterList:
+ CounterList[key] = CountValue(self.__class__.__name__, fn.__name__)
+ CounterList[key].count(self, *args, **kwargs)
+ return fn(self, *args, **kwargs)
+ wrapper.__name__= fn.__name__
+ return wrapper
+ else:
+ return fn
+
+def CountDictCall(keyfunc):
+ """ Decorator for counting memoizer hits/misses while accessing
+ dictionary values with a key-generating function. Like
+ CountMethodCall above, it wraps the given method
+ fn and uses a CountDict object to keep track of the
+ caching statistics. The dict-key function keyfunc has to
+ get passed in the decorator call and gets stored in the
+ CountDict instance.
+ Wrapping gets enabled by calling EnableMemoization().
+ """
+ def decorator(fn):
+ if use_memoizer:
+ def wrapper(self, *args, **kwargs):
+ global CounterList
+ key = self.__class__.__name__+'.'+fn.__name__
+ if key not in CounterList:
+ CounterList[key] = CountDict(self.__class__.__name__, fn.__name__, keyfunc)
+ CounterList[key].count(self, *args, **kwargs)
+ return fn(self, *args, **kwargs)
+ wrapper.__name__= fn.__name__
+ return wrapper
+ else:
+ return fn
+ return decorator
+
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Alias.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py
index 291ac4d..7e13b00 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Alias.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py
@@ -8,7 +8,7 @@ This creates a hash of global Aliases (dummy targets).
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ This creates a hash of global Aliases (dummy targets).
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Node/Alias.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Node/Alias.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import collections
@@ -56,13 +56,47 @@ class AliasNameSpace(collections.UserDict):
return None
class AliasNodeInfo(SCons.Node.NodeInfoBase):
- current_version_id = 1
+ __slots__ = ('csig',)
+ current_version_id = 2
field_list = ['csig']
def str_to_node(self, s):
return default_ans.Alias(s)
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
class AliasBuildInfo(SCons.Node.BuildInfoBase):
- current_version_id = 1
+ __slots__ = ()
+ current_version_id = 2
class Alias(SCons.Node.Node):
@@ -72,7 +106,9 @@ class Alias(SCons.Node.Node):
def __init__(self, name):
SCons.Node.Node.__init__(self)
self.name = name
-
+ self.changed_since_last_build = 1
+ self.store_info = 0
+
def str_for_display(self):
return '"' + self.__str__() + '"'
@@ -105,13 +141,6 @@ class Alias(SCons.Node.Node):
#
#
- def changed_since_last_build(self, target, prev_ni):
- cur_csig = self.get_csig()
- try:
- return cur_csig != prev_ni.csig
- except AttributeError:
- return 1
-
def build(self):
"""A "builder" for aliases."""
pass
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/FS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py
index 9298d98..b6a1bb5 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/FS.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py
@@ -11,7 +11,7 @@ that can be used by scripts or modules looking for the canonical default.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ that can be used by scripts or modules looking for the canonical default.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Node/FS.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Node/FS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import fnmatch
import os
@@ -44,6 +44,7 @@ import time
import codecs
import SCons.Action
+import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Errors
import SCons.Memoize
@@ -55,9 +56,23 @@ import SCons.Warnings
from SCons.Debug import Trace
-do_store_info = True
+print_duplicate = 0
+def sconsign_none(node):
+ raise NotImplementedError
+
+def sconsign_dir(node):
+ """Return the .sconsign file info for this directory,
+ creating it first if necessary."""
+ if not node._sconsign:
+ import SCons.SConsign
+ node._sconsign = SCons.SConsign.ForDirectory(node)
+ return node._sconsign
+
+_sconsign_map = {0 : sconsign_none,
+ 1 : sconsign_dir}
+
class EntryProxyAttributeError(AttributeError):
"""
An AttributeError subclass for recording and displaying the name
@@ -110,33 +125,85 @@ def save_strings(val):
#
do_splitdrive = None
+_my_splitdrive =None
def initialize_do_splitdrive():
global do_splitdrive
+ global has_unc
drive, path = os.path.splitdrive('X:/foo')
- do_splitdrive = not not drive
+ has_unc = hasattr(os.path, 'splitunc')
+
+ do_splitdrive = not not drive or has_unc
+
+ global _my_splitdrive
+ if has_unc:
+ def splitdrive(p):
+ if p[1:2] == ':':
+ return p[:2], p[2:]
+ if p[0:2] == '//':
+ # Note that we leave a leading slash in the path
+ # because UNC paths are always absolute.
+ return '//', p[1:]
+ return '', p
+ else:
+ def splitdrive(p):
+ if p[1:2] == ':':
+ return p[:2], p[2:]
+ return '', p
+ _my_splitdrive = splitdrive
+
+ # Keep some commonly used values in global variables to skip to
+ # module look-up costs.
+ global OS_SEP
+ global UNC_PREFIX
+ global os_sep_is_slash
+
+ OS_SEP = os.sep
+ UNC_PREFIX = OS_SEP + OS_SEP
+ os_sep_is_slash = OS_SEP == '/'
initialize_do_splitdrive()
-#
-
-needs_normpath_check = None
-
-def initialize_normpath_check():
- """
- Initialize the normpath_check regular expression.
-
- This function is used by the unit tests to re-initialize the pattern
- when testing for behavior with different values of os.sep.
- """
- global needs_normpath_check
- if os.sep == '/':
- pattern = r'.*/|\.$|\.\.$'
- else:
- pattern = r'.*[/%s]|\.$|\.\.$' % re.escape(os.sep)
- needs_normpath_check = re.compile(pattern)
-
-initialize_normpath_check()
+# Used to avoid invoking os.path.normpath if not necessary.
+needs_normpath_check = re.compile(
+ r'''
+ # We need to renormalize the path if it contains any consecutive
+ # '/' characters.
+ .*// |
+
+ # We need to renormalize the path if it contains a '..' directory.
+ # Note that we check for all the following cases:
+ #
+ # a) The path is a single '..'
+ # b) The path starts with '..'. E.g. '../' or '../moredirs'
+ # but we not match '..abc/'.
+ # c) The path ends with '..'. E.g. '/..' or 'dirs/..'
+ # d) The path contains a '..' in the middle.
+ # E.g. dirs/../moredirs
+
+ (.*/)?\.\.(?:/|$) |
+
+ # We need to renormalize the path if it contains a '.'
+ # directory, but NOT if it is a single '.' '/' characters. We
+ # do not want to match a single '.' because this case is checked
+ # for explicitely since this is common enough case.
+ #
+ # Note that we check for all the following cases:
+ #
+ # a) We don't match a single '.'
+ # b) We match if the path starts with '.'. E.g. './' or
+ # './moredirs' but we not match '.abc/'.
+ # c) We match if the path ends with '.'. E.g. '/.' or
+ # 'dirs/.'
+ # d) We match if the path contains a '.' in the middle.
+ # E.g. dirs/./moredirs
+
+ \./|.*/\.(?:/|$)
+
+ ''',
+ re.VERBOSE
+ )
+needs_normpath_match = needs_normpath_check.match
#
# SCons.Action objects for interacting with the outside world.
@@ -214,8 +281,8 @@ def LinkFunc(target, source, env):
# who want to move their soft-linked src-trees around. Those
# people should use the 'hard-copy' mode, softlinks cannot be
# used for that; at least I have no idea how ...
- src = source[0].abspath
- dest = target[0].abspath
+ src = source[0].get_abspath()
+ dest = target[0].get_abspath()
dir, file = os.path.split(dest)
if dir and not target[0].fs.isdir(dir):
os.makedirs(dir)
@@ -248,7 +315,7 @@ LocalCopy = SCons.Action.Action(LinkFunc, LocalString)
def UnlinkFunc(target, source, env):
t = target[0]
- t.fs.unlink(t.abspath)
+ t.fs.unlink(t.get_abspath())
return 0
Unlink = SCons.Action.Action(UnlinkFunc, None)
@@ -256,7 +323,7 @@ Unlink = SCons.Action.Action(UnlinkFunc, None)
def MkdirFunc(target, source, env):
t = target[0]
if not t.exists():
- t.fs.mkdir(t.abspath)
+ t.fs.mkdir(t.get_abspath())
return 0
Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None)
@@ -349,7 +416,7 @@ def do_diskcheck_match(node, predicate, errorfmt):
except (AttributeError, KeyError):
pass
if result:
- raise TypeError(errorfmt % node.abspath)
+ raise TypeError(errorfmt % node.get_abspath())
def ignore_diskcheck_match(node, predicate, errorfmt):
pass
@@ -438,21 +505,21 @@ class EntryProxy(SCons.Util.Proxy):
def __get_posix_path(self):
"""Return the path with / as the path separator,
regardless of platform."""
- if os.sep == '/':
+ if os_sep_is_slash:
return self
else:
entry = self.get()
- r = entry.get_path().replace(os.sep, '/')
+ r = entry.get_path().replace(OS_SEP, '/')
return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix")
def __get_windows_path(self):
"""Return the path with \ as the path separator,
regardless of platform."""
- if os.sep == '\\':
+ if OS_SEP == '\\':
return self
else:
entry = self.get()
- r = entry.get_path().replace(os.sep, '\\')
+ r = entry.get_path().replace(OS_SEP, '\\')
return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows")
def __get_srcnode(self):
@@ -519,7 +586,20 @@ class Base(SCons.Node.Node):
object identity comparisons.
"""
- memoizer_counters = []
+ __slots__ = ['name',
+ 'fs',
+ '_abspath',
+ '_labspath',
+ '_path',
+ '_tpath',
+ '_path_elements',
+ 'dir',
+ 'cwd',
+ 'duplicate',
+ '_local',
+ 'sbuilder',
+ '_proxy',
+ '_func_sconsign']
def __init__(self, name, directory, fs):
"""Initialize a generic Node.FS.Base object.
@@ -528,32 +608,35 @@ class Base(SCons.Node.Node):
our relative and absolute paths, identify our parent
directory, and indicate that this node should use
signatures."""
- if __debug__: logInstanceCreation(self, 'Node.FS.Base')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Base')
SCons.Node.Node.__init__(self)
# Filenames and paths are probably reused and are intern'ed to
# save some memory.
+
+ #: Filename with extension as it was specified when the object was
+ #: created; to obtain filesystem path, use Python str() function
self.name = SCons.Util.silent_intern(name)
- self.suffix = SCons.Util.silent_intern(SCons.Util.splitext(name)[1])
- self.fs = fs
+ self.fs = fs #: Reference to parent Node.FS object
assert directory, "A directory must be provided"
- self.abspath = SCons.Util.silent_intern(directory.entry_abspath(name))
- self.labspath = SCons.Util.silent_intern(directory.entry_labspath(name))
- if directory.path == '.':
- self.path = SCons.Util.silent_intern(name)
- else:
- self.path = SCons.Util.silent_intern(directory.entry_path(name))
- if directory.tpath == '.':
- self.tpath = SCons.Util.silent_intern(name)
- else:
- self.tpath = SCons.Util.silent_intern(directory.entry_tpath(name))
- self.path_elements = directory.path_elements + [self]
+ self._abspath = None
+ self._labspath = None
+ self._path = None
+ self._tpath = None
+ self._path_elements = None
self.dir = directory
self.cwd = None # will hold the SConscript directory for target nodes
self.duplicate = directory.duplicate
+ self.changed_since_last_build = 2
+ self._func_sconsign = 0
+ self._func_exists = 2
+ self._func_rexists = 2
+ self._func_get_contents = 0
+ self._func_target_from_source = 1
+ self.store_info = 1
def str_for_display(self):
return '"' + self.__str__() + '"'
@@ -566,17 +649,38 @@ class Base(SCons.Node.Node):
if isinstance(self, klass) or klass is Entry:
return
raise TypeError("Tried to lookup %s '%s' as a %s." %\
- (self.__class__.__name__, self.path, klass.__name__))
+ (self.__class__.__name__, self.get_internal_path(), klass.__name__))
def get_dir(self):
return self.dir
def get_suffix(self):
- return self.suffix
+ return SCons.Util.splitext(self.name)[1]
def rfile(self):
return self
+ def __getattr__(self, attr):
+ """ Together with the node_bwcomp dict defined below,
+ this method provides a simple backward compatibility
+ layer for the Node attributes 'abspath', 'labspath',
+ 'path', 'tpath', 'suffix' and 'path_elements'. These Node
+ attributes used to be directly available in v2.3 and earlier, but
+ have been replaced by getter methods that initialize the
+ single variables lazily when required, in order to save memory.
+ The redirection to the getters lets older Tools and
+ SConstruct continue to work without any additional changes,
+ fully transparent to the user.
+ Note, that __getattr__ is only called as fallback when the
+ requested attribute can't be found, so there should be no
+ speed performance penalty involved for standard builds.
+ """
+ if attr in node_bwcomp:
+ return node_bwcomp[attr](self)
+
+ raise AttributeError("%r object has no attribute %r" %
+ (self.__class__, attr))
+
def __str__(self):
"""A Node.FS.Base object's string representation is its path
name."""
@@ -585,8 +689,7 @@ class Base(SCons.Node.Node):
return self._save_str()
return self._get_str()
- memoizer_counters.append(SCons.Memoize.CountValue('_save_str'))
-
+ @SCons.Memoize.CountMethodCall
def _save_str(self):
try:
return self._memo['_save_str']
@@ -606,7 +709,7 @@ class Base(SCons.Node.Node):
else:
result = srcnode.get_path()
if not Save_Strings:
- # We're not at the point where we're saving the string string
+ # We're not at the point where we're saving the string
# representations of FS Nodes (because we haven't finished
# reading the SConscript files and need to have str() return
# things relative to them). That also means we can't yet
@@ -623,21 +726,20 @@ class Base(SCons.Node.Node):
rstr = __str__
- memoizer_counters.append(SCons.Memoize.CountValue('stat'))
-
+ @SCons.Memoize.CountMethodCall
def stat(self):
try: return self._memo['stat']
except KeyError: pass
- try: result = self.fs.stat(self.abspath)
+ try: result = self.fs.stat(self.get_abspath())
except os.error: result = None
self._memo['stat'] = result
return result
def exists(self):
- return self.stat() is not None
+ return SCons.Node._exists_map[self._func_exists](self)
def rexists(self):
- return self.rfile().exists()
+ return SCons.Node._rexists_map[self._func_rexists](self)
def getmtime(self):
st = self.stat()
@@ -659,7 +761,7 @@ class Base(SCons.Node.Node):
if hasattr(os, 'symlink'):
def islink(self):
- try: st = self.fs.lstat(self.abspath)
+ try: st = self.fs.lstat(self.get_abspath())
except os.error: return 0
return stat.S_ISLNK(st[stat.ST_MODE])
else:
@@ -694,12 +796,16 @@ class Base(SCons.Node.Node):
dir = self.fs.getcwd()
if self == dir:
return '.'
- path_elems = self.path_elements
+ path_elems = self.get_path_elements()
+ pathname = ''
try: i = path_elems.index(dir)
- except ValueError: pass
- else: path_elems = path_elems[i+1:]
- path_elems = [n.name for n in path_elems]
- return os.sep.join(path_elems)
+ except ValueError:
+ for p in path_elems[:-1]:
+ pathname += p.dirname
+ else:
+ for p in path_elems[i+1:-1]:
+ pathname += p.dirname
+ return pathname + path_elems[-1].name
def set_src_builder(self, builder):
"""Set the source code builder for this node."""
@@ -723,7 +829,26 @@ class Base(SCons.Node.Node):
def get_abspath(self):
"""Get the absolute path of the file."""
- return self.abspath
+ return self.dir.entry_abspath(self.name)
+
+ def get_labspath(self):
+ """Get the absolute path of the file."""
+ return self.dir.entry_labspath(self.name)
+
+ def get_internal_path(self):
+ if self.dir._path == '.':
+ return self.name
+ else:
+ return self.dir.entry_path(self.name)
+
+ def get_tpath(self):
+ if self.dir._tpath == '.':
+ return self.name
+ else:
+ return self.dir.entry_tpath(self.name)
+
+ def get_path_elements(self):
+ return self.dir._path_elements + [self]
def for_signature(self):
# Return just our name. Even an absolute path would not work,
@@ -749,13 +874,12 @@ class Base(SCons.Node.Node):
files that need different behavior. See Tool/swig.py for
an example.
"""
- return self.dir.Entry(prefix + splitext(self.name)[0] + suffix)
+ return SCons.Node._target_from_source_map[self._func_target_from_source](self, prefix, suffix, splitext)
def _Rfindalldirs_key(self, pathlist):
return pathlist
- memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key))
-
+ @SCons.Memoize.CountDictCall(_Rfindalldirs_key)
def Rfindalldirs(self, pathlist):
"""
Return all of the directories for a given path list, including
@@ -794,8 +918,7 @@ class Base(SCons.Node.Node):
cwd = self.cwd or self.fs._cwd
return cwd.Rfindalldirs(pathlist)
- memoizer_counters.append(SCons.Memoize.CountValue('rentry'))
-
+ @SCons.Memoize.CountMethodCall
def rentry(self):
try:
return self._memo['rentry']
@@ -816,6 +939,17 @@ class Base(SCons.Node.Node):
def _glob1(self, pattern, ondisk=True, source=False, strings=False):
return []
+
+# Dict that provides a simple backward compatibility
+# layer for the Node attributes 'abspath', 'labspath',
+# 'path', 'tpath' and 'path_elements'.
+# @see Base.__getattr__ above
+node_bwcomp = {'abspath' : Base.get_abspath,
+ 'labspath' : Base.get_labspath,
+ 'path' : Base.get_internal_path,
+ 'tpath' : Base.get_tpath,
+ 'path_elements' : Base.get_path_elements,
+ 'suffix' : Base.get_suffix}
class Entry(Base):
"""This is the class for generic Node.FS entries--that is, things
@@ -825,6 +959,28 @@ class Entry(Base):
time comes, and then call the same-named method in the transformed
class."""
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'sccs_dir',
+ 'rcs_dir',
+ 'released_target_info',
+ 'contentsig']
+
+ def __init__(self, name, directory, fs):
+ Base.__init__(self, name, directory, fs)
+ self._func_exists = 3
+ self._func_get_contents = 1
+
def diskcheck_match(self):
pass
@@ -855,7 +1011,7 @@ class Entry(Base):
self.__class__ = Dir
self._morph()
elif must_exist:
- msg = "No such file or directory: '%s'" % self.abspath
+ msg = "No such file or directory: '%s'" % self.get_abspath()
raise SCons.Errors.UserError(msg)
else:
self.__class__ = File
@@ -877,17 +1033,7 @@ class Entry(Base):
def get_contents(self):
"""Fetch the contents of the entry. Returns the exact binary
contents of the file."""
- try:
- self = self.disambiguate(must_exist=1)
- except SCons.Errors.UserError:
- # There was nothing on disk with which to disambiguate
- # this entry. Leave it as an Entry, but return a null
- # string so calls to get_contents() in emitters and the
- # like (e.g. in qt.py) don't have to disambiguate by hand
- # or catch the exception.
- return ''
- else:
- return self.get_contents()
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
def get_text_contents(self):
"""Fetch the decoded text contents of a Unicode encoded Entry.
@@ -927,10 +1073,7 @@ class Entry(Base):
# to make various tests pass.
def exists(self):
- """Return if the Entry exists. Check the file system to see
- what we should turn into first. Assume a file if there's no
- directory."""
- return self.disambiguate().exists()
+ return SCons.Node._exists_map[self._func_exists](self)
def rel_path(self, other):
d = self.disambiguate()
@@ -941,9 +1084,6 @@ class Entry(Base):
def new_ninfo(self):
return self.disambiguate().new_ninfo()
- def changed_since_last_build(self, target, prev_ni):
- return self.disambiguate().changed_since_last_build(target, prev_ni)
-
def _glob1(self, pattern, ondisk=True, source=False, strings=False):
return self.disambiguate()._glob1(pattern, ondisk, source, strings)
@@ -957,9 +1097,6 @@ _classEntry = Entry
class LocalFS(object):
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
# This class implements an abstraction layer for operations involving
# a local file system. Essentially, this wraps any function in
# the os, os.path or shutil modules that we use to actually go do
@@ -1039,8 +1176,6 @@ class LocalFS(object):
class FS(LocalFS):
- memoizer_counters = []
-
def __init__(self, path = None):
"""Initialize the Node.FS subsystem.
@@ -1050,7 +1185,7 @@ class FS(LocalFS):
The path argument must be a valid absolute path.
"""
- if __debug__: logInstanceCreation(self, 'Node.FS')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS')
self._memo = {}
@@ -1063,11 +1198,11 @@ class FS(LocalFS):
self.pathTop = os.getcwd()
else:
self.pathTop = path
- self.defaultDrive = _my_normcase(os.path.splitdrive(self.pathTop)[0])
+ self.defaultDrive = _my_normcase(_my_splitdrive(self.pathTop)[0])
self.Top = self.Dir(self.pathTop)
- self.Top.path = '.'
- self.Top.tpath = '.'
+ self.Top._path = '.'
+ self.Top._tpath = '.'
self._cwd = self.Top
DirNodeInfo.fs = self
@@ -1083,7 +1218,10 @@ class FS(LocalFS):
self.max_drift = max_drift
def getcwd(self):
- return self._cwd
+ if hasattr(self, "_cwd"):
+ return self._cwd
+ else:
+ return "<no cwd>"
def chdir(self, dir, change_os_dir=0):
"""Change the current working directory for lookups.
@@ -1095,7 +1233,7 @@ class FS(LocalFS):
if dir is not None:
self._cwd = dir
if change_os_dir:
- os.chdir(dir.abspath)
+ os.chdir(dir.get_abspath())
except OSError:
self._cwd = curr
raise
@@ -1147,54 +1285,110 @@ class FS(LocalFS):
# str(p) in case it's something like a proxy object
p = str(p)
- initial_hash = (p[0:1] == '#')
- if initial_hash:
+ if not os_sep_is_slash:
+ p = p.replace(OS_SEP, '/')
+
+ if p[0:1] == '#':
# There was an initial '#', so we strip it and override
# whatever directory they may have specified with the
# top-level SConstruct directory.
p = p[1:]
directory = self.Top
- if directory and not isinstance(directory, Dir):
- directory = self.Dir(directory)
+ # There might be a drive letter following the
+ # '#'. Although it is not described in the SCons man page,
+ # the regression test suite explicitly tests for that
+ # syntax. It seems to mean the following thing:
+ #
+ # Assuming the the SCons top dir is in C:/xxx/yyy,
+ # '#X:/toto' means X:/xxx/yyy/toto.
+ #
+ # i.e. it assumes that the X: drive has a directory
+ # structure similar to the one found on drive C:.
+ if do_splitdrive:
+ drive, p = _my_splitdrive(p)
+ if drive:
+ root = self.get_root(drive)
+ else:
+ root = directory.root
+ else:
+ root = directory.root
- if do_splitdrive:
- drive, p = os.path.splitdrive(p)
+ # We can only strip trailing after splitting the drive
+ # since the drive might the UNC '//' prefix.
+ p = p.strip('/')
+
+ needs_normpath = needs_normpath_match(p)
+
+ # The path is relative to the top-level SCons directory.
+ if p in ('', '.'):
+ p = directory.get_labspath()
+ else:
+ p = directory.get_labspath() + '/' + p
else:
- drive = ''
- if drive and not p:
- # This causes a naked drive letter to be treated as a synonym
- # for the root directory on that drive.
- p = os.sep
- absolute = os.path.isabs(p)
-
- needs_normpath = needs_normpath_check.match(p)
-
- if initial_hash or not absolute:
- # This is a relative lookup, either to the top-level
- # SConstruct directory (because of the initial '#') or to
- # the current directory (the path name is not absolute).
- # Add the string to the appropriate directory lookup path,
- # after which the whole thing gets normalized.
- if not directory:
- directory = self._cwd
- if p:
- p = directory.labspath + '/' + p
+ if do_splitdrive:
+ drive, p = _my_splitdrive(p)
+ if drive and not p:
+ # This causes a naked drive letter to be treated
+ # as a synonym for the root directory on that
+ # drive.
+ p = '/'
else:
- p = directory.labspath
+ drive = ''
- if needs_normpath:
- p = os.path.normpath(p)
+ # We can only strip trailing '/' since the drive might the
+ # UNC '//' prefix.
+ if p != '/':
+ p = p.rstrip('/')
- if drive or absolute:
- root = self.get_root(drive)
- else:
- if not directory:
- directory = self._cwd
- root = directory.root
+ needs_normpath = needs_normpath_match(p)
+
+ if p[0:1] == '/':
+ # Absolute path
+ root = self.get_root(drive)
+ else:
+ # This is a relative lookup or to the current directory
+ # (the path name is not absolute). Add the string to the
+ # appropriate directory lookup path, after which the whole
+ # thing gets normalized.
+ if directory:
+ if not isinstance(directory, Dir):
+ directory = self.Dir(directory)
+ else:
+ directory = self._cwd
+
+ if p in ('', '.'):
+ p = directory.get_labspath()
+ else:
+ p = directory.get_labspath() + '/' + p
+
+ if drive:
+ root = self.get_root(drive)
+ else:
+ root = directory.root
+
+ if needs_normpath is not None:
+ # Normalize a pathname. Will return the same result for
+ # equivalent paths.
+ #
+ # We take advantage of the fact that we have an absolute
+ # path here for sure. In addition, we know that the
+ # components of lookup path are separated by slashes at
+ # this point. Because of this, this code is about 2X
+ # faster than calling os.path.normpath() followed by
+ # replacing os.sep with '/' again.
+ ins = p.split('/')[1:]
+ outs = []
+ for d in ins:
+ if d == '..':
+ try:
+ outs.pop()
+ except IndexError:
+ pass
+ elif d not in ('', '.'):
+ outs.append(d)
+ p = '/' + '/'.join(outs)
- if os.sep != '/':
- p = p.replace(os.sep, '/')
return root._lookup_abs(p, fsclass, create)
def Entry(self, name, directory = None, create = 1):
@@ -1272,7 +1466,7 @@ class FS(LocalFS):
if start_dir.is_under(bd):
# If already in the build-dir location, don't reflect
return [orig], fmt % str(orig)
- p = os.path.join(bd.path, *tail)
+ p = os.path.join(bd._path, *tail)
targets.append(self.Entry(p))
tail = [dir.name] + tail
dir = dir.up()
@@ -1280,7 +1474,7 @@ class FS(LocalFS):
message = fmt % ' '.join(map(str, targets))
return targets, message
- def Glob(self, pathname, ondisk=True, source=True, strings=False, cwd=None):
+ def Glob(self, pathname, ondisk=True, source=True, strings=False, exclude=None, cwd=None):
"""
Globs
@@ -1288,11 +1482,12 @@ class FS(LocalFS):
"""
if cwd is None:
cwd = self.getcwd()
- return cwd.glob(pathname, ondisk, source, strings)
+ return cwd.glob(pathname, ondisk, source, strings, exclude)
class DirNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ()
# This should get reset by the FS initialization.
- current_version_id = 1
+ current_version_id = 2
fs = None
@@ -1300,15 +1495,16 @@ class DirNodeInfo(SCons.Node.NodeInfoBase):
top = self.fs.Top
root = top.root
if do_splitdrive:
- drive, s = os.path.splitdrive(s)
+ drive, s = _my_splitdrive(s)
if drive:
root = self.fs.get_root(drive)
if not os.path.isabs(s):
- s = top.labspath + '/' + s
+ s = top.get_labspath() + '/' + s
return root._lookup_abs(s, Entry)
class DirBuildInfo(SCons.Node.BuildInfoBase):
- current_version_id = 1
+ __slots__ = ()
+ current_version_id = 2
glob_magic_check = re.compile('[*?[]')
@@ -1319,13 +1515,28 @@ class Dir(Base):
"""A class for directories in a file system.
"""
- memoizer_counters = []
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'sccs_dir',
+ 'rcs_dir',
+ 'released_target_info',
+ 'contentsig']
NodeInfo = DirNodeInfo
BuildInfo = DirBuildInfo
def __init__(self, name, directory, fs):
- if __debug__: logInstanceCreation(self, 'Node.FS.Dir')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Dir')
Base.__init__(self, name, directory, fs)
self._morph()
@@ -1349,12 +1560,51 @@ class Dir(Base):
self._sconsign = None
self.variant_dirs = []
self.root = self.dir.root
+ self.changed_since_last_build = 3
+ self._func_sconsign = 1
+ self._func_exists = 2
+ self._func_get_contents = 2
+
+ self._abspath = SCons.Util.silent_intern(self.dir.entry_abspath(self.name))
+ self._labspath = SCons.Util.silent_intern(self.dir.entry_labspath(self.name))
+ if self.dir._path == '.':
+ self._path = SCons.Util.silent_intern(self.name)
+ else:
+ self._path = SCons.Util.silent_intern(self.dir.entry_path(self.name))
+ if self.dir._tpath == '.':
+ self._tpath = SCons.Util.silent_intern(self.name)
+ else:
+ self._tpath = SCons.Util.silent_intern(self.dir.entry_tpath(self.name))
+ self._path_elements = self.dir._path_elements + [self]
+
+ # For directories, we make a difference between the directory
+ # 'name' and the directory 'dirname'. The 'name' attribute is
+ # used when we need to print the 'name' of the directory or
+ # when we it is used as the last part of a path. The 'dirname'
+ # is used when the directory is not the last element of the
+ # path. The main reason for making that distinction is that
+ # for RoorDir's the dirname can not be easily inferred from
+ # the name. For example, we have to add a '/' after a drive
+ # letter but not after a UNC path prefix ('//').
+ self.dirname = self.name + OS_SEP
# Don't just reset the executor, replace its action list,
# because it might have some pre-or post-actions that need to
# be preserved.
- self.builder = get_MkdirBuilder()
- self.get_executor().set_action_list(self.builder.action)
+ #
+ # But don't reset the executor if there is a non-null executor
+ # attached already. The existing executor might have other
+ # targets, in which case replacing the action list with a
+ # Mkdir action is a big mistake.
+ if not hasattr(self, 'executor'):
+ self.builder = get_MkdirBuilder()
+ self.get_executor().set_action_list(self.builder.action)
+ else:
+ # Prepend MkdirBuilder action to existing action list
+ l = self.get_executor().action_list
+ a = get_MkdirBuilder().action
+ l.insert(0, a)
+ self.get_executor().set_action_list(l)
def diskcheck_match(self):
diskcheck_match(self, self.isfile,
@@ -1403,23 +1653,6 @@ class Dir(Base):
"""
return self.fs.File(name, self)
- def _lookup_rel(self, name, klass, create=1):
- """
- Looks up a *normalized* relative path name, relative to this
- directory.
-
- This method is intended for use by internal lookups with
- already-normalized path data. For general-purpose lookups,
- use the Entry(), Dir() and File() methods above.
-
- This method does *no* input checking and will die or give
- incorrect results if it's passed a non-normalized path name (e.g.,
- a path containing '..'), an absolute path name, a top-relative
- ('#foo') path name, or any kind of object.
- """
- name = self.entry_labspath(name)
- return self.root._lookup_abs(name, klass, create)
-
def link(self, srcdir, duplicate):
"""Set this directory as the variant directory for the
supplied source directory."""
@@ -1435,8 +1668,7 @@ class Dir(Base):
return self.srcdir.get_all_rdirs() + self.repositories
return self.repositories
- memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs'))
-
+ @SCons.Memoize.CountMethodCall
def get_all_rdirs(self):
try:
return list(self._memo['get_all_rdirs'])
@@ -1452,7 +1684,7 @@ class Dir(Base):
if fname == '.':
fname = dir.name
else:
- fname = dir.name + os.sep + fname
+ fname = dir.name + OS_SEP + fname
dir = dir.up()
self._memo['get_all_rdirs'] = list(result)
@@ -1462,17 +1694,16 @@ class Dir(Base):
def addRepository(self, dir):
if dir != self and not dir in self.repositories:
self.repositories.append(dir)
- dir.tpath = '.'
+ dir._tpath = '.'
self.__clearRepositoryCache()
def up(self):
- return self.entries['..']
+ return self.dir
def _rel_path_key(self, other):
return str(other)
- memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key))
-
+ @SCons.Memoize.CountDictCall(_rel_path_key)
def rel_path(self, other):
"""Return a path to "other" relative to this directory.
"""
@@ -1501,7 +1732,7 @@ class Dir(Base):
if self is other:
result = '.'
- elif not other in self.path_elements:
+ elif not other in self._path_elements:
try:
other_dir = other.get_dir()
except AttributeError:
@@ -1514,14 +1745,14 @@ class Dir(Base):
if dir_rel_path == '.':
result = other.name
else:
- result = dir_rel_path + os.sep + other.name
+ result = dir_rel_path + OS_SEP + other.name
else:
- i = self.path_elements.index(other) + 1
+ i = self._path_elements.index(other) + 1
- path_elems = ['..'] * (len(self.path_elements) - i) \
- + [n.name for n in other.path_elements[i:]]
+ path_elems = ['..'] * (len(self._path_elements) - i) \
+ + [n.name for n in other._path_elements[i:]]
- result = os.sep.join(path_elems)
+ result = OS_SEP.join(path_elems)
memo_dict[other] = result
@@ -1586,7 +1817,7 @@ class Dir(Base):
if p is None:
# Don't use while: - else: for this condition because
# if so, then parent is None and has no .path attribute.
- raise SCons.Errors.StopError(parent.path)
+ raise SCons.Errors.StopError(parent._path)
parent = p
listDirs.reverse()
for dirnode in listDirs:
@@ -1626,10 +1857,7 @@ class Dir(Base):
def get_contents(self):
"""Return content signatures and names of all our children
separated by new-lines. Ensure that the nodes are sorted."""
- contents = []
- for node in sorted(self.children(), key=lambda t: t.name):
- contents.append('%s %s\n' % (node.get_csig(), node.name))
- return ''.join(contents)
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
def get_csig(self):
"""Compute the content signature for Directory nodes. In
@@ -1643,8 +1871,6 @@ class Dir(Base):
def do_duplicate(self, src):
pass
- changed_since_last_build = SCons.Node.Node.state_has_changed
-
def is_up_to_date(self):
"""If any child is not up-to-date, then this directory isn't,
either."""
@@ -1668,12 +1894,8 @@ class Dir(Base):
return self
def sconsign(self):
- """Return the .sconsign file info for this directory,
- creating it first if necessary."""
- if not self._sconsign:
- import SCons.SConsign
- self._sconsign = SCons.SConsign.ForDirectory(self)
- return self._sconsign
+ """Return the .sconsign file info for this directory. """
+ return _sconsign_map[self._func_sconsign](self)
def srcnode(self):
"""Dir has a special need for srcnode()...if we
@@ -1690,45 +1912,94 @@ class Dir(Base):
stamp = kid.get_timestamp()
return stamp
+ def get_abspath(self):
+ """Get the absolute path of the file."""
+ return self._abspath
+
+ def get_labspath(self):
+ """Get the absolute path of the file."""
+ return self._labspath
+
+ def get_internal_path(self):
+ return self._path
+
+ def get_tpath(self):
+ return self._tpath
+
+ def get_path_elements(self):
+ return self._path_elements
+
def entry_abspath(self, name):
- return self.abspath + os.sep + name
+ return self._abspath + OS_SEP + name
def entry_labspath(self, name):
- return self.labspath + '/' + name
+ return self._labspath + '/' + name
def entry_path(self, name):
- return self.path + os.sep + name
+ return self._path + OS_SEP + name
def entry_tpath(self, name):
- return self.tpath + os.sep + name
+ return self._tpath + OS_SEP + name
def entry_exists_on_disk(self, name):
+ """ Searches through the file/dir entries of the current
+ directory, and returns True if a physical entry with the given
+ name could be found.
+
+ @see rentry_exists_on_disk
+ """
try:
d = self.on_disk_entries
except AttributeError:
d = {}
try:
- entries = os.listdir(self.abspath)
+ entries = os.listdir(self._abspath)
except OSError:
pass
else:
for entry in map(_my_normcase, entries):
d[entry] = True
self.on_disk_entries = d
- if sys.platform == 'win32':
+ if sys.platform == 'win32' or sys.platform == 'cygwin':
name = _my_normcase(name)
result = d.get(name)
if result is None:
# Belt-and-suspenders for Windows: check directly for
# 8.3 file names that don't show up in os.listdir().
- result = os.path.exists(self.abspath + os.sep + name)
+ result = os.path.exists(self._abspath + OS_SEP + name)
d[name] = result
return result
else:
return name in d
- memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list'))
+ def rentry_exists_on_disk(self, name):
+ """ Searches through the file/dir entries of the current
+ *and* all its remote directories (repos), and returns
+ True if a physical entry with the given name could be found.
+ The local directory (self) gets searched first, so
+ repositories take a lower precedence regarding the
+ searching order.
+
+ @see entry_exists_on_disk
+ """
+
+ rentry_exists = self.entry_exists_on_disk(name)
+ if not rentry_exists:
+ # Search through the repository folders
+ norm_name = _my_normcase(name)
+ for rdir in self.get_all_rdirs():
+ try:
+ node = rdir.entries[norm_name]
+ if node:
+ rentry_exists = True
+ break
+ except KeyError:
+ if rdir.entry_exists_on_disk(name):
+ rentry_exists = True
+ break
+ return rentry_exists
+ @SCons.Memoize.CountMethodCall
def srcdir_list(self):
try:
return self._memo['srcdir_list']
@@ -1742,7 +2013,7 @@ class Dir(Base):
while dir:
if dir.srcdir:
result.append(dir.srcdir.Dir(dirname))
- dirname = dir.name + os.sep + dirname
+ dirname = dir.name + OS_SEP + dirname
dir = dir.up()
self._memo['srcdir_list'] = result
@@ -1769,8 +2040,7 @@ class Dir(Base):
def _srcdir_find_file_key(self, filename):
return filename
- memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key))
-
+ @SCons.Memoize.CountDictCall(_srcdir_find_file_key)
def srcdir_find_file(self, filename):
try:
memo_dict = self._memo['srcdir_find_file']
@@ -1860,7 +2130,7 @@ class Dir(Base):
for dirname in [n for n in names if isinstance(entries[n], Dir)]:
entries[dirname].walk(func, arg)
- def glob(self, pathname, ondisk=True, source=False, strings=False):
+ def glob(self, pathname, ondisk=True, source=False, strings=False, exclude=None):
"""
Returns a list of Nodes (or strings) matching a specified
pathname pattern.
@@ -1888,24 +2158,31 @@ class Dir(Base):
The "strings" argument, when true, returns the matches as strings,
not Nodes. The strings are path names relative to this directory.
+ The "exclude" argument, if not None, must be a pattern or a list
+ of patterns following the same UNIX shell semantics.
+ Elements matching a least one pattern of this list will be excluded
+ from the result.
+
The underlying algorithm is adapted from the glob.glob() function
in the Python library (but heavily modified), and uses fnmatch()
under the covers.
"""
dirname, basename = os.path.split(pathname)
if not dirname:
- return sorted(self._glob1(basename, ondisk, source, strings),
- key=lambda t: str(t))
- if has_glob_magic(dirname):
- list = self.glob(dirname, ondisk, source, strings=False)
+ result = self._glob1(basename, ondisk, source, strings)
else:
- list = [self.Dir(dirname, create=True)]
- result = []
- for dir in list:
- r = dir._glob1(basename, ondisk, source, strings)
- if strings:
- r = [os.path.join(str(dir), x) for x in r]
- result.extend(r)
+ if has_glob_magic(dirname):
+ list = self.glob(dirname, ondisk, source, False, exclude)
+ else:
+ list = [self.Dir(dirname, create=True)]
+ result = []
+ for dir in list:
+ r = dir._glob1(basename, ondisk, source, strings)
+ if strings:
+ r = [os.path.join(str(dir), x) for x in r]
+ result.extend(r)
+ if exclude:
+ result = filter(lambda x: not any(fnmatch.fnmatch(str(x), e) for e in SCons.Util.flatten(exclude)), result)
return sorted(result, key=lambda a: str(a))
def _glob1(self, pattern, ondisk=True, source=False, strings=False):
@@ -1938,7 +2215,7 @@ class Dir(Base):
for name in node_names: selfEntry(name)
if ondisk:
try:
- disk_names = os.listdir(dir.abspath)
+ disk_names = os.listdir(dir._abspath)
except os.error:
continue
names.extend(disk_names)
@@ -1968,14 +2245,12 @@ class Dir(Base):
names = set(names)
if pattern[0] != '.':
- #names = [ n for n in names if n[0] != '.' ]
names = [x for x in names if x[0] != '.']
names = fnmatch.filter(names, pattern)
if strings:
return names
- #return [ self.entries[_my_normcase(n)] for n in names ]
return [self.entries[_my_normcase(n)] for n in names]
class RootDir(Dir):
@@ -1986,41 +2261,105 @@ class RootDir(Dir):
add a separator when creating the path names of entries within
this directory.
"""
- def __init__(self, name, fs):
- if __debug__: logInstanceCreation(self, 'Node.FS.RootDir')
- # We're going to be our own parent directory (".." entry and .dir
- # attribute) so we have to set up some values so Base.__init__()
- # won't gag won't it calls some of our methods.
- self.abspath = ''
- self.labspath = ''
- self.path = ''
- self.tpath = ''
- self.path_elements = []
- self.duplicate = 0
- self.root = self
- Base.__init__(self, name, self, fs)
-
- # Now set our paths to what we really want them to be: the
- # initial drive letter (the name) plus the directory separator,
- # except for the "lookup abspath," which does not have the
- # drive letter.
- self.abspath = name + os.sep
- self.labspath = ''
- self.path = name + os.sep
- self.tpath = name + os.sep
+
+ __slots__ = ['_lookupDict']
+
+ def __init__(self, drive, fs):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.RootDir')
+ SCons.Node.Node.__init__(self)
+
+ # Handle all the types of drives:
+ if drive == '':
+ # No drive, regular UNIX root or Windows default drive.
+ name = OS_SEP
+ dirname = OS_SEP
+ elif drive == '//':
+ # UNC path
+ name = UNC_PREFIX
+ dirname = UNC_PREFIX
+ else:
+ # Windows drive letter
+ name = drive
+ dirname = drive + OS_SEP
+
+ #: Filename with extension as it was specified when the object was
+ #: created; to obtain filesystem path, use Python str() function
+ self.name = SCons.Util.silent_intern(name)
+ self.fs = fs #: Reference to parent Node.FS object
+
+ self._path_elements = [self]
+ self.dir = self
+ self._func_rexists = 2
+ self._func_target_from_source = 1
+ self.store_info = 1
+
+ # Now set our paths to what we really want them to be. The
+ # name should already contain any necessary separators, such
+ # as the initial drive letter (the name) plus the directory
+ # separator, except for the "lookup abspath," which does not
+ # have the drive letter.
+ self._abspath = dirname
+ self._labspath = ''
+ self._path = dirname
+ self._tpath = dirname
+ self.dirname = dirname
+
self._morph()
+ self.duplicate = 0
self._lookupDict = {}
- # The // and os.sep + os.sep entries are necessary because
- # os.path.normpath() seems to preserve double slashes at the
- # beginning of a path (presumably for UNC path names), but
- # collapses triple slashes to a single slash.
self._lookupDict[''] = self
self._lookupDict['/'] = self
- self._lookupDict['//'] = self
- self._lookupDict[os.sep] = self
- self._lookupDict[os.sep + os.sep] = self
+ self.root = self
+ # The // entry is necessary because os.path.normpath()
+ # preserves double slashes at the beginning of a path on Posix
+ # platforms.
+ if not has_unc:
+ self._lookupDict['//'] = self
+
+ def _morph(self):
+ """Turn a file system Node (either a freshly initialized directory
+ object or a separate Entry object) into a proper directory object.
+
+ Set up this directory's entries and hook it into the file
+ system tree. Specify that directories (this Node) don't use
+ signatures for calculating whether they're current.
+ """
+
+ self.repositories = []
+ self.srcdir = None
+
+ self.entries = {}
+ self.entries['.'] = self
+ self.entries['..'] = self.dir
+ self.cwd = self
+ self.searched = 0
+ self._sconsign = None
+ self.variant_dirs = []
+ self.changed_since_last_build = 3
+ self._func_sconsign = 1
+ self._func_exists = 2
+ self._func_get_contents = 2
+
+ # Don't just reset the executor, replace its action list,
+ # because it might have some pre-or post-actions that need to
+ # be preserved.
+ #
+ # But don't reset the executor if there is a non-null executor
+ # attached already. The existing executor might have other
+ # targets, in which case replacing the action list with a
+ # Mkdir action is a big mistake.
+ if not hasattr(self, 'executor'):
+ self.builder = get_MkdirBuilder()
+ self.get_executor().set_action_list(self.builder.action)
+ else:
+ # Prepend MkdirBuilder action to existing action list
+ l = self.get_executor().action_list
+ a = get_MkdirBuilder().action
+ l.insert(0, a)
+ self.get_executor().set_action_list(l)
+
def must_be_same(self, klass):
if klass is Dir:
@@ -2039,7 +2378,7 @@ class RootDir(Dir):
normalized absolute path; we merely let Python's dictionary look
up and return the One True Node.FS object for the path.
- If no Node for the specified "p" doesn't already exist, and
+ If a Node for the specified "p" doesn't already exist, and
"create" is specified, the Node may be created after recursive
invocation to find or create the parent directory or directories.
"""
@@ -2052,7 +2391,7 @@ class RootDir(Dir):
raise SCons.Errors.UserError(msg)
# There is no Node for this path name, and we're allowed
# to create it.
- dir_name, file_name = os.path.split(p)
+ dir_name, file_name = p.rsplit('/',1)
dir_node = self._lookup_abs(dir_name, Dir)
result = klass(file_name, dir_node, self.fs)
@@ -2070,19 +2409,19 @@ class RootDir(Dir):
return result
def __str__(self):
- return self.abspath
+ return self._abspath
def entry_abspath(self, name):
- return self.abspath + name
+ return self._abspath + name
def entry_labspath(self, name):
return '/' + name
def entry_path(self, name):
- return self.path + name
+ return self._path + name
def entry_tpath(self, name):
- return self.tpath + name
+ return self._tpath + name
def is_under(self, dir):
if self is dir:
@@ -2100,7 +2439,8 @@ class RootDir(Dir):
return _null
class FileNodeInfo(SCons.Node.NodeInfoBase):
- current_version_id = 1
+ __slots__ = ('csig', 'timestamp', 'size')
+ current_version_id = 2
field_list = ['csig', 'timestamp', 'size']
@@ -2111,15 +2451,47 @@ class FileNodeInfo(SCons.Node.NodeInfoBase):
top = self.fs.Top
root = top.root
if do_splitdrive:
- drive, s = os.path.splitdrive(s)
+ drive, s = _my_splitdrive(s)
if drive:
root = self.fs.get_root(drive)
if not os.path.isabs(s):
- s = top.labspath + '/' + s
+ s = top.get_labspath() + '/' + s
return root._lookup_abs(s, Entry)
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
class FileBuildInfo(SCons.Node.BuildInfoBase):
- current_version_id = 1
+ __slots__ = ()
+ current_version_id = 2
def convert_to_sconsign(self):
"""
@@ -2129,16 +2501,16 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):
usual string representation: relative to the top-level SConstruct
directory, or an absolute path if it's outside.
"""
- if os.sep == '/':
+ if os_sep_is_slash:
node_to_str = str
else:
def node_to_str(n):
try:
- s = n.path
+ s = n.get_internal_path()
except AttributeError:
s = str(n)
else:
- s = s.replace(os.sep, '/')
+ s = s.replace(OS_SEP, '/')
return s
for attr in ['bsources', 'bdepends', 'bimplicit']:
try:
@@ -2175,6 +2547,8 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):
nodeinfos = getattr(self, sattr)
except AttributeError:
continue
+ if strings is None or nodeinfos is None:
+ continue
nodes = []
for s, ni in zip(strings, nodeinfos):
if not isinstance(s, SCons.Node.Node):
@@ -2188,6 +2562,8 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):
for bkid, bkidsig in zip(bkids, bkidsigs):
result.append(str(bkid) + ': ' +
' '.join(bkidsig.format(names=names)))
+ if not hasattr(self,'bact'):
+ self.bact = "none"
result.append('%s [%s]' % (self.bactsig, self.bact))
return '\n'.join(result)
@@ -2195,7 +2571,22 @@ class File(Base):
"""A class for files in a file system.
"""
- memoizer_counters = []
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'sccs_dir',
+ 'rcs_dir',
+ 'released_target_info',
+ 'contentsig']
NodeInfo = FileNodeInfo
BuildInfo = FileBuildInfo
@@ -2207,7 +2598,7 @@ class File(Base):
"Directory %s found where file expected.")
def __init__(self, name, directory, fs):
- if __debug__: logInstanceCreation(self, 'Node.FS.File')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.File')
Base.__init__(self, name, directory, fs)
self._morph()
@@ -2243,7 +2634,17 @@ class File(Base):
self.scanner_paths = {}
if not hasattr(self, '_local'):
self._local = 0
+ if not hasattr(self, 'released_target_info'):
+ self.released_target_info = False
+ self.store_info = 1
+ self._func_exists = 4
+ self._func_get_contents = 3
+
+ # Initialize this Node's decider function to decide_source() because
+ # every file is a source file until it has a Builder attached...
+ self.changed_since_last_build = 4
+
# If there was already a Builder set on this entry, then
# we need to make sure we call the target-decider function,
# not the source-decider. Reaching in and doing this by hand
@@ -2255,22 +2656,13 @@ class File(Base):
# not clear right now how to fix that, stick with what works
# until it becomes clear...
if self.has_builder():
- self.changed_since_last_build = self.decide_target
+ self.changed_since_last_build = 5
def scanner_key(self):
return self.get_suffix()
def get_contents(self):
- if not self.rexists():
- return ''
- fname = self.rfile().abspath
- try:
- contents = open(fname, "rb").read()
- except EnvironmentError, e:
- if not e.filename:
- e.filename = fname
- raise
- return contents
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
# This attempts to figure out what the encoding of the text is
# based upon the BOM bytes, and then decodes the contents so that
@@ -2297,7 +2689,7 @@ class File(Base):
"""
if not self.rexists():
return SCons.Util.MD5signature('')
- fname = self.rfile().abspath
+ fname = self.rfile().get_abspath()
try:
cs = SCons.Util.MD5filesignature(fname,
chunksize=SCons.Node.FS.File.md5_chunksize*1024)
@@ -2307,9 +2699,7 @@ class File(Base):
raise
return cs
-
- memoizer_counters.append(SCons.Memoize.CountValue('get_size'))
-
+ @SCons.Memoize.CountMethodCall
def get_size(self):
try:
return self._memo['get_size']
@@ -2325,8 +2715,7 @@ class File(Base):
return size
- memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp'))
-
+ @SCons.Memoize.CountMethodCall
def get_timestamp(self):
try:
return self._memo['get_timestamp']
@@ -2342,14 +2731,6 @@ class File(Base):
return timestamp
- def store_info(self):
- # Merge our build information into the already-stored entry.
- # This accomodates "chained builds" where a file that's a target
- # in one build (SConstruct file) is a source in a different build.
- # See test/chained-build.py for the use case.
- if do_store_info:
- self.dir.sconsign().store_info(self.name, self)
-
convert_copy_attrs = [
'bsources',
'bimplicit',
@@ -2462,8 +2843,7 @@ class File(Base):
delattr(old_entry, attr)
return new_entry
- memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info'))
-
+ @SCons.Memoize.CountMethodCall
def get_stored_info(self):
try:
return self._memo['get_stored_info']
@@ -2503,8 +2883,7 @@ class File(Base):
def _get_found_includes_key(self, env, scanner, path):
return (id(env), id(scanner), path)
- memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key))
-
+ @SCons.Memoize.CountDictCall(_get_found_includes_key)
def get_found_includes(self, env, scanner, path):
"""Return the included implicit dependencies in this file.
Cache results so we only scan the file once per path
@@ -2561,7 +2940,7 @@ class File(Base):
so only do thread safe stuff here. Do thread unsafe stuff in
built().
- Returns true iff the node was successfully retrieved.
+ Returns true if the node was successfully retrieved.
"""
if self.nocache:
return None
@@ -2570,7 +2949,7 @@ class File(Base):
return self.get_build_env().get_CacheDir().retrieve(self)
def visited(self):
- if self.exists():
+ if self.exists() and self.executor is not None:
self.get_build_env().get_CacheDir().push_if_forced(self)
ninfo = self.get_ninfo()
@@ -2588,9 +2967,61 @@ class File(Base):
# any build information that's stored in the .sconsign file
# into our binfo object so it doesn't get lost.
old = self.get_stored_info()
- self.get_binfo().__dict__.update(old.binfo.__dict__)
-
- self.store_info()
+ self.get_binfo().merge(old.binfo)
+
+ SCons.Node.store_info_map[self.store_info](self)
+
+ def release_target_info(self):
+ """Called just after this node has been marked
+ up-to-date or was built completely.
+
+ This is where we try to release as many target node infos
+ as possible for clean builds and update runs, in order
+ to minimize the overall memory consumption.
+
+ We'd like to remove a lot more attributes like self.sources
+ and self.sources_set, but they might get used
+ in a next build step. For example, during configuration
+ the source files for a built *.o file are used to figure out
+ which linker to use for the resulting Program (gcc vs. g++)!
+ That's why we check for the 'keep_targetinfo' attribute,
+ config Nodes and the Interactive mode just don't allow
+ an early release of most variables.
+
+ In the same manner, we can't simply remove the self.attributes
+ here. The smart linking relies on the shared flag, and some
+ parts of the java Tool use it to transport information
+ about nodes...
+
+ @see: built() and Node.release_target_info()
+ """
+ if (self.released_target_info or SCons.Node.interactive):
+ return
+
+ if not hasattr(self.attributes, 'keep_targetinfo'):
+ # Cache some required values, before releasing
+ # stuff like env, executor and builder...
+ self.changed(allowcache=True)
+ self.get_contents_sig()
+ self.get_build_env()
+ # Now purge unneeded stuff to free memory...
+ self.executor = None
+ self._memo.pop('rfile', None)
+ self.prerequisites = None
+ # Cleanup lists, but only if they're empty
+ if not len(self.ignore_set):
+ self.ignore_set = None
+ if not len(self.implicit_set):
+ self.implicit_set = None
+ if not len(self.depends_set):
+ self.depends_set = None
+ if not len(self.ignore):
+ self.ignore = None
+ if not len(self.depends):
+ self.depends = None
+ # Mark this node as done, we only have to release
+ # the memory once...
+ self.released_target_info = True
def find_src_builder(self):
if self.rexists():
@@ -2638,6 +3069,8 @@ class File(Base):
def _rmv_existing(self):
self.clear_memoized_values()
+ if SCons.Node.print_duplicate:
+ print "dup: removing existing target %s"%self
e = Unlink(self, [], None)
if isinstance(e, SCons.Errors.BuildError):
raise e
@@ -2672,16 +3105,18 @@ class File(Base):
def remove(self):
"""Remove this file."""
if self.exists() or self.islink():
- self.fs.unlink(self.path)
+ self.fs.unlink(self.get_internal_path())
return 1
return None
def do_duplicate(self, src):
self._createDir()
+ if SCons.Node.print_duplicate:
+ print "dup: relinking variant '%s' from '%s'"%(self, src)
Unlink(self, None, None)
e = Link(self, src, None)
if isinstance(e, SCons.Errors.BuildError):
- desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr)
+ desc = "Cannot duplicate `%s' in `%s': %s." % (src.get_internal_path(), self.dir._path, e.errstr)
raise SCons.Errors.StopError(desc)
self.linked = 1
# The Link() action may or may not have actually
@@ -2690,34 +3125,14 @@ class File(Base):
# _rexists attributes so they can be reevaluated.
self.clear()
- memoizer_counters.append(SCons.Memoize.CountValue('exists'))
-
+ @SCons.Memoize.CountMethodCall
def exists(self):
try:
return self._memo['exists']
except KeyError:
pass
- # Duplicate from source path if we are set up to do this.
- if self.duplicate and not self.is_derived() and not self.linked:
- src = self.srcnode()
- if src is not self:
- # At this point, src is meant to be copied in a variant directory.
- src = src.rfile()
- if src.abspath != self.abspath:
- if src.exists():
- self.do_duplicate(src)
- # Can't return 1 here because the duplication might
- # not actually occur if the -n option is being used.
- else:
- # The source file does not exist. Make sure no old
- # copy remains in the variant directory.
- if Base.exists(self) or self.islink():
- self.fs.unlink(self.path)
- # Return None explicitly because the Base.exists() call
- # above will have cached its value if the file existed.
- self._memo['exists'] = None
- return None
- result = Base.exists(self)
+
+ result = SCons.Node._exists_map[self._func_exists](self)
self._memo['exists'] = result
return result
@@ -2794,7 +3209,53 @@ class File(Base):
def builder_set(self, builder):
SCons.Node.Node.builder_set(self, builder)
- self.changed_since_last_build = self.decide_target
+ self.changed_since_last_build = 5
+
+ def built(self):
+ """Called just after this File node is successfully built.
+
+ Just like for 'release_target_info' we try to release
+ some more target node attributes in order to minimize the
+ overall memory consumption.
+
+ @see: release_target_info
+ """
+
+ SCons.Node.Node.built(self)
+
+ if (not SCons.Node.interactive and
+ not hasattr(self.attributes, 'keep_targetinfo')):
+ # Ensure that the build infos get computed and cached...
+ SCons.Node.store_info_map[self.store_info](self)
+ # ... then release some more variables.
+ self._specific_sources = False
+ self._labspath = None
+ self._save_str()
+ self.cwd = None
+
+ self.scanner_paths = None
+
+ def changed(self, node=None, allowcache=False):
+ """
+ Returns if the node is up-to-date with respect to the BuildInfo
+ stored last time it was built.
+
+ For File nodes this is basically a wrapper around Node.changed(),
+ but we allow the return value to get cached after the reference
+ to the Executor got released in release_target_info().
+
+ @see: Node.changed()
+ """
+ if node is None:
+ try:
+ return self._memo['changed']
+ except KeyError:
+ pass
+
+ has_changed = SCons.Node.Node.changed(self, node)
+ if allowcache:
+ self._memo['changed'] = has_changed
+ return has_changed
def changed_content(self, target, prev_ni):
cur_csig = self.get_csig()
@@ -2827,16 +3288,6 @@ class File(Base):
except AttributeError:
return 1
- def decide_source(self, target, prev_ni):
- return target.get_build_env().decide_source(self, target, prev_ni)
-
- def decide_target(self, target, prev_ni):
- return target.get_build_env().decide_target(self, target, prev_ni)
-
- # Initialize this Node's decider function to decide_source() because
- # every file is a source file until it has a Builder attached...
- changed_since_last_build = decide_source
-
def is_up_to_date(self):
T = 0
if T: Trace('is_up_to_date(%s):' % self)
@@ -2854,7 +3305,7 @@ class File(Base):
e = LocalCopy(self, r, None)
if isinstance(e, SCons.Errors.BuildError):
raise
- self.store_info()
+ SCons.Node.store_info_map[self.store_info](self)
if T: Trace(' 1\n')
return 1
self.changed()
@@ -2865,8 +3316,7 @@ class File(Base):
if T: Trace(' self.exists(): %s\n' % r)
return not r
- memoizer_counters.append(SCons.Memoize.CountValue('rfile'))
-
+ @SCons.Memoize.CountMethodCall
def rfile(self):
try:
return self._memo['rfile']
@@ -2929,25 +3379,50 @@ class File(Base):
self.cachedir_csig = self.get_csig()
return self.cachedir_csig
+ def get_contents_sig(self):
+ """
+ A helper method for get_cachedir_bsig.
+
+ It computes and returns the signature for this
+ node's contents.
+ """
+
+ try:
+ return self.contentsig
+ except AttributeError:
+ pass
+
+ executor = self.get_executor()
+
+ result = self.contentsig = SCons.Util.MD5signature(executor.get_contents())
+ return result
+
def get_cachedir_bsig(self):
+ """
+ Return the signature for a cached file, including
+ its children.
+
+ It adds the path of the cached file to the cache signature,
+ because multiple targets built by the same action will all
+ have the same build signature, and we have to differentiate
+ them somehow.
+ """
try:
return self.cachesig
except AttributeError:
pass
-
- # Add the path to the cache signature, because multiple
- # targets built by the same action will all have the same
- # build signature, and we have to differentiate them somehow.
+
+ # Collect signatures for all children
children = self.children()
- executor = self.get_executor()
- # sigs = [n.get_cachedir_csig() for n in children]
sigs = [n.get_cachedir_csig() for n in children]
- sigs.append(SCons.Util.MD5signature(executor.get_contents()))
- sigs.append(self.path)
+ # Append this node's signature...
+ sigs.append(self.get_contents_sig())
+ # ...and it's path
+ sigs.append(self.get_internal_path())
+ # Merge this all into a single signature
result = self.cachesig = SCons.Util.MD5collect(sigs)
return result
-
default_fs = None
def get_default_fs():
@@ -2959,10 +3434,6 @@ def get_default_fs():
class FileFinder(object):
"""
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
- memoizer_counters = []
def __init__(self):
self._memo = {}
@@ -2982,8 +3453,8 @@ class FileFinder(object):
if fd is None:
fd = self.default_filedir
dir, name = os.path.split(fd)
- drive, d = os.path.splitdrive(dir)
- if not name and d[:1] in ('/', os.sep):
+ drive, d = _my_splitdrive(dir)
+ if not name and d[:1] in ('/', OS_SEP):
#return p.fs.get_root(drive).dir_on_disk(name)
return p.fs.get_root(drive)
if dir:
@@ -3005,8 +3476,7 @@ class FileFinder(object):
def _find_file_key(self, filename, paths, verbose=None):
return (filename, paths)
- memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key))
-
+ @SCons.Memoize.CountDictCall(_find_file_key)
def find_file(self, filename, paths, verbose=None):
"""
find_file(str, [Dir()]) -> [nodes]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Python.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py
index be99d28..b247ff6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/Python.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py
@@ -5,7 +5,7 @@ Python nodes.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,20 +27,54 @@ Python nodes.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Node/Python.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Node/Python.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node
class ValueNodeInfo(SCons.Node.NodeInfoBase):
- current_version_id = 1
+ __slots__ = ('csig',)
+ current_version_id = 2
field_list = ['csig']
def str_to_node(self, s):
return Value(s)
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
class ValueBuildInfo(SCons.Node.BuildInfoBase):
- current_version_id = 1
+ __slots__ = ()
+ current_version_id = 2
class Value(SCons.Node.Node):
"""A class for Python variables, typically passed on the command line
@@ -53,6 +87,8 @@ class Value(SCons.Node.Node):
def __init__(self, value, built_value=None):
SCons.Node.Node.__init__(self)
self.value = value
+ self.changed_since_last_build = 6
+ self.store_info = 0
if built_value is not None:
self.built_value = built_value
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py
index 8d15b58..79db894 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Node/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py
@@ -20,7 +20,7 @@ be able to depend on any other type of "thing."
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -41,12 +41,13 @@ be able to depend on any other type of "thing."
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Node/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Node/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import collections
import copy
from itertools import chain
+import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Executor
import SCons.Memoize
@@ -54,9 +55,15 @@ import SCons.Util
from SCons.Debug import Trace
+print_duplicate = 0
+
def classname(obj):
return str(obj.__class__).split('.')[-1]
+# Set to false if we're doing a dry run. There's more than one of these
+# little treats
+do_store_info = True
+
# Node states
#
# These are in "priority" order, so that the maximum value for any
@@ -95,6 +102,238 @@ def do_nothing(node): pass
Annotate = do_nothing
+# Gets set to 'True' if we're running in interactive mode. Is
+# currently used to release parts of a target's info during
+# clean builds and update runs (see release_target_info).
+interactive = False
+
+def is_derived_none(node):
+ raise NotImplementedError
+
+def is_derived_node(node):
+ """
+ Returns true if this node is derived (i.e. built).
+ """
+ return node.has_builder() or node.side_effect
+
+_is_derived_map = {0 : is_derived_none,
+ 1 : is_derived_node}
+
+def exists_none(node):
+ raise NotImplementedError
+
+def exists_always(node):
+ return 1
+
+def exists_base(node):
+ return node.stat() is not None
+
+def exists_entry(node):
+ """Return if the Entry exists. Check the file system to see
+ what we should turn into first. Assume a file if there's no
+ directory."""
+ node.disambiguate()
+ return _exists_map[node._func_exists](node)
+
+def exists_file(node):
+ # Duplicate from source path if we are set up to do this.
+ if node.duplicate and not node.is_derived() and not node.linked:
+ src = node.srcnode()
+ if src is not node:
+ # At this point, src is meant to be copied in a variant directory.
+ src = src.rfile()
+ if src.get_abspath() != node.get_abspath():
+ if src.exists():
+ node.do_duplicate(src)
+ # Can't return 1 here because the duplication might
+ # not actually occur if the -n option is being used.
+ else:
+ # The source file does not exist. Make sure no old
+ # copy remains in the variant directory.
+ if print_duplicate:
+ print "dup: no src for %s, unlinking old variant copy"%self
+ if exists_base(node) or node.islink():
+ node.fs.unlink(node.get_internal_path())
+ # Return None explicitly because the Base.exists() call
+ # above will have cached its value if the file existed.
+ return None
+ return exists_base(node)
+
+_exists_map = {0 : exists_none,
+ 1 : exists_always,
+ 2 : exists_base,
+ 3 : exists_entry,
+ 4 : exists_file}
+
+
+def rexists_none(node):
+ raise NotImplementedError
+
+def rexists_node(node):
+ return node.exists()
+
+def rexists_base(node):
+ return node.rfile().exists()
+
+_rexists_map = {0 : rexists_none,
+ 1 : rexists_node,
+ 2 : rexists_base}
+
+def get_contents_none(node):
+ raise NotImplementedError
+
+def get_contents_entry(node):
+ """Fetch the contents of the entry. Returns the exact binary
+ contents of the file."""
+ try:
+ node = node.disambiguate(must_exist=1)
+ except SCons.Errors.UserError:
+ # There was nothing on disk with which to disambiguate
+ # this entry. Leave it as an Entry, but return a null
+ # string so calls to get_contents() in emitters and the
+ # like (e.g. in qt.py) don't have to disambiguate by hand
+ # or catch the exception.
+ return ''
+ else:
+ return _get_contents_map[node._func_get_contents](node)
+
+def get_contents_dir(node):
+ """Return content signatures and names of all our children
+ separated by new-lines. Ensure that the nodes are sorted."""
+ contents = []
+ for n in sorted(node.children(), key=lambda t: t.name):
+ contents.append('%s %s\n' % (n.get_csig(), n.name))
+ return ''.join(contents)
+
+def get_contents_file(node):
+ if not node.rexists():
+ return ''
+ fname = node.rfile().get_abspath()
+ try:
+ contents = open(fname, "rb").read()
+ except EnvironmentError, e:
+ if not e.filename:
+ e.filename = fname
+ raise
+ return contents
+
+_get_contents_map = {0 : get_contents_none,
+ 1 : get_contents_entry,
+ 2 : get_contents_dir,
+ 3 : get_contents_file}
+
+def target_from_source_none(node, prefix, suffix, splitext):
+ raise NotImplementedError
+
+def target_from_source_base(node, prefix, suffix, splitext):
+ return node.dir.Entry(prefix + splitext(node.name)[0] + suffix)
+
+_target_from_source_map = {0 : target_from_source_none,
+ 1 : target_from_source_base}
+
+#
+# The new decider subsystem for Nodes
+#
+# We would set and overwrite the changed_since_last_build function
+# before, but for being able to use slots (less memory!) we now have
+# a dictionary of the different decider functions. Then in the Node
+# subclasses we simply store the index to the decider that should be
+# used by it.
+#
+
+#
+# First, the single decider functions
+#
+def changed_since_last_build_node(node, target, prev_ni):
+ """
+
+ Must be overridden in a specific subclass to return True if this
+ Node (a dependency) has changed since the last time it was used
+ to build the specified target. prev_ni is this Node's state (for
+ example, its file timestamp, length, maybe content signature)
+ as of the last time the target was built.
+
+ Note that this method is called through the dependency, not the
+ target, because a dependency Node must be able to use its own
+ logic to decide if it changed. For example, File Nodes need to
+ obey if we're configured to use timestamps, but Python Value Nodes
+ never use timestamps and always use the content. If this method
+ were called through the target, then each Node's implementation
+ of this method would have to have more complicated logic to
+ handle all the different Node types on which it might depend.
+ """
+ raise NotImplementedError
+
+def changed_since_last_build_alias(node, target, prev_ni):
+ cur_csig = node.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+def changed_since_last_build_entry(node, target, prev_ni):
+ node.disambiguate()
+ return _decider_map[node.changed_since_last_build](node, target, prev_ni)
+
+def changed_since_last_build_state_changed(node, target, prev_ni):
+ return (node.state != SCons.Node.up_to_date)
+
+def decide_source(node, target, prev_ni):
+ return target.get_build_env().decide_source(node, target, prev_ni)
+
+def decide_target(node, target, prev_ni):
+ return target.get_build_env().decide_target(node, target, prev_ni)
+
+def changed_since_last_build_python(node, target, prev_ni):
+ cur_csig = node.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+
+#
+# Now, the mapping from indices to decider functions
+#
+_decider_map = {0 : changed_since_last_build_node,
+ 1 : changed_since_last_build_alias,
+ 2 : changed_since_last_build_entry,
+ 3 : changed_since_last_build_state_changed,
+ 4 : decide_source,
+ 5 : decide_target,
+ 6 : changed_since_last_build_python}
+
+do_store_info = True
+
+#
+# The new store_info subsystem for Nodes
+#
+# We would set and overwrite the store_info function
+# before, but for being able to use slots (less memory!) we now have
+# a dictionary of the different functions. Then in the Node
+# subclasses we simply store the index to the info method that should be
+# used by it.
+#
+
+#
+# First, the single info functions
+#
+
+def store_info_pass(node):
+ pass
+
+def store_info_file(node):
+ # Merge our build information into the already-stored entry.
+ # This accommodates "chained builds" where a file that's a target
+ # in one build (SConstruct file) is a source in a different build.
+ # See test/chained-build.py for the use case.
+ if do_store_info:
+ node.dir.sconsign().store_info(node.name, node)
+
+
+store_info_map = {0 : store_info_pass,
+ 1 : store_info_file}
+
# Classes for signature info for Nodes.
class NodeInfoBase(object):
@@ -104,11 +343,8 @@ class NodeInfoBase(object):
Node subclasses should subclass NodeInfoBase to provide their own
logic for dealing with their own Node-specific signature information.
"""
- current_version_id = 1
- def __init__(self, node=None):
- # Create an object attribute from the class attribute so it ends up
- # in the pickled data in the .sconsign file.
- self._version_id = self.current_version_id
+ __slots__ = ('__weakref__',)
+ current_version_id = 2
def update(self, node):
try:
field_list = self.field_list
@@ -128,13 +364,25 @@ class NodeInfoBase(object):
def convert(self, node, val):
pass
def merge(self, other):
- self.__dict__.update(other.__dict__)
+ """
+ Merge the fields of another object into this object. Already existing
+ information is overwritten by the other instance's data.
+ WARNING: If a '__dict__' slot is added, it should be updated instead of
+ replaced.
+ """
+ state = other.__getstate__()
+ self.__setstate__(state)
def format(self, field_list=None, names=0):
if field_list is None:
try:
field_list = self.field_list
except AttributeError:
- field_list = sorted(self.__dict__.keys())
+ field_list = getattr(self, '__dict__', {}).keys()
+ for obj in type(self).mro():
+ for slot in getattr(obj, '__slots__', ()):
+ if slot not in ('__weakref__', '__dict__'):
+ field_list.append(slot)
+ field_list.sort()
fields = []
for field in field_list:
try:
@@ -147,6 +395,38 @@ class NodeInfoBase(object):
fields.append(f)
return fields
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state. The version is discarded.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
class BuildInfoBase(object):
"""
The generic base class for build information for a Node.
@@ -157,33 +437,109 @@ class BuildInfoBase(object):
generic build stuff we have to track: sources, explicit dependencies,
implicit dependencies, and action information.
"""
- current_version_id = 1
- def __init__(self, node=None):
+ __slots__ = ("bsourcesigs", "bdependsigs", "bimplicitsigs", "bactsig",
+ "bsources", "bdepends", "bact", "bimplicit", "__weakref__")
+ current_version_id = 2
+ def __init__(self):
# Create an object attribute from the class attribute so it ends up
# in the pickled data in the .sconsign file.
- self._version_id = self.current_version_id
self.bsourcesigs = []
self.bdependsigs = []
self.bimplicitsigs = []
self.bactsig = None
def merge(self, other):
- self.__dict__.update(other.__dict__)
+ """
+ Merge the fields of another object into this object. Already existing
+ information is overwritten by the other instance's data.
+ WARNING: If a '__dict__' slot is added, it should be updated instead of
+ replaced.
+ """
+ state = other.__getstate__()
+ self.__setstate__(state)
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
class Node(object):
"""The base Node class, for entities that we know how to
build, or use to build other Nodes.
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
- memoizer_counters = []
+ __slots__ = ['sources',
+ 'sources_set',
+ '_specific_sources',
+ 'depends',
+ 'depends_set',
+ 'ignore',
+ 'ignore_set',
+ 'prerequisites',
+ 'implicit',
+ 'waiting_parents',
+ 'waiting_s_e',
+ 'ref_count',
+ 'wkids',
+ 'env',
+ 'state',
+ 'precious',
+ 'noclean',
+ 'nocache',
+ 'cached',
+ 'always_build',
+ 'includes',
+ 'attributes',
+ 'side_effect',
+ 'side_effects',
+ 'linked',
+ '_memo',
+ 'executor',
+ 'binfo',
+ 'ninfo',
+ 'builder',
+ 'is_explicit',
+ 'implicit_set',
+ 'changed_since_last_build',
+ 'store_info',
+ 'pseudo',
+ '_tags',
+ '_func_is_derived',
+ '_func_exists',
+ '_func_rexists',
+ '_func_get_contents',
+ '_func_target_from_source']
class Attrs(object):
- pass
+ __slots__ = ('shared', '__dict__')
+
def __init__(self):
- if __debug__: logInstanceCreation(self, 'Node.Node')
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.Node')
# Note that we no longer explicitly initialize a self.builder
# attribute to None here. That's because the self.builder
# attribute may be created on-the-fly later by a subclass (the
@@ -204,7 +560,7 @@ class Node(object):
self.depends_set = set()
self.ignore = [] # dependencies to ignore
self.ignore_set = set()
- self.prerequisites = SCons.Util.UniqueList()
+ self.prerequisites = None
self.implicit = None # implicit (scanned) dependencies (None means not scanned yet)
self.waiting_parents = set()
self.waiting_s_e = set()
@@ -214,15 +570,25 @@ class Node(object):
self.env = None
self.state = no_state
self.precious = None
+ self.pseudo = False
self.noclean = 0
self.nocache = 0
+ self.cached = 0 # is this node pulled from cache?
self.always_build = None
self.includes = None
self.attributes = self.Attrs() # Generic place to stick information about the Node.
self.side_effect = 0 # true iff this node is a side effect
self.side_effects = [] # the side effects of building this target
self.linked = 0 # is this node linked to the variant directory?
-
+ self.changed_since_last_build = 0
+ self.store_info = 0
+ self._tags = None
+ self._func_is_derived = 1
+ self._func_exists = 1
+ self._func_rexists = 1
+ self._func_get_contents = 0
+ self._func_target_from_source = 0
+
self.clear_memoized_values()
# Let the interface in which the build engine is embedded
@@ -236,8 +602,7 @@ class Node(object):
def get_suffix(self):
return ''
- memoizer_counters.append(SCons.Memoize.CountValue('get_build_env'))
-
+ @SCons.Memoize.CountMethodCall
def get_build_env(self):
"""Fetch the appropriate Environment to build this node.
"""
@@ -285,7 +650,8 @@ class Node(object):
except AttributeError:
pass
else:
- executor.cleanup()
+ if executor is not None:
+ executor.cleanup()
def reset_executor(self):
"Remove cached executor; forces recompute when needed."
@@ -306,7 +672,7 @@ class Node(object):
so only do thread safe stuff here. Do thread unsafe stuff in
built().
- Returns true iff the node was successfully retrieved.
+ Returns true if the node was successfully retrieved.
"""
return 0
@@ -345,10 +711,11 @@ class Node(object):
methods should call this base class method to get the child
check and the BuildInfo structure.
"""
- for d in self.depends:
- if d.missing():
- msg = "Explicit dependency `%s' not found, needed by target `%s'."
- raise SCons.Errors.StopError(msg % (d, self))
+ if self.depends is not None:
+ for d in self.depends:
+ if d.missing():
+ msg = "Explicit dependency `%s' not found, needed by target `%s'."
+ raise SCons.Errors.StopError(msg % (d, self))
if self.implicit is not None:
for i in self.implicit:
if i.missing():
@@ -384,6 +751,13 @@ class Node(object):
self.clear()
+ if self.pseudo:
+ if self.exists():
+ raise SCons.Errors.UserError("Pseudo target " + str(self) + " must not exist")
+ else:
+ if not self.exists() and do_store_info:
+ SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning,
+ "Cannot find target " + str(self) + " after building")
self.ninfo.update(self)
def visited(self):
@@ -397,7 +771,24 @@ class Node(object):
pass
else:
self.ninfo.update(self)
- self.store_info()
+ SCons.Node.store_info_map[self.store_info](self)
+
+ def release_target_info(self):
+ """Called just after this node has been marked
+ up-to-date or was built completely.
+
+ This is where we try to release as many target node infos
+ as possible for clean builds and update runs, in order
+ to minimize the overall memory consumption.
+
+ By purging attributes that aren't needed any longer after
+ a Node (=File) got built, we don't have to care that much how
+ many KBytes a Node actually requires...as long as we free
+ the memory shortly afterwards.
+
+ @see: built() and File.release_target_info()
+ """
+ pass
#
#
@@ -500,7 +891,7 @@ class Node(object):
def is_derived(self):
"""
- Returns true iff this node is derived (i.e. built).
+ Returns true if this node is derived (i.e. built).
This should return true only for nodes whose path should be in
the variant directory when duplicate=0 and should contribute their build
@@ -508,7 +899,7 @@ class Node(object):
example: source with source builders are not derived in this sense,
and hence should not return true.
"""
- return self.has_builder() or self.side_effect
+ return _is_derived_map[self._func_is_derived](self)
def alter_targets(self):
"""Return a list of alternate targets for this Node.
@@ -628,9 +1019,10 @@ class Node(object):
if implicit_deps_unchanged or self.is_up_to_date():
return
# one of this node's sources has changed,
- # so we must recalculate the implicit deps:
- self.implicit = []
- self.implicit_set = set()
+ # so we must recalculate the implicit deps for all targets
+ for tgt in executor.get_all_targets():
+ tgt.implicit = []
+ tgt.implicit_set = set()
# Have the executor scan the sources.
executor.scan_sources(self.builder.source_scanner)
@@ -667,7 +1059,7 @@ class Node(object):
BuildInfo = BuildInfoBase
def new_ninfo(self):
- ninfo = self.NodeInfo(self)
+ ninfo = self.NodeInfo()
return ninfo
def get_ninfo(self):
@@ -678,7 +1070,7 @@ class Node(object):
return self.ninfo
def new_binfo(self):
- binfo = self.BuildInfo(self)
+ binfo = self.BuildInfo()
return binfo
def get_binfo(self):
@@ -763,14 +1155,6 @@ class Node(object):
def get_cachedir_csig(self):
return self.get_csig()
- def store_info(self):
- """Make the build signature permanent (that is, store it in the
- .sconsign file or equivalent)."""
- pass
-
- def do_not_store_info(self):
- pass
-
def get_stored_info(self):
return None
@@ -786,6 +1170,10 @@ class Node(object):
"""Set the Node's precious value."""
self.precious = precious
+ def set_pseudo(self, pseudo = True):
+ """Set the Node's precious value."""
+ self.pseudo = pseudo
+
def set_noclean(self, noclean = 1):
"""Set the Node's noclean value."""
# Make sure noclean is an integer so the --debug=stree
@@ -804,13 +1192,16 @@ class Node(object):
def exists(self):
"""Does this node exists?"""
- # All node exist by default:
- return 1
+ return _exists_map[self._func_exists](self)
def rexists(self):
"""Does this node exist locally or in a repositiory?"""
# There are no repositories by default:
- return self.exists()
+ return _rexists_map[self._func_rexists](self)
+
+ def get_contents(self):
+ """Fetch the contents of the entry."""
+ return _get_contents_map[self._func_get_contents](self)
def missing(self):
return not self.is_derived() and \
@@ -835,6 +1226,8 @@ class Node(object):
def add_prerequisite(self, prerequisite):
"""Adds prerequisites"""
+ if self.prerequisites is None:
+ self.prerequisites = SCons.Util.UniqueList()
self.prerequisites.extend(prerequisite)
self._children_reset()
@@ -896,11 +1289,10 @@ class Node(object):
# build info that it's cached so we can re-calculate it.
self.executor_cleanup()
- memoizer_counters.append(SCons.Memoize.CountValue('_children_get'))
-
+ @SCons.Memoize.CountMethodCall
def _children_get(self):
try:
- return self._memo['children_get']
+ return self._memo['_children_get']
except KeyError:
pass
@@ -922,22 +1314,16 @@ class Node(object):
# dictionary patterns I found all ended up using "not in"
# internally anyway...)
if self.ignore_set:
- if self.implicit is None:
- iter = chain(self.sources,self.depends)
- else:
- iter = chain(self.sources, self.depends, self.implicit)
+ iter = chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit]))
children = []
for i in iter:
if i not in self.ignore_set:
children.append(i)
else:
- if self.implicit is None:
- children = self.sources + self.depends
- else:
- children = self.sources + self.depends + self.implicit
+ children = self.all_children(scan=0)
- self._memo['children_get'] = children
+ self._memo['_children_get'] = children
return children
def all_children(self, scan=1):
@@ -962,10 +1348,7 @@ class Node(object):
# using dictionary keys, lose the order, and the only ordered
# dictionary patterns I found all ended up using "not in"
# internally anyway...)
- if self.implicit is None:
- return self.sources + self.depends
- else:
- return self.sources + self.depends + self.implicit
+ return list(chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit])))
def children(self, scan=1):
"""Return a list of the node's direct children, minus those
@@ -980,9 +1363,6 @@ class Node(object):
def get_state(self):
return self.state
- def state_has_changed(self, target, prev_ni):
- return (self.state != SCons.Node.up_to_date)
-
def get_env(self):
env = self.env
if not env:
@@ -990,30 +1370,30 @@ class Node(object):
env = SCons.Defaults.DefaultEnvironment()
return env
- def changed_since_last_build(self, target, prev_ni):
- """
-
- Must be overridden in a specific subclass to return True if this
- Node (a dependency) has changed since the last time it was used
- to build the specified target. prev_ni is this Node's state (for
- example, its file timestamp, length, maybe content signature)
- as of the last time the target was built.
-
- Note that this method is called through the dependency, not the
- target, because a dependency Node must be able to use its own
- logic to decide if it changed. For example, File Nodes need to
- obey if we're configured to use timestamps, but Python Value Nodes
- never use timestamps and always use the content. If this method
- were called through the target, then each Node's implementation
- of this method would have to have more complicated logic to
- handle all the different Node types on which it might depend.
- """
- raise NotImplementedError
-
def Decider(self, function):
- SCons.Util.AddMethod(self, function, 'changed_since_last_build')
+ foundkey = None
+ for k, v in _decider_map.iteritems():
+ if v == function:
+ foundkey = k
+ break
+ if not foundkey:
+ foundkey = len(_decider_map)
+ _decider_map[foundkey] = function
+ self.changed_since_last_build = foundkey
+
+ def Tag(self, key, value):
+ """ Add a user-defined tag. """
+ if not self._tags:
+ self._tags = {}
+ self._tags[key] = value
+
+ def GetTag(self, key):
+ """ Return a user-defined tag. """
+ if not self._tags:
+ return None
+ return self._tags.get(key, None)
- def changed(self, node=None):
+ def changed(self, node=None, allowcache=False):
"""
Returns if the node is up-to-date with respect to the BuildInfo
stored last time it was built. The default behavior is to compare
@@ -1026,6 +1406,15 @@ class Node(object):
any difference, but we now rely on checking every dependency
to make sure that any necessary Node information (for example,
the content signature of an #included .h file) is updated.
+
+ The allowcache option was added for supporting the early
+ release of the executor/builder structures, right after
+ a File target was built. When set to true, the return
+ value of this changed method gets cached for File nodes.
+ Like this, the executor isn't needed any longer for subsequent
+ calls to changed().
+
+ @see: FS.File.changed(), FS.File.release_target_info()
"""
t = 0
if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node))
@@ -1050,7 +1439,7 @@ class Node(object):
result = True
for child, prev_ni in zip(children, then):
- if child.changed_since_last_build(self, prev_ni):
+ if _decider_map[child.changed_since_last_build](child, self, prev_ni):
if t: Trace(': %s changed' % child)
result = True
@@ -1101,17 +1490,18 @@ class Node(object):
Return a text representation, suitable for displaying to the
user, of the include tree for the sources of this node.
"""
- if self.is_derived() and self.env:
+ if self.is_derived():
env = self.get_build_env()
- for s in self.sources:
- scanner = self.get_source_scanner(s)
- if scanner:
- path = self.get_build_scanner_path(scanner)
- else:
- path = None
- def f(node, env=env, scanner=scanner, path=path):
- return node.get_found_includes(env, scanner, path)
- return SCons.Util.render_tree(s, f, 1)
+ if env:
+ for s in self.sources:
+ scanner = self.get_source_scanner(s)
+ if scanner:
+ path = self.get_build_scanner_path(scanner)
+ else:
+ path = None
+ def f(node, env=env, scanner=scanner, path=path):
+ return node.get_found_includes(env, scanner, path)
+ return SCons.Util.render_tree(s, f, 1)
else:
return None
@@ -1220,7 +1610,7 @@ class Node(object):
for k in new_bkids:
if not k in old_bkids:
lines.append("`%s' is a new dependency\n" % stringify(k))
- elif k.changed_since_last_build(self, osig[k]):
+ elif _decider_map[k.changed_since_last_build](k, self, osig[k]):
lines.append("`%s' changed\n" % stringify(k))
if len(lines) == 0 and old_bkids != new_bkids:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py
index f066a49..c8d901f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/BoolOption.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/BoolOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py
index b541108..58b99ef 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/EnumOption.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/EnumOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py
index abc98a4..00c93d9 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/ListOption.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/ListOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py
index db6cac9..56624f0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/PackageOption.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/PackageOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py
index e31960d..a4b81ec 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/PathOption.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/PathOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py
index 63de8ed..5099712 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Options/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Options/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Options/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Options module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/PathList.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py
index 764b0b8..b359144 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/PathList.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/PathList.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/PathList.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """SCons.PathList
@@ -131,12 +131,14 @@ class _PathList(object):
value = env.subst(value, target=target, source=source,
conv=node_conv)
if SCons.Util.is_Sequence(value):
- result.extend(value)
- continue
-
+ result.extend(SCons.Util.flatten(value))
+ elif value:
+ result.append(value)
elif type == TYPE_OBJECT:
value = node_conv(value)
- if value:
+ if value:
+ result.append(value)
+ elif value:
result.append(value)
return tuple(result)
@@ -169,11 +171,6 @@ class PathListCache(object):
cheaply avoid re-parsing both values of CPPPATH by using the
common value from this cache.
"""
- if SCons.Memoize.use_memoizer:
- __metaclass__ = SCons.Memoize.Memoized_Metaclass
-
- memoizer_counters = []
-
def __init__(self):
self._memo = {}
@@ -194,8 +191,7 @@ class PathListCache(object):
pathlist = tuple(SCons.Util.flatten(pathlist))
return pathlist
- memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key))
-
+ @SCons.Memoize.CountDictCall(_PathList_key)
def PathList(self, pathlist):
"""
Returns the cached _PathList object for the specified pathlist,
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py
index 7e6288d..ca4bc9b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py
@@ -20,7 +20,7 @@ their own platform definition.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -42,7 +42,7 @@ their own platform definition.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
@@ -139,7 +139,7 @@ class TempFileMunge(object):
Example usage:
env["TEMPFILE"] = TempFileMunge
- env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"
+ env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES','$LINKCOMSTR')}"
By default, the name of the temporary file used begins with a
prefix of '@'. This may be configred for other tool chains by
@@ -148,8 +148,9 @@ class TempFileMunge(object):
env["TEMPFILEPREFIX"] = '-@' # diab compiler
env["TEMPFILEPREFIX"] = '-via' # arm tool chain
"""
- def __init__(self, cmd):
+ def __init__(self, cmd, cmdstr = None):
self.cmd = cmd
+ self.cmdstr = cmdstr
def __call__(self, target, source, env, for_signature):
if for_signature:
@@ -173,9 +174,18 @@ class TempFileMunge(object):
length = 0
for c in cmd:
length += len(c)
+ length += len(cmd) - 1
if length <= maxline:
return self.cmd
+ # Check if we already created the temporary file for this target
+ # It should have been previously done by Action.strfunction() call
+ node = target[0] if SCons.Util.is_List(target) else target
+ cmdlist = getattr(node.attributes, 'tempfile_cmdlist', None) \
+ if node is not None else None
+ if cmdlist is not None :
+ return cmdlist
+
# We do a normpath because mktemp() has what appears to be
# a bug in Windows that will use a forward slash as a path
# delimiter. Windows's link mistakes that for a command line
@@ -187,7 +197,7 @@ class TempFileMunge(object):
(fd, tmp) = tempfile.mkstemp('.lnk', text=True)
native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp))
- if env['SHELL'] and env['SHELL'] == 'sh':
+ if env.get('SHELL',None) == 'sh':
# The sh shell will try to escape the backslashes in the
# path, so unescape them.
native_tmp = native_tmp.replace('\\', r'\\\\')
@@ -223,9 +233,22 @@ class TempFileMunge(object):
# purity get in the way of just being helpful, so we'll
# reach into SCons.Action directly.
if SCons.Action.print_actions:
- print("Using tempfile "+native_tmp+" for command line:\n"+
- str(cmd[0]) + " " + " ".join(args))
- return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]
+ cmdstr = env.subst(self.cmdstr, SCons.Subst.SUBST_RAW, target,
+ source) if self.cmdstr is not None else ''
+ # Print our message only if XXXCOMSTR returns an empty string
+ if len(cmdstr) == 0 :
+ print("Using tempfile "+native_tmp+" for command line:\n"+
+ str(cmd[0]) + " " + " ".join(args))
+
+ # Store the temporary file command list into the target Node.attributes
+ # to avoid creating two temporary files one for print and one for execute.
+ cmdlist = [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]
+ if node is not None:
+ try :
+ setattr(node.attributes, 'tempfile_cmdlist', cmdlist)
+ except AttributeError:
+ pass
+ return cmdlist
def Platform(name = platform_default()):
"""Select a canned Platform specification.
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/aix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py
index e729bcb..44bccd1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/aix.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,13 +30,17 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/aix.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/aix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
+import subprocess
import posix
-def get_xlc(env, xlc=None, xlc_r=None, packages=[]):
+import SCons.Util
+import SCons.Action
+
+def get_xlc(env, xlc=None, packages=[]):
# Use the AIX package installer tool lslpp to figure out where a
# given xl* compiler is installed and what version it is.
xlcPath = None
@@ -44,18 +48,30 @@ def get_xlc(env, xlc=None, xlc_r=None, packages=[]):
if xlc is None:
xlc = env.get('CC', 'xlc')
- if xlc_r is None:
- xlc_r = xlc + '_r'
+ if SCons.Util.is_List(xlc):
+ xlc = xlc[0]
for package in packages:
- cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'"
- line = os.popen(cmd).readline()
- if line:
- v, p = line.split(':')[1:3]
- xlcVersion = v.split()[1]
- xlcPath = p.split()[0]
- xlcPath = xlcPath[:xlcPath.rindex('/')]
- break
- return (xlcPath, xlc, xlc_r, xlcVersion)
+ # find the installed filename, which may be a symlink as well
+ pipe = SCons.Action._subproc(env, ['lslpp', '-fc', package],
+ stdin = 'devnull',
+ stderr = 'devnull',
+ stdout = subprocess.PIPE)
+ # output of lslpp is something like this:
+ # #Path:Fileset:File
+ # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/exe/xlCcpp
+ # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/bin/xlc_r -> /usr/vac/bin/xlc
+ for line in pipe.stdout:
+ if xlcPath:
+ continue # read everything to let lslpp terminate
+ fileset, filename = line.split(':')[1:3]
+ filename = filename.split()[0]
+ if ('/' in xlc and filename == xlc) \
+ or ('/' not in xlc and filename.endswith('/' + xlc)):
+ xlcVersion = fileset.split()[1]
+ xlcPath, sep, xlc = filename.rpartition('/')
+ pass
+ pass
+ return (xlcPath, xlc, xlcVersion)
def generate(env):
posix.generate(env)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py
index 854a2c5..d04bbe7 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/cygwin.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/cygwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import posix
from SCons.Platform import TempFileMunge
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py
new file mode 100644
index 0000000..efd8ba4
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py
@@ -0,0 +1,70 @@
+"""engine.SCons.Platform.darwin
+
+Platform-specific initialization for Mac OS X systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/darwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import posix
+import os
+
+def generate(env):
+ posix.generate(env)
+ env['SHLIBSUFFIX'] = '.dylib'
+ # put macports paths at front to override Apple's versions, fink path is after
+ # For now let people who want Macports or Fink tools specify it!
+ # env['ENV']['PATH'] = '/opt/local/bin:/opt/local/sbin:' + env['ENV']['PATH'] + ':/sw/bin'
+
+ # Store extra system paths in env['ENV']['PATHOSX']
+
+ filelist = ['/etc/paths',]
+ # make sure this works on Macs with Tiger or earlier
+ try:
+ dirlist = os.listdir('/etc/paths.d')
+ except:
+ dirlist = []
+
+ for file in dirlist:
+ filelist.append('/etc/paths.d/'+file)
+
+ for file in filelist:
+ if os.path.isfile(file):
+ f = open(file, 'r')
+ lines = f.readlines()
+ for line in lines:
+ if line:
+ env.AppendENVPath('PATHOSX', line.strip('\n'))
+ f.close()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py
index 4544dfb..2e2fbca 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/hpux.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/hpux.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import posix
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/irix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py
index 3daebf5..3bedbdf 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/irix.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/irix.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/irix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import posix
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/os2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py
index e74a22c..82eb163 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/os2.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/os2.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/os2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import win32
def generate(env):
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py
new file mode 100644
index 0000000..8445863
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py
@@ -0,0 +1,124 @@
+"""SCons.Platform.posix
+
+Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Platform/posix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import errno
+import os
+import os.path
+import subprocess
+import sys
+import select
+
+import SCons.Util
+from SCons.Platform import TempFileMunge
+
+exitvalmap = {
+ 2 : 127,
+ 13 : 126,
+}
+
+def escape(arg):
+ "escape shell special characters"
+ slash = '\\'
+ special = '"$()'
+
+ arg = arg.replace(slash, slash+slash)
+ for c in special:
+ arg = arg.replace(c, slash+c)
+
+ return '"' + arg + '"'
+
+def exec_subprocess(l, env):
+ proc = subprocess.Popen(l, env = env, close_fds = True)
+ return proc.wait()
+
+def subprocess_spawn(sh, escape, cmd, args, env):
+ return exec_subprocess([sh, '-c', ' '.join(args)], env)
+
+def exec_popen3(l, env, stdout, stderr):
+ proc = subprocess.Popen(l, env = env, close_fds = True,
+ stdout = stdout,
+ stderr = stderr)
+ return proc.wait()
+
+def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr):
+ # spawn using Popen3 combined with the env command
+ # the command name and the command's stdout is written to stdout
+ # the command's stderr is written to stderr
+ return exec_popen3([sh, '-c', ' '.join(args)],
+ env, stdout, stderr)
+
+
+def generate(env):
+ # Bearing in mind we have python 2.4 as a baseline, we can just do this:
+ spawn = subprocess_spawn
+ pspawn = piped_env_spawn
+ # Note that this means that 'escape' is no longer used
+
+ if 'ENV' not in env:
+ env['ENV'] = {}
+ env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin'
+ env['OBJPREFIX'] = ''
+ env['OBJSUFFIX'] = '.o'
+ env['SHOBJPREFIX'] = '$OBJPREFIX'
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ env['PROGPREFIX'] = ''
+ env['PROGSUFFIX'] = ''
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+ env['SHLIBPREFIX'] = '$LIBPREFIX'
+ env['SHLIBSUFFIX'] = '.so'
+ env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+ env['PSPAWN'] = pspawn
+ env['SPAWN'] = spawn
+ env['SHELL'] = 'sh'
+ env['ESCAPE'] = escape
+ env['TEMPFILE'] = TempFileMunge
+ env['TEMPFILEPREFIX'] = '@'
+ #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
+ #Note: specific platforms might rise or lower this value
+ env['MAXLINELENGTH'] = 128072
+
+ # This platform supports RPATH specifications.
+ env['__RPATH'] = '$_RPATH'
+
+ # GDC is GCC family, but DMD and LDC have different options.
+ # Must be able to have GCC and DMD work in the same build, so:
+ env['__DRPATH'] = '$_DRPATH'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py
index f855aa8..1c1d797 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/sunos.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/sunos.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import posix
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/win32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py
index 57d9bdc..3bad86b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/win32.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/win32.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Platform/win32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
@@ -64,13 +64,12 @@ else:
_builtin_file = builtins.file
_builtin_open = builtins.open
-
- def _scons_file(*args, **kw):
- fp = _builtin_file(*args, **kw)
- win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()),
- win32con.HANDLE_FLAG_INHERIT,
- 0)
- return fp
+
+ class _scons_file(_builtin_file):
+ def __init__(self, *args, **kw):
+ _builtin_file.__init__(self, *args, **kw)
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(self.fileno()),
+ win32con.HANDLE_FLAG_INHERIT, 0)
def _scons_open(*args, **kw):
fp = _builtin_open(*args, **kw)
@@ -82,8 +81,39 @@ else:
builtins.file = _scons_file
builtins.open = _scons_open
-
-
+try:
+ import threading
+ spawn_lock = threading.Lock()
+
+ # This locked version of spawnve works around a Windows
+ # MSVCRT bug, because its spawnve is not thread-safe.
+ # Without this, python can randomly crash while using -jN.
+ # See the python bug at http://bugs.python.org/issue6476
+ # and SCons issue at
+ # http://scons.tigris.org/issues/show_bug.cgi?id=2449
+ def spawnve(mode, file, args, env):
+ spawn_lock.acquire()
+ try:
+ if mode == os.P_WAIT:
+ ret = os.spawnve(os.P_NOWAIT, file, args, env)
+ else:
+ ret = os.spawnve(mode, file, args, env)
+ finally:
+ spawn_lock.release()
+ if mode == os.P_WAIT:
+ pid, status = os.waitpid(ret, 0)
+ ret = status >> 8
+ return ret
+except ImportError:
+ # Use the unsafe method of spawnve.
+ # Please, don't try to optimize this try-except block
+ # away by assuming that the threading module is always present.
+ # In the test test/option-j.py we intentionally call SCons with
+ # a fake threading.py that raises an import exception right away,
+ # simulating a non-existent package.
+ def spawnve(mode, file, args, env):
+ return os.spawnve(mode, file, args, env)
+
# The upshot of all this is that, if you are using Python 1.5.2,
# you had better have cmd or command.com in your PATH when you run
# scons.
@@ -124,7 +154,7 @@ def piped_spawn(sh, escape, cmd, args, env, stdout, stderr):
# actually do the spawn
try:
args = [sh, '/C', escape(' '.join(args)) ]
- ret = os.spawnve(os.P_WAIT, sh, args, env)
+ ret = spawnve(os.P_WAIT, sh, args, env)
except OSError, e:
# catch any error
try:
@@ -152,7 +182,7 @@ def piped_spawn(sh, escape, cmd, args, env, stdout, stderr):
def exec_spawn(l, env):
try:
- result = os.spawnve(os.P_WAIT, l[0], l, env)
+ result = spawnve(os.P_WAIT, l[0], l, env)
except OSError, e:
try:
result = exitvalmap[e[0]]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py
index bce935e..2ef4003 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConf.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py
@@ -1,10 +1,18 @@
"""SCons.SConf
Autoconf-like configuration support.
+
+In other words, SConf allows to run tests on the build machine to detect
+capabilities of system and do some things based on result: generate config
+files, header files for C/C++, update variables in environment.
+
+Tests on the build system can detect if compiler sees header files, if
+libraries are installed, if some command line options are supported etc.
+
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +34,7 @@ Autoconf-like configuration support.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/SConf.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/SConf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
@@ -110,16 +118,22 @@ def _createConfigH(target, source, env):
def _stringConfigH(target, source, env):
return "scons: Configure: creating " + str(target[0])
-def CreateConfigHBuilder(env):
- """Called just before the building targets phase begins."""
+
+def NeedConfigHBuilder():
if len(_ac_config_hs) == 0:
- return
+ return False
+ else:
+ return True
+
+def CreateConfigHBuilder(env):
+ """Called if necessary just before the building targets phase begins."""
action = SCons.Action.Action(_createConfigH,
_stringConfigH)
sconfigHBld = SCons.Builder.Builder(action=action)
env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} )
for k in _ac_config_hs.keys():
env.SConfigHBuilder(k, env.Value(_ac_config_hs[k]))
+
class SConfWarning(SCons.Warnings.Warning):
pass
@@ -161,8 +175,11 @@ class SConfBuildInfo(SCons.Node.FS.FileBuildInfo):
are result (did the builder succeed last time?) and string, which
contains messages of the original build phase.
"""
- result = None # -> 0/None -> no error, != 0 error
- string = None # the stdout / stderr output when building the target
+ __slots__ = ('result', 'string')
+
+ def __init__(self):
+ self.result = None # -> 0/None -> no error, != 0 error
+ self.string = None # the stdout / stderr output when building the target
def set_build_result(self, result, string):
self.result = result
@@ -180,7 +197,11 @@ class Streamer(object):
def write(self, str):
if self.orig:
self.orig.write(str)
- self.s.write(str)
+ try:
+ self.s.write(str)
+ except TypeError as e:
+ # "unicode argument expected" bug in IOStream (python 2.x)
+ self.s.write(str.decode())
def writelines(self, lines):
for l in lines:
@@ -334,8 +355,10 @@ class SConfBuildTask(SCons.Taskmaster.AlwaysTask):
raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)
except Exception, e:
for t in self.targets:
- binfo = t.get_binfo()
- binfo.__class__ = SConfBuildInfo
+ #binfo = t.get_binfo()
+ #binfo.__class__ = SConfBuildInfo
+ binfo = SConfBuildInfo()
+ binfo.merge(t.get_binfo())
binfo.set_build_result(1, s.getvalue())
sconsign_entry = SCons.SConsign.SConsignEntry()
sconsign_entry.binfo = binfo
@@ -352,8 +375,10 @@ class SConfBuildTask(SCons.Taskmaster.AlwaysTask):
raise e
else:
for t in self.targets:
- binfo = t.get_binfo()
- binfo.__class__ = SConfBuildInfo
+ #binfo = t.get_binfo()
+ #binfo.__class__ = SConfBuildInfo
+ binfo = SConfBuildInfo()
+ binfo.merge(t.get_binfo())
binfo.set_build_result(0, s.getvalue())
sconsign_entry = SCons.SConsign.SConsignEntry()
sconsign_entry.binfo = binfo
@@ -482,7 +507,10 @@ class SConfBase(object):
# we override the store_info() method with a null place-holder
# so we really control how it gets written.
for n in nodes:
- n.store_info = n.do_not_store_info
+ n.store_info = 0
+ if not hasattr(n, 'attributes'):
+ n.attributes = SCons.Node.Node.Attrs()
+ n.attributes.keep_targetinfo = 1
ret = 1
@@ -619,7 +647,7 @@ class SConfBase(object):
ok = self.TryLink(text, extension)
if( ok ):
prog = self.lastTarget
- pname = prog.path
+ pname = prog.get_internal_path()
output = self.confdir.File(os.path.basename(pname)+'.out')
node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ])
ok = self.BuildNodes(node)
@@ -663,7 +691,6 @@ class SConfBase(object):
else:
if not os.path.isdir( dirName ):
os.makedirs( dirName )
- node._exists = 1
def _startup(self):
"""Private method. Set up logstream, and set the environment
@@ -776,19 +803,16 @@ class CheckContext(object):
self.did_show_result = 0
def Result(self, res):
- """Inform about the result of the test. res may be an integer or a
- string. In case of an integer, the written text will be 'yes' or 'no'.
+ """Inform about the result of the test. If res is not a string, displays
+ 'yes' or 'no' depending on whether res is evaluated as true or false.
The result is only displayed when self.did_show_result is not set.
"""
- if isinstance(res, (int, bool)):
- if res:
- text = "yes"
- else:
- text = "no"
- elif isinstance(res, str):
+ if isinstance(res, str):
text = res
+ elif res:
+ text = "yes"
else:
- raise TypeError("Expected string, int or bool, got " + str(type(res)))
+ text = "no"
if self.did_show_result == 0:
# Didn't show result yet, do it now.
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConsign.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py
index 25f8486..e31a3eb 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/SConsign.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py
@@ -5,7 +5,7 @@ Writing and reading information to the .sconsign file or files.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ Writing and reading information to the .sconsign file or files.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/SConsign.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/SConsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
@@ -104,9 +104,15 @@ def write():
try:
syncmethod = db.sync
except AttributeError:
- pass # Not all anydbm modules have sync() methods.
+ pass # Not all dbm modules have sync() methods.
else:
syncmethod()
+ try:
+ closemethod = db.close
+ except AttributeError:
+ pass # Not all dbm modules have close() methods.
+ else:
+ closemethod()
class SConsignEntry(object):
"""
@@ -116,16 +122,40 @@ class SConsignEntry(object):
XXX As coded below, we do expect a '.binfo' attribute to be added,
but we'll probably generalize this in the next refactorings.
"""
- current_version_id = 1
+ __slots__ = ("binfo", "ninfo", "__weakref__")
+ current_version_id = 2
+
def __init__(self):
# Create an object attribute from the class attribute so it ends up
# in the pickled data in the .sconsign file.
- _version_id = self.current_version_id
+ #_version_id = self.current_version_id
+ pass
+
def convert_to_sconsign(self):
self.binfo.convert_to_sconsign()
+
def convert_from_sconsign(self, dir, name):
self.binfo.convert_from_sconsign(dir, name)
+ def __getstate__(self):
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ for key, value in state.items():
+ if key not in ('_version_id','__weakref__'):
+ setattr(self, key, value)
+
class Base(object):
"""
This is the controlling class for the signatures for the collection of
@@ -196,7 +226,7 @@ class DB(Base):
# Read using the path relative to the top of the Repository
# (self.dir.tpath) from which we're fetching the signature
# information.
- path = normcase(dir.tpath)
+ path = normcase(dir.get_tpath())
try:
rawentries = db[path]
except KeyError:
@@ -211,7 +241,7 @@ class DB(Base):
raise
except Exception, e:
SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
- "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e))
+ "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.get_tpath(), e))
for key, entry in self.entries.items():
entry.convert_from_sconsign(dir, key)
@@ -238,7 +268,7 @@ class DB(Base):
# directory (self.dir.path), not relative to the top of
# the Repository; we only write to our own .sconsign file,
# not to .sconsign files in Repositories.
- path = normcase(self.dir.path)
+ path = normcase(self.dir.get_internal_path())
for key, entry in self.entries.items():
entry.convert_to_sconsign()
db[path] = pickle.dumps(self.entries, 1)
@@ -281,7 +311,7 @@ class DirFile(Dir):
"""
self.dir = dir
- self.sconsign = os.path.join(dir.path, '.sconsign')
+ self.sconsign = os.path.join(dir.get_internal_path(), '.sconsign')
try:
fp = open(self.sconsign, 'rb')
@@ -317,7 +347,7 @@ class DirFile(Dir):
self.merge()
- temp = os.path.join(self.dir.path, '.scons%d' % os.getpid())
+ temp = os.path.join(self.dir.get_internal_path(), '.scons%d' % os.getpid())
try:
file = open(temp, 'wb')
fname = temp
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/C.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py
index 598d3b1..33e1145 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/C.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py
@@ -5,7 +5,7 @@ This module implements the depenency scanner for C/C++ code.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ This module implements the depenency scanner for C/C++ code.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/C.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/C.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node.FS
import SCons.Scanner
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/D.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py
index 04bb5a7..2c51a09 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/D.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py
@@ -8,7 +8,7 @@ Coded by Andy Friesen
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ Coded by Andy Friesen
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/D.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/D.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import re
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py
index 172aa62..7565423 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -20,7 +20,7 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Scanner/Dir.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/Dir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node.FS
import SCons.Scanner
@@ -77,7 +77,7 @@ def scan_on_disk(node, env, path=()):
that and then call the in-memory scanning function.
"""
try:
- flist = node.fs.listdir(node.abspath)
+ flist = node.fs.listdir(node.get_abspath())
except (IOError, OSError):
return []
e = node.Entry
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py
index 8d023e7..a1f3927 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py
@@ -5,7 +5,7 @@ This module implements the dependency scanner for Fortran code.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ This module implements the dependency scanner for Fortran code.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Scanner/Fortran.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/Fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import re
@@ -89,11 +89,11 @@ class F90Scanner(SCons.Scanner.Classic):
defmodules = self.cre_def.findall(node.get_text_contents())
# Remove all USE'd module names that are defined in the same file
+ # (case-insensitively)
d = {}
for m in defmodules:
- d[m] = 1
- modules = [m for m in modules if m not in d]
- #modules = self.undefinedModules(modules, defmodules)
+ d[m.lower()] = 1
+ modules = [m for m in modules if m.lower() not in d]
# Convert module name to a .mod filename
suffix = env.subst('$FORTRANMODSUFFIX')
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py
index 507b9e1..6758bd2 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py
@@ -6,7 +6,7 @@ Definition Language) files.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,7 +28,7 @@ Definition Language) files.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/IDL.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/IDL.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node.FS
import SCons.Scanner
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py
index 77be34c..aed074c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py
@@ -5,7 +5,7 @@ This module implements the dependency scanner for LaTeX code.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ This module implements the dependency scanner for LaTeX code.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/LaTeX.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/LaTeX.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
@@ -148,6 +148,8 @@ class LaTeX(SCons.Scanner.Base):
env['TEXINPUTS'] for "lstinputlisting" keyword
env['BIBINPUTS'] for "bibliography" keyword
env['BSTINPUTS'] for "bibliographystyle" keyword
+ env['INDEXSTYLE'] for "makeindex" keyword, no scanning support needed
+ just allows user to set it if needed.
FIXME: also look for the class or style in document[class|style]{}
FIXME: also look for the argument of bibliographystyle{}
@@ -157,6 +159,10 @@ class LaTeX(SCons.Scanner.Base):
'includegraphics': 'TEXINPUTS',
'bibliography': 'BIBINPUTS',
'bibliographystyle': 'BSTINPUTS',
+ 'addbibresource': 'BIBINPUTS',
+ 'addglobalbib': 'BIBINPUTS',
+ 'addsectionbib': 'BIBINPUTS',
+ 'makeindex': 'INDEXSTYLE',
'usepackage': 'TEXINPUTS',
'lstinputlisting': 'TEXINPUTS'}
env_variables = SCons.Util.unique(list(keyword_paths.values()))
@@ -168,8 +174,11 @@ class LaTeX(SCons.Scanner.Base):
# Without the \n, the ^ could match the beginning of a *previous*
# line followed by one or more newline characters (i.e. blank
# lines), interfering with a match on the next line.
- regex = r'^[^%\n]*\\(include|includegraphics(?:\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|usepackage){([^}]*)}'
+ # add option for whitespace before the '[options]' or the '{filename}'
+ regex = r'^[^%\n]*\\(include|includegraphics(?:\s*\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|addbibresource|addglobalbib|addsectionbib|usepackage)\s*{([^}]*)}'
self.cre = re.compile(regex, re.M)
+ self.comment_re = re.compile(r'^((?:(?:\\%)|[^%\n])*)(.*)$', re.M)
+
self.graphics_extensions = graphics_extensions
def _scan(node, env, path=(), self=self):
@@ -274,6 +283,23 @@ class LaTeX(SCons.Scanner.Base):
return i, include
return i, include
+ def canonical_text(self, text):
+ """Standardize an input TeX-file contents.
+
+ Currently:
+ * removes comments, unwrapping comment-wrapped lines.
+ """
+ out = []
+ line_continues_a_comment = False
+ for line in text.splitlines():
+ line,comment = self.comment_re.findall(line)[0]
+ if line_continues_a_comment == True:
+ out[-1] = out[-1] + line.lstrip()
+ else:
+ out.append(line)
+ line_continues_a_comment = len(comment) > 0
+ return '\n'.join(out).rstrip()+'\n'
+
def scan(self, node):
# Modify the default scan function to allow for the regular
# expression to return a comma separated list of file names
@@ -281,11 +307,13 @@ class LaTeX(SCons.Scanner.Base):
# Cache the includes list in node so we only scan it once:
# path_dict = dict(list(path))
- noopt_cre = re.compile('\[.*$')
+ # add option for whitespace (\s) before the '['
+ noopt_cre = re.compile('\s*\[.*$')
if node.includes != None:
includes = node.includes
else:
- includes = self.cre.findall(node.get_text_contents())
+ text = self.canonical_text(node.get_text_contents())
+ includes = self.cre.findall(text)
# 1. Split comma-separated lines, e.g.
# ('bibliography', 'phys,comp')
# should become two entries
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py
index 97f25b3..c0511dc 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/Prog.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/Prog.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node
import SCons.Node.FS
@@ -38,6 +38,24 @@ def ProgramScanner(**kw):
ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw)
return ps
+def _subst_libs(env, libs):
+ """
+ Substitute environment variables and split into list.
+ """
+ if SCons.Util.is_String(libs):
+ libs = env.subst(libs)
+ if SCons.Util.is_String(libs):
+ libs = libs.split()
+ elif SCons.Util.is_Sequence(libs):
+ _libs = []
+ for l in libs:
+ _libs += _subst_libs(env, l)
+ libs = _libs
+ else:
+ # libs is an object (Node, for example)
+ libs = [libs]
+ return libs
+
def scan(node, env, libpath = ()):
"""
This scanner scans program files for static-library
@@ -50,10 +68,8 @@ def scan(node, env, libpath = ()):
except KeyError:
# There are no LIBS in this environment, so just return a null list:
return []
- if SCons.Util.is_String(libs):
- libs = libs.split()
- else:
- libs = SCons.Util.flatten(libs)
+
+ libs = _subst_libs(env, libs)
try:
prefix = env['LIBPREFIXES']
@@ -83,7 +99,6 @@ def scan(node, env, libpath = ()):
adjustixes = SCons.Util.adjustixes
for lib in libs:
if SCons.Util.is_String(lib):
- lib = env.subst(lib)
for pref, suf in pairs:
l = adjustixes(lib, pref, suf)
l = find_file(l, libpath, verbose=print_find_libs)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py
index de7744b..f73b47e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py
@@ -6,7 +6,7 @@ Definition Language) files.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,7 +28,7 @@ Definition Language) files.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/RC.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/RC.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Node.FS
import SCons.Scanner
@@ -40,7 +40,7 @@ def RCScan():
res_re= r'^(?:\s*#\s*(?:include)|' \
'.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \
'\s*.*?)' \
- '\s*(<|"| )([^>"\s]+)(?:[>" ])*$'
+ '\s*(<|"| )([^>"\s]+)(?:[>"\s])*$'
resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner",
"$RCSUFFIXES",
"CPPPATH",
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py
index 2a6f299..d51cb9e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py
@@ -5,7 +5,7 @@ The Scanner package for the SCons software construction utility.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ The Scanner package for the SCons software construction utility.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Scanner/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Scanner/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import re
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py
index 52fc753..afcde0c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -20,7 +20,7 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Script/Interactive.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Script/Interactive.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
SCons interactive mode
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Main.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py
index 2bd1560..6684fbd 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/Main.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py
@@ -11,9 +11,9 @@ it goes here.
"""
unsupported_python_version = (2, 3, 0)
-deprecated_python_version = (2, 4, 0)
+deprecated_python_version = (2, 7, 0)
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -34,7 +34,7 @@ deprecated_python_version = (2, 4, 0)
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Script/Main.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Script/Main.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
@@ -60,6 +60,7 @@ import SCons.Errors
import SCons.Job
import SCons.Node
import SCons.Node.FS
+import SCons.Platform
import SCons.SConf
import SCons.Script
import SCons.Taskmaster
@@ -78,7 +79,12 @@ def fetch_win32_parallel_msg():
import SCons.Platform.win32
return SCons.Platform.win32.parallel_msg
-#
+def revert_io():
+ # This call is added to revert stderr and stdout to the original
+ # ones just in case some build rule or something else in the system
+ # has redirected them elsewhere.
+ sys.stderr = sys.__stderr__
+ sys.stdout = sys.__stdout__
class SConsPrintHelpException(Exception):
pass
@@ -186,7 +192,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):
finish_time = time.time()
last_command_end = finish_time
cumulative_command_time = cumulative_command_time+finish_time-start_time
- sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time))
+ sys.stdout.write("Command execution time: %s: %f seconds\n"%(str(self.node), finish_time-start_time))
def do_failed(self, status=2):
_BuildFailures.append(self.exception[1])
@@ -202,13 +208,13 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):
SCons.Taskmaster.OutOfDateTask.fail_stop(self)
exit_status = status
this_build_status = status
-
+
def executed(self):
t = self.targets[0]
if self.top and not t.has_builder() and not t.side_effect:
if not t.exists():
if t.__class__.__name__ in ('File', 'Dir', 'Entry'):
- errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.abspath)
+ errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.get_abspath())
else: # Alias or Python or ...
errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t)
sys.stderr.write("scons: *** " + errstr)
@@ -247,7 +253,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):
except ValueError:
t, e = exc_info
tb = None
-
+
# Deprecated string exceptions will have their string stored
# in the first entry of the tuple.
if e is None:
@@ -265,12 +271,15 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):
errfmt = "scons: *** [%s] %s\n"
sys.stderr.write(errfmt % (nodename, buildError))
- if (buildError.exc_info[2] and buildError.exc_info[1] and
+ if (buildError.exc_info[2] and buildError.exc_info[1] and
not isinstance(
- buildError.exc_info[1],
+ buildError.exc_info[1],
(EnvironmentError, SCons.Errors.StopError,
SCons.Errors.UserError))):
type, value, trace = buildError.exc_info
+ if tb and print_stacktrace:
+ sys.stderr.write("scons: internal stack trace:\n")
+ traceback.print_tb(tb, file=sys.stderr)
traceback.print_exception(type, value, trace)
elif tb and print_stacktrace:
sys.stderr.write("scons: internal stack trace:\n")
@@ -303,7 +312,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):
class CleanTask(SCons.Taskmaster.AlwaysTask):
"""An SCons clean task."""
- def fs_delete(self, path, pathstr, remove=1):
+ def fs_delete(self, path, pathstr, remove=True):
try:
if os.path.lexists(path):
if os.path.isfile(path) or os.path.islink(path):
@@ -330,37 +339,41 @@ class CleanTask(SCons.Taskmaster.AlwaysTask):
except (IOError, OSError), e:
print "scons: Could not remove '%s':" % pathstr, e.strerror
- def show(self):
+ def _get_files_to_clean(self):
+ result = []
target = self.targets[0]
- if (target.has_builder() or target.side_effect) and not target.noclean:
- for t in self.targets:
- if not t.isdir():
- display("Removed " + str(t))
- if target in SCons.Environment.CleanTargets:
- files = SCons.Environment.CleanTargets[target]
- for f in files:
- self.fs_delete(f.abspath, str(f), 0)
+ if target.has_builder() or target.side_effect:
+ result = [t for t in self.targets if not t.noclean]
+ return result
- def remove(self):
+ def _clean_targets(self, remove=True):
target = self.targets[0]
- if (target.has_builder() or target.side_effect) and not target.noclean:
- for t in self.targets:
- try:
- removed = t.remove()
- except OSError, e:
- # An OSError may indicate something like a permissions
- # issue, an IOError would indicate something like
- # the file not existing. In either case, print a
- # message and keep going to try to remove as many
- # targets aa possible.
- print "scons: Could not remove '%s':" % str(t), e.strerror
- else:
- if removed:
- display("Removed " + str(t))
if target in SCons.Environment.CleanTargets:
files = SCons.Environment.CleanTargets[target]
for f in files:
- self.fs_delete(f.abspath, str(f))
+ self.fs_delete(f.get_abspath(), str(f), remove)
+
+ def show(self):
+ for t in self._get_files_to_clean():
+ if not t.isdir():
+ display("Removed " + str(t))
+ self._clean_targets(remove=False)
+
+ def remove(self):
+ for t in self._get_files_to_clean():
+ try:
+ removed = t.remove()
+ except OSError, e:
+ # An OSError may indicate something like a permissions
+ # issue, an IOError would indicate something like
+ # the file not existing. In either case, print a
+ # message and keep going to try to remove as many
+ # targets aa possible.
+ print "scons: Could not remove '%s':" % str(t), e.strerror
+ else:
+ if removed:
+ display("Removed " + str(t))
+ self._clean_targets(remove=True)
execute = remove
@@ -545,7 +558,7 @@ def find_deepest_user_frame(tb):
Input is a "pre-processed" stack trace in the form
returned by traceback.extract_tb() or traceback.extract_stack()
"""
-
+
tb.reverse()
# find the deepest traceback frame that is not part
@@ -558,7 +571,7 @@ def find_deepest_user_frame(tb):
def _scons_user_error(e):
"""Handle user errors. Print out a message and a description of the
- error, along with the line number and routine where it occured.
+ error, along with the line number and routine where it occured.
The file and line number will be the deepest stack frame that is
not part of SCons itself.
"""
@@ -621,7 +634,7 @@ def _set_debug_values(options):
debug_values = options.debug
if "count" in debug_values:
- # All of the object counts are within "if __debug__:" blocks,
+ # All of the object counts are within "if track_instances:" blocks,
# which get stripped when running optimized (with python -O or
# from compiled *.pyo files). Provide a warning if __debug__ is
# stripped, so it doesn't just look like --debug=count is broken.
@@ -629,6 +642,7 @@ def _set_debug_values(options):
if __debug__: enable_count = True
if enable_count:
count_stats.enable(sys.stdout)
+ SCons.Debug.track_instances = True
else:
msg = "--debug=count is not supported when running SCons\n" + \
"\twith the python -O option or optimized (.pyo) modules."
@@ -643,6 +657,8 @@ def _set_debug_values(options):
if "memory" in debug_values:
memory_stats.enable(sys.stdout)
print_objects = ("objects" in debug_values)
+ if print_objects:
+ SCons.Debug.track_instances = True
if "presub" in debug_values:
SCons.Action.print_actions_presub = 1
if "stacktrace" in debug_values:
@@ -653,6 +669,10 @@ def _set_debug_values(options):
print_time = 1
if "tree" in debug_values:
options.tree_printers.append(TreePrinter())
+ if "prepare" in debug_values:
+ SCons.Taskmaster.print_prepare = 1
+ if "duplicate" in debug_values:
+ SCons.Node.print_duplicate = 1
def _create_path(plist):
path = '.'
@@ -665,15 +685,15 @@ def _create_path(plist):
def _load_site_scons_dir(topdir, site_dir_name=None):
"""Load the site_scons dir under topdir.
- Adds site_scons to sys.path, imports site_scons/site_init.py,
- and adds site_scons/site_tools to default toolpath."""
+ Prepends site_scons to sys.path, imports site_scons/site_init.py,
+ and prepends site_scons/site_tools to default toolpath."""
if site_dir_name:
err_if_not_found = True # user specified: err if missing
else:
site_dir_name = "site_scons"
err_if_not_found = False
-
- site_dir = os.path.join(topdir.path, site_dir_name)
+
+ site_dir = os.path.join(topdir, site_dir_name)
if not os.path.exists(site_dir):
if err_if_not_found:
raise SCons.Errors.UserError("site dir %s not found."%site_dir)
@@ -682,11 +702,12 @@ def _load_site_scons_dir(topdir, site_dir_name=None):
site_init_filename = "site_init.py"
site_init_modname = "site_init"
site_tools_dirname = "site_tools"
+ # prepend to sys.path
sys.path = [os.path.abspath(site_dir)] + sys.path
site_init_file = os.path.join(site_dir, site_init_filename)
site_tools_dir = os.path.join(site_dir, site_tools_dirname)
if os.path.exists(site_init_file):
- import imp
+ import imp, re
# TODO(2.4): turn this into try:-except:-finally:
try:
try:
@@ -705,14 +726,26 @@ def _load_site_scons_dir(topdir, site_dir_name=None):
fmt = 'cannot import site_init.py: missing SCons.Script module %s'
raise SCons.Errors.InternalError(fmt % repr(e))
try:
+ sfx = description[0]
+ modname = os.path.basename(pathname)[:-len(sfx)]
+ site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
+ re_special = re.compile("__[^_]+__")
+ for k in m.__dict__.keys():
+ if not re_special.match(k):
+ site_m[k] = m.__dict__[k]
+
# This is the magic.
- exec fp in m.__dict__
+ exec fp in site_m
except KeyboardInterrupt:
raise
except Exception, e:
fmt = '*** Error loading site_init file %s:\n'
sys.stderr.write(fmt % repr(site_init_file))
raise
+ else:
+ for k in site_m:
+ if not re_special.match(k):
+ m.__dict__[k] = site_m[k]
except KeyboardInterrupt:
raise
except ImportError, e:
@@ -723,7 +756,55 @@ def _load_site_scons_dir(topdir, site_dir_name=None):
if fp:
fp.close()
if os.path.exists(site_tools_dir):
- SCons.Tool.DefaultToolpath.append(os.path.abspath(site_tools_dir))
+ # prepend to DefaultToolpath
+ SCons.Tool.DefaultToolpath.insert(0, os.path.abspath(site_tools_dir))
+
+def _load_all_site_scons_dirs(topdir, verbose=None):
+ """Load all of the predefined site_scons dir.
+ Order is significant; we load them in order from most generic
+ (machine-wide) to most specific (topdir).
+ The verbose argument is only for testing.
+ """
+ platform = SCons.Platform.platform_default()
+
+ def homedir(d):
+ return os.path.expanduser('~/'+d)
+
+ if platform == 'win32' or platform == 'cygwin':
+ # Note we use $ here instead of %...% because older
+ # pythons (prior to 2.6?) didn't expand %...% on Windows.
+ # This set of dirs should work on XP, Vista, 7 and later.
+ sysdirs=[
+ os.path.expandvars('$ALLUSERSPROFILE\\Application Data\\scons'),
+ os.path.expandvars('$USERPROFILE\\Local Settings\\Application Data\\scons')]
+ appdatadir = os.path.expandvars('$APPDATA\\scons')
+ if appdatadir not in sysdirs:
+ sysdirs.append(appdatadir)
+ sysdirs.append(homedir('.scons'))
+
+ elif platform == 'darwin': # MacOS X
+ sysdirs=['/Library/Application Support/SCons',
+ '/opt/local/share/scons', # (for MacPorts)
+ '/sw/share/scons', # (for Fink)
+ homedir('Library/Application Support/SCons'),
+ homedir('.scons')]
+ elif platform == 'sunos': # Solaris
+ sysdirs=['/opt/sfw/scons',
+ '/usr/share/scons',
+ homedir('.scons')]
+ else: # Linux, HPUX, etc.
+ # assume posix-like, i.e. platform == 'posix'
+ sysdirs=['/usr/share/scons',
+ homedir('.scons')]
+
+ dirs=sysdirs + [topdir]
+ for d in dirs:
+ if verbose: # this is used by unit tests.
+ print "Loading site dir ", d
+ _load_site_scons_dir(d)
+
+def test_load_all_site_scons_dirs(d):
+ _load_all_site_scons_dirs(d, True)
def version_string(label, module):
version = module.__version__
@@ -739,6 +820,10 @@ def version_string(label, module):
module.__developer__,
module.__buildsys__)
+def path_string(label, module):
+ path = module.__path__
+ return "\t%s path: %s\n"%(label,path)
+
def _main(parser):
global exit_status
global this_build_status
@@ -799,7 +884,8 @@ def _main(parser):
script_dir = ''
if script_dir and script_dir != os.getcwd():
- display("scons: Entering directory `%s'" % script_dir)
+ if not options.silent:
+ display("scons: Entering directory `%s'" % script_dir)
try:
os.chdir(script_dir)
except OSError:
@@ -860,13 +946,21 @@ def _main(parser):
progress_display.set_mode(0)
if options.site_dir:
- _load_site_scons_dir(d, options.site_dir)
+ _load_site_scons_dir(d.get_internal_path(), options.site_dir)
elif not options.no_site_dir:
- _load_site_scons_dir(d)
-
+ _load_all_site_scons_dirs(d.get_internal_path())
+
if options.include_dir:
sys.path = options.include_dir + sys.path
+ # If we're about to start SCons in the interactive mode,
+ # inform the FS about this right here. Else, the release_target_info
+ # method could get called on some nodes, like the used "gcc" compiler,
+ # when using the Configure methods within the SConscripts.
+ # This would then cause subtle bugs, as already happened in #2971.
+ if options.interactive:
+ SCons.Node.interactive = True
+
# That should cover (most of) the options. Next, set up the variables
# that hold command-line arguments, so the SConscript files that we
# read and execute have access to them.
@@ -912,9 +1006,9 @@ def _main(parser):
# reading SConscript files and haven't started building
# things yet, stop regardless of whether they used -i or -k
# or anything else.
+ revert_io()
sys.stderr.write("scons: *** %s Stop.\n" % e)
- exit_status = 2
- sys.exit(exit_status)
+ sys.exit(2)
global sconscript_time
sconscript_time = time.time() - start_time
@@ -938,13 +1032,18 @@ def _main(parser):
# warning about deprecated Python versions--delayed until here
# in case they disabled the warning in the SConscript files.
if python_version_deprecated():
- msg = "Support for pre-2.4 Python (%s) is deprecated.\n" + \
- " If this will cause hardship, contact dev@scons.tigris.org."
+ msg = "Support for pre-%s Python version (%s) is deprecated.\n" + \
+ " If this will cause hardship, contact scons-dev@scons.org"
+ deprecated_version_string = ".".join(map(str, deprecated_python_version))
SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning,
- msg % python_version_string())
+ msg % (deprecated_version_string, python_version_string()))
if not options.help:
- SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment())
+ # [ ] Clarify why we need to create Builder here at all, and
+ # why it is created in DefaultEnvironment
+ # https://bitbucket.org/scons/scons/commits/d27a548aeee8ad5e67ea75c2d19a7d305f784e30
+ if SCons.SConf.NeedConfigHBuilder():
+ SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment())
# Now re-parse the command-line options (any to the left of a '--'
# argument, that is) with any user-defined command-line options that
@@ -999,6 +1098,8 @@ def _main(parser):
# Build the targets
nodes = _build_targets(fs, options, targets, target_top)
if not nodes:
+ revert_io()
+ print 'Found nothing to build'
exit_status = 2
def _build_targets(fs, options, targets, target_top):
@@ -1010,13 +1111,14 @@ def _build_targets(fs, options, targets, target_top):
display.set_mode(not options.silent)
SCons.Action.print_actions = not options.silent
SCons.Action.execute_actions = not options.no_exec
- SCons.Node.FS.do_store_info = not options.no_exec
+ SCons.Node.do_store_info = not options.no_exec
SCons.SConf.dryrun = options.no_exec
if options.diskcheck:
SCons.Node.FS.set_diskcheck(options.diskcheck)
SCons.CacheDir.cache_enabled = not options.cache_disable
+ SCons.CacheDir.cache_readonly = options.cache_readonly
SCons.CacheDir.cache_debug = options.cache_debug
SCons.CacheDir.cache_force = options.cache_force
SCons.CacheDir.cache_show = options.cache_show
@@ -1062,7 +1164,7 @@ def _build_targets(fs, options, targets, target_top):
# x doesn't have a cwd, so it's either not a target,
# or not a file, so go ahead and keep it as a default
# target and let the engine sort it out:
- return 1
+ return 1
d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS))
SCons.Script.DEFAULT_TARGETS[:] = d
target_top = None
@@ -1226,12 +1328,8 @@ def _exec_main(parser, values):
prof = Profile()
try:
prof.runcall(_main, parser)
- except SConsPrintHelpException, e:
+ finally:
prof.dump_stats(options.profile_file)
- raise e
- except SystemExit:
- pass
- prof.dump_stats(options.profile_file)
else:
_main(parser)
@@ -1256,9 +1354,10 @@ def main():
except (ImportError, AttributeError):
# On Windows there is no scons.py, so there is no
# __main__.__version__, hence there is no script version.
- pass
+ pass
parts.append(version_string("engine", SCons))
- parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation")
+ parts.append(path_string("engine", SCons))
+ parts.append("Copyright (c) 2001 - 2015 The SCons Foundation")
version = ''.join(parts)
import SConsOptions
@@ -1266,9 +1365,12 @@ def main():
values = SConsOptions.SConsValues(parser.get_default_values())
OptionsParser = parser
-
+
try:
- _exec_main(parser, values)
+ try:
+ _exec_main(parser, values)
+ finally:
+ revert_io()
except SystemExit, s:
if s:
exit_status = s
@@ -1285,6 +1387,7 @@ def main():
parser.print_help()
exit_status = 0
except SCons.Errors.BuildError, e:
+ print e
exit_status = e.exitstatus
except:
# An exception here is likely a builtin Python exception Python
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py
index 913a6ee..7e458aa 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Script/SConsOptions.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import optparse
import re
@@ -248,7 +248,7 @@ class SConsOption(optparse.Option):
class SConsOptionGroup(optparse.OptionGroup):
"""
A subclass for SCons-specific option groups.
-
+
The only difference between this and the base class is that we print
the group's help text flush left, underneath their own title but
lined up with the normal "SCons Options".
@@ -268,8 +268,9 @@ class SConsOptionParser(optparse.OptionParser):
preserve_unknown_options = False
def error(self, msg):
+ # overriden OptionValueError exception handler
self.print_usage(sys.stderr)
- sys.stderr.write("SCons error: %s\n" % msg)
+ sys.stderr.write("SCons Error: %s\n" % msg)
sys.exit(2)
def _process_long_opt(self, rargs, values):
@@ -318,7 +319,13 @@ class SConsOptionParser(optparse.OptionParser):
value = option.const
elif len(rargs) < nargs:
if nargs == 1:
- self.error(_("%s option requires an argument") % opt)
+ if not option.choices:
+ self.error(_("%s option requires an argument") % opt)
+ else:
+ msg = _("%s option requires an argument " % opt)
+ msg += _("(choose from %s)"
+ % ', '.join(option.choices))
+ self.error(msg)
else:
self.error(_("%s option requires %d arguments")
% (opt, nargs))
@@ -336,10 +343,75 @@ class SConsOptionParser(optparse.OptionParser):
option.process(opt, value, values, self)
+ def reparse_local_options(self):
+ """
+ Re-parse the leftover command-line options stored
+ in self.largs, so that any value overridden on the
+ command line is immediately available if the user turns
+ around and does a GetOption() right away.
+
+ We mimic the processing of the single args
+ in the original OptionParser._process_args(), but here we
+ allow exact matches for long-opts only (no partial
+ argument names!).
+
+ Else, this would lead to problems in add_local_option()
+ below. When called from there, we try to reparse the
+ command-line arguments that
+ 1. haven't been processed so far (self.largs), but
+ 2. are possibly not added to the list of options yet.
+
+ So, when we only have a value for "--myargument" yet,
+ a command-line argument of "--myarg=test" would set it.
+ Responsible for this behaviour is the method
+ _match_long_opt(), which allows for partial matches of
+ the option name, as long as the common prefix appears to
+ be unique.
+ This would lead to further confusion, because we might want
+ to add another option "--myarg" later on (see issue #2929).
+
+ """
+ rargs = []
+ largs_restore = []
+ # Loop over all remaining arguments
+ skip = False
+ for l in self.largs:
+ if skip:
+ # Accept all remaining arguments as they are
+ largs_restore.append(l)
+ else:
+ if len(l) > 2 and l[0:2] == "--":
+ # Check long option
+ lopt = (l,)
+ if "=" in l:
+ # Split into option and value
+ lopt = l.split("=", 1)
+
+ if lopt[0] in self._long_opt:
+ # Argument is already known
+ rargs.append('='.join(lopt))
+ else:
+ # Not known yet, so reject for now
+ largs_restore.append('='.join(lopt))
+ else:
+ if l == "--" or l == "-":
+ # Stop normal processing and don't
+ # process the rest of the command-line opts
+ largs_restore.append(l)
+ skip = True
+ else:
+ rargs.append(l)
+
+ # Parse the filtered list
+ self.parse_args(rargs, self.values)
+ # Restore the list of remaining arguments for the
+ # next call of AddOption/add_local_option...
+ self.largs = self.largs + largs_restore
+
def add_local_option(self, *args, **kw):
"""
Adds a local option to the parser.
-
+
This is initiated by a SetOption() call to add a user-defined
command-line option. We add the option to a separate option
group for the local options, creating the group if necessary.
@@ -363,7 +435,7 @@ class SConsOptionParser(optparse.OptionParser):
# available if the user turns around and does a GetOption()
# right away.
setattr(self.values.__defaults__, result.dest, result.default)
- self.parse_args(self.largs, self.values)
+ self.reparse_local_options()
return result
@@ -393,11 +465,11 @@ class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter):
out liking:
-- add our own regular expression that doesn't break on hyphens
- (so things like --no-print-directory don't get broken);
+ (so things like --no-print-directory don't get broken);
-- wrap the list of options themselves when it's too long
(the wrapper.fill(opts) call below);
-
+
-- set the subsequent_indent when wrapping the help_text.
"""
# The help for each option consists of two parts:
@@ -563,23 +635,28 @@ def Parser(version):
action="store_true",
help="Copy already-built targets into the CacheDir.")
+ op.add_option('--cache-readonly',
+ dest='cache_readonly', default=False,
+ action="store_true",
+ help="Do not update CacheDir with built targets.")
+
op.add_option('--cache-show',
dest='cache_show', default=False,
action="store_true",
help="Print build actions for files from CacheDir.")
+ def opt_invalid(group, value, options):
+ errmsg = "`%s' is not a valid %s option type, try:\n" % (value, group)
+ return errmsg + " %s" % ", ".join(options)
+
config_options = ["auto", "force" ,"cache"]
- def opt_config(option, opt, value, parser, c_options=config_options):
- if not value in c_options:
- raise OptionValueError("Warning: %s is not a valid config type" % value)
- setattr(parser.values, option.dest, value)
opt_config_help = "Controls Configure subsystem: %s." \
% ", ".join(config_options)
+
op.add_option('--config',
- nargs=1, type="string",
+ nargs=1, choices=config_options,
dest="config", default="auto",
- action="callback", callback=opt_config,
help = opt_config_help,
metavar="MODE")
@@ -596,17 +673,19 @@ def Parser(version):
"tree" : '; please use --tree=all instead',
}
- debug_options = ["count", "explain", "findlibs",
+ debug_options = ["count", "duplicate", "explain", "findlibs",
"includes", "memoizer", "memory", "objects",
- "pdb", "presub", "stacktrace",
- "time"] + list(deprecated_debug_options.keys())
+ "pdb", "prepare", "presub", "stacktrace",
+ "time"]
- def opt_debug(option, opt, value, parser,
+ def opt_debug(option, opt, value__, parser,
debug_options=debug_options,
deprecated_debug_options=deprecated_debug_options):
- if value in debug_options:
- parser.values.debug.append(value)
- if value in deprecated_debug_options.keys():
+ for value in value__.split(','):
+ if value in debug_options:
+ parser.values.debug.append(value)
+ elif value in deprecated_debug_options.keys():
+ parser.values.debug.append(value)
try:
parser.values.delayed_warnings
except AttributeError:
@@ -615,8 +694,9 @@ def Parser(version):
w = "The --debug=%s option is deprecated%s." % (value, msg)
t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w)
parser.values.delayed_warnings.append(t)
- else:
- raise OptionValueError("Warning: %s is not a valid debug type" % value)
+ else:
+ raise OptionValueError(opt_invalid('debug', value, debug_options))
+
opt_debug_help = "Print various types of debugging information: %s." \
% ", ".join(debug_options)
op.add_option('--debug',
@@ -630,7 +710,7 @@ def Parser(version):
try:
diskcheck_value = diskcheck_convert(value)
except ValueError, e:
- raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e)
+ raise OptionValueError("`%s' is not a valid diskcheck type" % e)
setattr(parser.values, option.dest, diskcheck_value)
op.add_option('--diskcheck',
@@ -642,7 +722,8 @@ def Parser(version):
def opt_duplicate(option, opt, value, parser):
if not value in SCons.Node.FS.Valid_Duplicates:
- raise OptionValueError("`%s' is not a valid duplication style." % value)
+ raise OptionValueError(opt_invalid('duplication', value,
+ SCons.Node.FS.Valid_Duplicates))
setattr(parser.values, option.dest, value)
# Set the duplicate style right away so it can affect linking
# of SConscript files.
@@ -807,7 +888,7 @@ def Parser(version):
elif o == 'status':
tp.status = True
else:
- raise OptionValueError("Warning: %s is not a valid --tree option" % o)
+ raise OptionValueError(opt_invalid('--tree', o, tree_options))
parser.values.tree_printers.append(tp)
opt_tree_help = "Print a dependency tree in various formats: %s." \
@@ -867,7 +948,7 @@ def Parser(version):
sys.stderr.write(msg)
op.add_option('-l', '--load-average', '--max-load',
- nargs=1, type="int",
+ nargs=1, type="float",
dest="load_average", default=0,
action="callback", callback=opt_not_yet,
# action="store",
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py
index 5a22db7..ead6f2e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py
@@ -6,7 +6,7 @@ files.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,7 +28,7 @@ files.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from __future__ import division
-__revision__ = "src/engine/SCons/Script/SConscript.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Script/SConscript.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons
import SCons.Action
@@ -265,7 +265,7 @@ def _SConscript(fs, *files, **kw):
call_stack[-1].globals.update({__file__:old_file})
else:
SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning,
- "Ignoring missing SConscript '%s'" % f.path)
+ "Ignoring missing SConscript '%s'" % f.get_internal_path())
finally:
SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1
@@ -438,7 +438,7 @@ class SConsEnvironment(SCons.Environment.Base):
fname = fn.get_path(src_dir)
files = [os.path.join(str(variant_dir), fname)]
else:
- files = [fn.abspath]
+ files = [fn.get_abspath()]
kw['src_dir'] = variant_dir
self.fs.VariantDir(variant_dir, src_dir, duplicate)
@@ -461,6 +461,11 @@ class SConsEnvironment(SCons.Environment.Base):
def EnsureSConsVersion(self, major, minor, revision=0):
"""Exit abnormally if the SCons version is not late enough."""
+ # split string to avoid replacement during build process
+ if SCons.__version__ == '__' + 'VERSION__':
+ SCons.Warnings.warn(SCons.Warnings.DevelopmentVersionWarning,
+ "EnsureSConsVersion is ignored for development version")
+ return
scons_ver = self._get_major_minor_revision(SCons.__version__)
if scons_ver < (major, minor, revision):
if revision:
@@ -473,13 +478,8 @@ class SConsEnvironment(SCons.Environment.Base):
def EnsurePythonVersion(self, major, minor):
"""Exit abnormally if the Python version is not late enough."""
- try:
- v_major, v_minor, v_micro, release, serial = sys.version_info
- python_ver = (v_major, v_minor)
- except AttributeError:
- python_ver = self._get_major_minor_revision(sys.version)[:2]
- if python_ver < (major, minor):
- v = sys.version.split(" ", 1)[0]
+ if sys.version_info < (major, minor):
+ v = sys.version.split()[0]
print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v)
sys.exit(2)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py
index b5b5222..c21882f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Script/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py
@@ -12,7 +12,7 @@ it goes here.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -34,7 +34,7 @@ it goes here.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Script/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Script/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import time
start_time = time.time()
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Sig.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py
index 49c00bf..e949cfb 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Sig.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Sig.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Sig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Place-holder for the old SCons.Sig module hierarchy
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Subst.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py
index d9b029a..da0fa68 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Subst.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py
@@ -5,7 +5,7 @@ SCons string substitution.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ SCons string substitution.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Subst.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Subst.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import collections
import re
@@ -78,6 +78,14 @@ class Literal(object):
def is_literal(self):
return 1
+ def __eq__(self, other):
+ if not isinstance(other, Literal):
+ return False
+ return self.lstr == other.lstr
+
+ def __neq__(self, other):
+ return not self.__eq__(other)
+
class SpecialAttrWrapper(object):
"""This is a wrapper for what we call a 'Node special attribute.'
This is any of the attributes of a Node that we can reference from
@@ -172,7 +180,7 @@ class NLWrapper(object):
In practice, this might be a wash performance-wise, but it's a little
cleaner conceptually...
"""
-
+
def __init__(self, list, func):
self.list = list
self.func = func
@@ -190,7 +198,7 @@ class NLWrapper(object):
self._create_nodelist = self._return_nodelist
return self.nodelist
_create_nodelist = _gen_nodelist
-
+
class Targets_or_Sources(collections.UserList):
"""A class that implements $TARGETS or $SOURCES expansions by in turn
@@ -451,7 +459,7 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={
raise_exception(NameError(key), lvars['TARGETS'], s)
else:
return ''
-
+
# Before re-expanding the result, handle
# recursive expansion by copying the local
# variable dictionary and overwriting a null
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Taskmaster.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py
index 68ac1f5..b303f79 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Taskmaster.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -47,7 +47,7 @@ interface and the SCons build engine. There are two key classes here:
target(s) that it decides need to be evaluated and/or built.
"""
-__revision__ = "src/engine/SCons/Taskmaster.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Taskmaster.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from itertools import chain
import operator
@@ -66,6 +66,7 @@ NODE_UP_TO_DATE = SCons.Node.up_to_date
NODE_EXECUTED = SCons.Node.executed
NODE_FAILED = SCons.Node.failed
+print_prepare = 0 # set by option --debug=prepare
# A subsystem for recording stats about how different Nodes are handled by
# the main Taskmaster loop. There's no external control here (no need for
@@ -161,6 +162,7 @@ class Task(object):
unlink underlying files and make all necessary directories before
the Action is actually called to build the targets.
"""
+ global print_prepare
T = self.tm.trace
if T: T.write(self.trace_message(u'Task.prepare()', self.node))
@@ -184,10 +186,18 @@ class Task(object):
# or implicit dependencies exists, and also initialize the
# .sconsign info.
executor = self.targets[0].get_executor()
+ if executor is None:
+ return
executor.prepare()
for t in executor.get_action_targets():
+ if print_prepare:
+ print "Preparing target %s..."%t
+ for s in t.side_effects:
+ print "...with side-effect %s..."%s
t.prepare()
for s in t.side_effects:
+ if print_prepare:
+ print "...Preparing side-effect %s..."%s
s.prepare()
def get_target(self):
@@ -219,20 +229,26 @@ class Task(object):
if T: T.write(self.trace_message(u'Task.execute()', self.node))
try:
- everything_was_cached = 1
+ cached_targets = []
for t in self.targets:
- if t.retrieve_from_cache():
- # Call the .built() method without calling the
- # .push_to_cache() method, since we just got the
- # target from the cache and don't need to push
- # it back there.
- t.set_state(NODE_EXECUTED)
- t.built()
- else:
- everything_was_cached = 0
+ if not t.retrieve_from_cache():
break
- if not everything_was_cached:
+ cached_targets.append(t)
+ if len(cached_targets) < len(self.targets):
+ # Remove targets before building. It's possible that we
+ # partially retrieved targets from the cache, leaving
+ # them in read-only mode. That might cause the command
+ # to fail.
+ #
+ for t in cached_targets:
+ try:
+ t.fs.unlink(t.get_internal_path())
+ except (IOError, OSError):
+ pass
self.targets[0].build()
+ else:
+ for t in cached_targets:
+ t.cached = 1
except SystemExit:
exc_value = sys.exc_info()[1]
raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code)
@@ -275,6 +291,7 @@ class Task(object):
post-visit actions that must take place regardless of whether
or not the target was an actual built target or a source Node.
"""
+ global print_prepare
T = self.tm.trace
if T: T.write(self.trace_message('Task.executed_with_callbacks()',
self.node))
@@ -284,9 +301,15 @@ class Task(object):
for side_effect in t.side_effects:
side_effect.set_state(NODE_NO_STATE)
t.set_state(NODE_EXECUTED)
- t.push_to_cache()
+ if not t.cached:
+ t.push_to_cache()
t.built()
- t.visited()
+ t.visited()
+ if (not print_prepare and
+ (not hasattr(self, 'options') or not self.options.debug_includes)):
+ t.release_target_info()
+ else:
+ t.visited()
executed = executed_with_callbacks
@@ -367,6 +390,7 @@ class Task(object):
This is the default behavior for building only what's necessary.
"""
+ global print_prepare
T = self.tm.trace
if T: T.write(self.trace_message(u'Task.make_ready_current()',
self.node))
@@ -399,6 +423,9 @@ class Task(object):
# parallel build...)
t.visited()
t.set_state(NODE_UP_TO_DATE)
+ if (not print_prepare and
+ (not hasattr(self, 'options') or not self.options.debug_includes)):
+ t.release_target_info()
make_ready = make_ready_current
@@ -438,14 +465,15 @@ class Task(object):
parents[p] = parents.get(p, 0) + 1
for t in targets:
- for s in t.side_effects:
- if s.get_state() == NODE_EXECUTING:
- s.set_state(NODE_NO_STATE)
- for p in s.waiting_parents:
- parents[p] = parents.get(p, 0) + 1
- for p in s.waiting_s_e:
- if p.ref_count == 0:
- self.tm.candidates.append(p)
+ if t.side_effects is not None:
+ for s in t.side_effects:
+ if s.get_state() == NODE_EXECUTING:
+ s.set_state(NODE_NO_STATE)
+ for p in s.waiting_parents:
+ parents[p] = parents.get(p, 0) + 1
+ for p in s.waiting_s_e:
+ if p.ref_count == 0:
+ self.tm.candidates.append(p)
for p, subtract in parents.items():
p.ref_count = p.ref_count - subtract
@@ -912,7 +940,11 @@ class Taskmaster(object):
if node is None:
return None
- tlist = node.get_executor().get_all_targets()
+ executor = node.get_executor()
+ if executor is None:
+ return None
+
+ tlist = executor.get_all_targets()
task = self.tasker(self, tlist, node in self.original_top, node)
try:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py
index 5b8c8cb..06d271e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/386asm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/386asm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.PharLapCommon import addPharLapPaths
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py
index a155a42..9df9f59 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/BitKeeper.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/BitKeeper.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py
index bb9f956..14bc18e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py
@@ -8,7 +8,7 @@ selection method.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/CVS.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/CVS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py
index 4d62517..db03660 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py
@@ -1,14 +1,12 @@
-"""engine.SCons.Platform.darwin
+"""SCons.Tool.DCommon
-Platform-specific initialization for Mac OS X systems.
+Common code for the various D tools.
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
+Coded by Russel Winder (russel@winder.org.uk)
+2012-09-06
"""
-
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,14 +28,26 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Platform/darwin.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/DCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import os.path
-import posix
+def isD(env, source):
+ if not source:
+ return 0
+ for s in source:
+ if s.sources:
+ ext = os.path.splitext(str(s.sources[0]))[1]
+ if ext == '.d':
+ return 1
+ return 0
-def generate(env):
- posix.generate(env)
- env['SHLIBSUFFIX'] = '.dylib'
- env['ENV']['PATH'] = env['ENV']['PATH'] + ':/sw/bin'
+def addDPATHToEnv(env, executable):
+ dPath = env.WhereIs(executable)
+ if dPath:
+ phobosDir = dPath[:dPath.rindex(executable)] + '/../src/phobos'
+ if os.path.isdir(phobosDir):
+ env.Append(DPATH=[phobosDir])
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py
index db89f96..b8ff7d9 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py
@@ -5,7 +5,7 @@ Stuff for processing Fortran, common to all fortran dialects.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ Stuff for processing Fortran, common to all fortran dialects.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/FortranCommon.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import re
import os.path
@@ -231,6 +231,37 @@ def add_f95_to_env(env):
DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes,
support_module = 1)
+def add_f03_to_env(env):
+ """Add Builders and construction variables for f03 to an Environment."""
+ try:
+ F03Suffixes = env['F03FILESUFFIXES']
+ except KeyError:
+ F03Suffixes = ['.f03']
+
+ #print "Adding %s to f95 suffixes" % F95Suffixes
+ try:
+ F03PPSuffixes = env['F03PPFILESUFFIXES']
+ except KeyError:
+ F03PPSuffixes = []
+
+ DialectAddToEnv(env, "F03", F03Suffixes, F03PPSuffixes,
+ support_module = 1)
+
+def add_f08_to_env(env):
+ """Add Builders and construction variables for f08 to an Environment."""
+ try:
+ F08Suffixes = env['F08FILESUFFIXES']
+ except KeyError:
+ F08Suffixes = ['.f08']
+
+ try:
+ F08PPSuffixes = env['F08PPFILESUFFIXES']
+ except KeyError:
+ F08PPSuffixes = []
+
+ DialectAddToEnv(env, "F08", F08Suffixes, F08PPSuffixes,
+ support_module = 1)
+
def add_all_to_env(env):
"""Add builders and construction variables for all supported fortran
dialects."""
@@ -238,6 +269,8 @@ def add_all_to_env(env):
add_f77_to_env(env)
add_f90_to_env(env)
add_f95_to_env(env)
+ add_f03_to_env(env)
+ add_f08_to_env(env)
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py
new file mode 100644
index 0000000..af9b074
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py
@@ -0,0 +1,430 @@
+"""SCons.Tool.GettextCommon module
+
+Used by several tools of `gettext` toolset.
+"""
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import SCons.Warnings
+import re
+
+#############################################################################
+class XgettextToolWarning(SCons.Warnings.Warning): pass
+class XgettextNotFound(XgettextToolWarning): pass
+class MsginitToolWarning(SCons.Warnings.Warning): pass
+class MsginitNotFound(MsginitToolWarning): pass
+class MsgmergeToolWarning(SCons.Warnings.Warning): pass
+class MsgmergeNotFound(MsgmergeToolWarning): pass
+class MsgfmtToolWarning(SCons.Warnings.Warning): pass
+class MsgfmtNotFound(MsgfmtToolWarning): pass
+#############################################################################
+SCons.Warnings.enableWarningClass(XgettextToolWarning)
+SCons.Warnings.enableWarningClass(XgettextNotFound)
+SCons.Warnings.enableWarningClass(MsginitToolWarning)
+SCons.Warnings.enableWarningClass(MsginitNotFound)
+SCons.Warnings.enableWarningClass(MsgmergeToolWarning)
+SCons.Warnings.enableWarningClass(MsgmergeNotFound)
+SCons.Warnings.enableWarningClass(MsgfmtToolWarning)
+SCons.Warnings.enableWarningClass(MsgfmtNotFound)
+#############################################################################
+
+#############################################################################
+class _POTargetFactory(object):
+ """ A factory of `PO` target files.
+
+ Factory defaults differ from these of `SCons.Node.FS.FS`. We set `precious`
+ (this is required by builders and actions gettext) and `noclean` flags by
+ default for all produced nodes.
+ """
+ def __init__( self, env, nodefault = True, alias = None, precious = True
+ , noclean = True ):
+ """ Object constructor.
+
+ **Arguments**
+
+ - *env* (`SCons.Environment.Environment`)
+ - *nodefault* (`boolean`) - if `True`, produced nodes will be ignored
+ from default target `'.'`
+ - *alias* (`string`) - if provided, produced nodes will be automatically
+ added to this alias, and alias will be set as `AlwaysBuild`
+ - *precious* (`boolean`) - if `True`, the produced nodes will be set as
+ `Precious`.
+ - *noclen* (`boolean`) - if `True`, the produced nodes will be excluded
+ from `Clean`.
+ """
+ self.env = env
+ self.alias = alias
+ self.precious = precious
+ self.noclean = noclean
+ self.nodefault = nodefault
+
+ def _create_node(self, name, factory, directory = None, create = 1):
+ """ Create node, and set it up to factory settings. """
+ import SCons.Util
+ node = factory(name, directory, create)
+ node.set_noclean(self.noclean)
+ node.set_precious(self.precious)
+ if self.nodefault:
+ self.env.Ignore('.', node)
+ if self.alias:
+ self.env.AlwaysBuild(self.env.Alias(self.alias, node))
+ return node
+
+ def Entry(self, name, directory = None, create = 1):
+ """ Create `SCons.Node.FS.Entry` """
+ return self._create_node(name, self.env.fs.Entry, directory, create)
+
+ def File(self, name, directory = None, create = 1):
+ """ Create `SCons.Node.FS.File` """
+ return self._create_node(name, self.env.fs.File, directory, create)
+#############################################################################
+
+#############################################################################
+_re_comment = re.compile(r'(#[^\n\r]+)$', re.M)
+_re_lang = re.compile(r'([a-zA-Z0-9_]+)', re.M)
+#############################################################################
+def _read_linguas_from_files(env, linguas_files = None):
+ """ Parse `LINGUAS` file and return list of extracted languages """
+ import SCons.Util
+ import SCons.Environment
+ global _re_comment
+ global _re_lang
+ if not SCons.Util.is_List(linguas_files) \
+ and not SCons.Util.is_String(linguas_files) \
+ and not isinstance(linguas_files, SCons.Node.FS.Base) \
+ and linguas_files:
+ # If, linguas_files==True or such, then read 'LINGUAS' file.
+ linguas_files = [ 'LINGUAS' ]
+ if linguas_files is None:
+ return []
+ fnodes = env.arg2nodes(linguas_files)
+ linguas = []
+ for fnode in fnodes:
+ contents = _re_comment.sub("", fnode.get_text_contents())
+ ls = [ l for l in _re_lang.findall(contents) if l ]
+ linguas.extend(ls)
+ return linguas
+#############################################################################
+
+#############################################################################
+from SCons.Builder import BuilderBase
+#############################################################################
+class _POFileBuilder(BuilderBase):
+ """ `PO` file builder.
+
+ This is multi-target single-source builder. In typical situation the source
+ is single `POT` file, e.g. `messages.pot`, and there are multiple `PO`
+ targets to be updated from this `POT`. We must run
+ `SCons.Builder.BuilderBase._execute()` separatelly for each target to track
+ dependencies separatelly for each target file.
+
+ **NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)`
+ with target being list of all targets, all targets would be rebuilt each time
+ one of the targets from this list is missing. This would happen, for example,
+ when new language `ll` enters `LINGUAS_FILE` (at this moment there is no
+ `ll.po` file yet). To avoid this, we override
+ `SCons.Builder.BuilerBase._execute()` and call it separatelly for each
+ target. Here we also append to the target list the languages read from
+ `LINGUAS_FILE`.
+ """
+ #
+ #* The argument for overriding _execute(): We must use environment with
+ # builder overrides applied (see BuilderBase.__init__(). Here it comes for
+ # free.
+ #* The argument against using 'emitter': The emitter is called too late
+ # by BuilderBase._execute(). If user calls, for example:
+ #
+ # env.POUpdate(LINGUAS_FILE = 'LINGUAS')
+ #
+ # the builder throws error, because it is called with target=None,
+ # source=None and is trying to "generate" sources or target list first.
+ # If user calls
+ #
+ # env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS')
+ #
+ # the env.BuilderWrapper() calls our builder with target=None,
+ # source=['foo', 'baz']. The BuilderBase._execute() then splits execution
+ # and execute iterativelly (recursion) self._execute(None, source[i]).
+ # After that it calls emitter (which is quite too late). The emitter is
+ # also called in each iteration, what makes things yet worse.
+ def __init__(self, env, **kw):
+ if not 'suffix' in kw:
+ kw['suffix'] = '$POSUFFIX'
+ if not 'src_suffix' in kw:
+ kw['src_suffix'] = '$POTSUFFIX'
+ if not 'src_builder' in kw:
+ kw['src_builder'] = '_POTUpdateBuilder'
+ if not 'single_source' in kw:
+ kw['single_source'] = True
+ alias = None
+ if 'target_alias' in kw:
+ alias = kw['target_alias']
+ del kw['target_alias']
+ if not 'target_factory' in kw:
+ kw['target_factory'] = _POTargetFactory(env, alias=alias).File
+ BuilderBase.__init__(self, **kw)
+
+ def _execute(self, env, target, source, *args, **kw):
+ """ Execute builder's actions.
+
+ Here we append to `target` the languages read from `$LINGUAS_FILE` and
+ apply `SCons.Builder.BuilderBase._execute()` separatelly to each target.
+ The arguments and return value are same as for
+ `SCons.Builder.BuilderBase._execute()`.
+ """
+ import SCons.Util
+ import SCons.Node
+ linguas_files = None
+ if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE']:
+ linguas_files = env['LINGUAS_FILE']
+ # This prevents endless recursion loop (we'll be invoked once for
+ # each target appended here, we must not extend the list again).
+ env['LINGUAS_FILE'] = None
+ linguas = _read_linguas_from_files(env,linguas_files)
+ if SCons.Util.is_List(target):
+ target.extend(linguas)
+ elif target is not None:
+ target = [target] + linguas
+ else:
+ target = linguas
+ if not target:
+ # Let the SCons.BuilderBase to handle this patologic situation
+ return BuilderBase._execute( self, env, target, source, *args, **kw)
+ # The rest is ours
+ if not SCons.Util.is_List(target):
+ target = [ target ]
+ result = []
+ for tgt in target:
+ r = BuilderBase._execute( self, env, [tgt], source, *args, **kw)
+ result.extend(r)
+ if linguas_files is not None:
+ env['LINGUAS_FILE'] = linguas_files
+ return SCons.Node.NodeList(result)
+#############################################################################
+
+import SCons.Environment
+#############################################################################
+def _translate(env, target=None, source=SCons.Environment._null, *args, **kw):
+ """ Function for `Translate()` pseudo-builder """
+ if target is None: target = []
+ pot = env.POTUpdate(None, source, *args, **kw)
+ po = env.POUpdate(target, pot, *args, **kw)
+ return po
+#############################################################################
+
+#############################################################################
+class RPaths(object):
+ """ Callable object, which returns pathnames relative to SCons current
+ working directory.
+
+ It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths
+ for nodes that are outside of current working directory (`env.fs.getcwd()`).
+ Here, we often have `SConscript`, `POT` and `PO` files within `po/`
+ directory and source files (e.g. `*.c`) outside of it. When generating `POT`
+ template file, references to source files are written to `POT` template, so
+ a translator may later quickly jump to appropriate source file and line from
+ its `PO` editor (e.g. `poedit`). Relative paths in `PO` file are usually
+ interpreted by `PO` editor as paths relative to the place, where `PO` file
+ lives. The absolute paths would make resultant `POT` file nonportable, as
+ the references would be correct only on the machine, where `POT` file was
+ recently re-created. For such reason, we need a function, which always
+ returns relative paths. This is the purpose of `RPaths` callable object.
+
+ The `__call__` method returns paths relative to current woking directory, but
+ we assume, that *xgettext(1)* is run from the directory, where target file is
+ going to be created.
+
+ Note, that this may not work for files distributed over several hosts or
+ across different drives on windows. We assume here, that single local
+ filesystem holds both source files and target `POT` templates.
+
+ Intended use of `RPaths` - in `xgettext.py`::
+
+ def generate(env):
+ from GettextCommon import RPaths
+ ...
+ sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)'
+ env.Append(
+ ...
+ XGETTEXTCOM = 'XGETTEXT ... ' + sources,
+ ...
+ XgettextRPaths = RPaths(env)
+ )
+ """
+ # NOTE: This callable object returns pathnames of dirs/files relative to
+ # current working directory. The pathname remains relative also for entries
+ # that are outside of current working directory (node, that
+ # SCons.Node.FS.File and siblings return absolute path in such case). For
+ # simplicity we compute path relative to current working directory, this
+ # seems be enough for our purposes (don't need TARGET variable and
+ # SCons.Defaults.Variable_Caller stuff).
+
+ def __init__(self, env):
+ """ Initialize `RPaths` callable object.
+
+ **Arguments**:
+
+ - *env* - a `SCons.Environment.Environment` object, defines *current
+ working dir*.
+ """
+ self.env = env
+
+ # FIXME: I'm not sure, how it should be implemented (what the *args are in
+ # general, what is **kw).
+ def __call__(self, nodes, *args, **kw):
+ """ Return nodes' paths (strings) relative to current working directory.
+
+ **Arguments**:
+
+ - *nodes* ([`SCons.Node.FS.Base`]) - list of nodes.
+ - *args* - currently unused.
+ - *kw* - currently unused.
+
+ **Returns**:
+
+ - Tuple of strings, which represent paths relative to current working
+ directory (for given environment).
+ """
+ # os.path.relpath is available only on python >= 2.6. We use our own
+ # implementation. It's taken from BareNecessities package:
+ # http://jimmyg.org/work/code/barenecessities/index.html
+ from posixpath import curdir
+ def relpath(path, start=curdir):
+ import posixpath
+ """Return a relative version of a path"""
+ if not path:
+ raise ValueError("no path specified")
+ start_list = posixpath.abspath(start).split(posixpath.sep)
+ path_list = posixpath.abspath(path).split(posixpath.sep)
+ # Work out how much of the filepath is shared by start and path.
+ i = len(posixpath.commonprefix([start_list, path_list]))
+ rel_list = [posixpath.pardir] * (len(start_list)-i) + path_list[i:]
+ if not rel_list:
+ return posixpath.curdir
+ return posixpath.join(*rel_list)
+ import os
+ import SCons.Node.FS
+ rpaths = ()
+ cwd = self.env.fs.getcwd().get_abspath()
+ for node in nodes:
+ rpath = None
+ if isinstance(node, SCons.Node.FS.Base):
+ rpath = relpath(node.get_abspath(), cwd)
+ # FIXME: Other types possible here?
+ if rpath is not None:
+ rpaths += (rpath,)
+ return rpaths
+#############################################################################
+
+#############################################################################
+def _init_po_files(target, source, env):
+ """ Action function for `POInit` builder. """
+ nop = lambda target, source, env : 0
+ if env.has_key('POAUTOINIT'):
+ autoinit = env['POAUTOINIT']
+ else:
+ autoinit = False
+ # Well, if everything outside works well, this loop should do single
+ # iteration. Otherwise we are rebuilding all the targets even, if just
+ # one has changed (but is this out fault?).
+ for tgt in target:
+ if not tgt.exists():
+ if autoinit:
+ action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR')
+ else:
+ msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \
+ + 'If you are a translator, you can create it through: \n' \
+ + '$MSGINITCOM'
+ action = SCons.Action.Action(nop, msg)
+ status = action([tgt], source, env)
+ if status: return status
+ return 0
+#############################################################################
+
+#############################################################################
+def _detect_xgettext(env):
+ """ Detects *xgettext(1)* binary """
+ if env.has_key('XGETTEXT'):
+ return env['XGETTEXT']
+ xgettext = env.Detect('xgettext');
+ if xgettext:
+ return xgettext
+ raise SCons.Errors.StopError(XgettextNotFound,"Could not detect xgettext")
+ return None
+#############################################################################
+def _xgettext_exists(env):
+ return _detect_xgettext(env)
+#############################################################################
+
+#############################################################################
+def _detect_msginit(env):
+ """ Detects *msginit(1)* program. """
+ if env.has_key('MSGINIT'):
+ return env['MSGINIT']
+ msginit = env.Detect('msginit');
+ if msginit:
+ return msginit
+ raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit")
+ return None
+#############################################################################
+def _msginit_exists(env):
+ return _detect_msginit(env)
+#############################################################################
+
+#############################################################################
+def _detect_msgmerge(env):
+ """ Detects *msgmerge(1)* program. """
+ if env.has_key('MSGMERGE'):
+ return env['MSGMERGE']
+ msgmerge = env.Detect('msgmerge');
+ if msgmerge:
+ return msgmerge
+ raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge")
+ return None
+#############################################################################
+def _msgmerge_exists(env):
+ return _detect_msgmerge(env)
+#############################################################################
+
+#############################################################################
+def _detect_msgfmt(env):
+ """ Detects *msgmfmt(1)* program. """
+ if env.has_key('MSGFMT'):
+ return env['MSGFMT']
+ msgfmt = env.Detect('msgfmt');
+ if msgfmt:
+ return msgfmt
+ raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt")
+ return None
+#############################################################################
+def _msgfmt_exists(env):
+ return _detect_msgfmt(env)
+#############################################################################
+
+#############################################################################
+def tool_list(platform, env):
+ """ List tools that shall be generated by top-level `gettext` tool """
+ return [ 'xgettext', 'msginit', 'msgmerge', 'msgfmt' ]
+#############################################################################
+
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py
index bd6a30b..8b1e48e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py
@@ -5,7 +5,7 @@ Stuff for processing Java.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ Stuff for processing Java.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/JavaCommon.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
@@ -64,8 +64,8 @@ if java_parsing:
interfaces, and anonymous inner classes."""
def __init__(self, version=default_java_version):
- if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6',
- '5', '6'):
+ if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', '1.7',
+ '1.8', '5', '6'):
msg = "Java version %s not supported" % version
raise NotImplementedError(msg)
@@ -171,7 +171,7 @@ if java_parsing:
if self.version in ('1.1', '1.2', '1.3', '1.4'):
clazz = self.listClasses[0]
self.listOutputs.append('%s$%d' % (clazz, self.nextAnon))
- elif self.version in ('1.5', '1.6', '5', '6'):
+ elif self.version in ('1.5', '1.6', '1.7', '1.8', '5', '6'):
self.stackAnonClassBrackets.append(self.brackets)
className = []
className.extend(self.listClasses)
@@ -244,7 +244,8 @@ if java_parsing:
return self
# If that's an inner class which is declared in a method, it
# requires an index prepended to the class-name, e.g.
- # 'Foo$1Inner' (Tigris Issue 2087)
+ # 'Foo$1Inner'
+ # http://scons.tigris.org/issues/show_bug.cgi?id=2087
if self.outer_state.localClasses and \
self.outer_state.stackBrackets[-1] > \
self.outer_state.stackBrackets[-2]+1:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py
index 6389078..90cb0bc 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
Common functions for Microsoft Visual Studio and Visual C/C++.
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py
index ba6d2d6..5bc7ea5 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Module to define supported Windows chip architectures.
"""
@@ -51,6 +51,12 @@ SupportedArchitectureList = [
'ia64',
['IA64'],
),
+
+ ArchitectureDefinition(
+ 'arm',
+ ['ARM'],
+ ),
+
]
SupportedArchitectureMap = {}
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py
index ef1aae9..60d7d40 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
Common helper functions for working with the Microsoft tool chain.
@@ -55,12 +55,12 @@ _is_win64 = None
def is_win64():
"""Return true if running on windows 64 bits.
-
+
Works whether python itself runs in 64 bits or 32 bits."""
# Unfortunately, python does not provide a useful way to determine
# if the underlying Windows OS is 32-bit or 64-bit. Worse, whether
# the Python itself is 32-bit or 64-bit affects what it returns,
- # so nothing in sys.* or os.* help.
+ # so nothing in sys.* or os.* help.
# Apparently the best solution is to use env vars that Windows
# sets. If PROCESSOR_ARCHITECTURE is not x86, then the python
@@ -120,11 +120,21 @@ def normalize_env(env, keys, force=False):
if k in os.environ and (force or not k in normenv):
normenv[k] = os.environ[k].encode('mbcs')
+ # This shouldn't be necessary, since the default environment should include system32,
+ # but keep this here to be safe, since it's needed to find reg.exe which the MSVC
+ # bat scripts use.
+ sys32_dir = os.path.join(os.environ.get("SystemRoot", os.environ.get("windir",r"C:\Windows\system32")),"System32")
+
+ if sys32_dir not in normenv['PATH']:
+ normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir
+
+ debug("PATH: %s"%normenv['PATH'])
+
return normenv
def get_output(vcbat, args = None, env = None):
"""Parse the output of given bat file, with given args."""
-
+
if env is None:
# Create a blank environment, for use in launching the tools
env = SCons.Environment.Environment(tools=[])
@@ -136,6 +146,11 @@ def get_output(vcbat, args = None, env = None):
# settings in vs.py.
vars = [
'COMSPEC',
+# VS100 and VS110: Still set, but modern MSVC setup scripts will
+# discard these if registry has values. However Intel compiler setup
+# script still requires these as of 2013/2014.
+ 'VS110COMNTOOLS',
+ 'VS100COMNTOOLS',
'VS90COMNTOOLS',
'VS80COMNTOOLS',
'VS71COMNTOOLS',
@@ -164,6 +179,11 @@ def get_output(vcbat, args = None, env = None):
# and won't work under Pythons not built with threading.
stdout = popen.stdout.read()
stderr = popen.stderr.read()
+
+ # Extra debug logic, uncomment if necessar
+# debug('get_output():stdout:%s'%stdout)
+# debug('get_output():stderr:%s'%stderr)
+
if stderr:
# TODO: find something better to do with stderr;
# this at least prevents errors from getting swallowed.
@@ -194,7 +214,7 @@ def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")):
p = p.encode('mbcs')
# XXX: For some reason, VC98 .bat file adds "" around the PATH
# values, and it screws up the environment later, so we strip
- # it.
+ # it.
p = p.strip('"')
dkeep[key].append(p)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py
index 30be811..0606e27 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -20,7 +20,7 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
"""
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py
index 6debeb6..537f367 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -19,9 +19,9 @@
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 5023 2010/06/14 22:05:46 scons"
+
+__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Module to detect the Platform/Windows SDK
@@ -172,6 +172,26 @@ SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
#
# If you update this list, update the documentation in Tool/mssdk.xml.
SupportedSDKList = [
+ WindowsSDK('7.1',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
+ WindowsSDK('7.0A',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
WindowsSDK('7.0',
sanity_check_file=r'bin\SetEnv.Cmd',
include_subdir='include',
@@ -337,10 +357,13 @@ def mssdk_setup_env(env):
elif 'MSSDK_VERSION' in env:
sdk_version = env['MSSDK_VERSION']
if sdk_version is None:
- msg = "SDK version %s is not installed" % repr(mssdk)
+ msg = "SDK version is specified as None"
raise SCons.Errors.UserError(msg)
sdk_version = env.subst(sdk_version)
mssdk = get_sdk_by_version(sdk_version)
+ if mssdk is None:
+ msg = "SDK version %s is not installed" % sdk_version
+ raise SCons.Errors.UserError(msg)
sdk_dir = mssdk.get_sdk_dir()
debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir)
elif 'MSVS_VERSION' in env:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py
index 56af18a..02a32a0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@
# * test on 64 bits XP + VS 2005 (and VS 6 if possible)
# * SDK
# * Assembly
-__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Module for Visual C/C++ detection and configuration.
"""
@@ -81,6 +81,7 @@ _ARCH_TO_CANONICAL = {
"itanium" : "ia64",
"x86" : "x86",
"x86_64" : "amd64",
+ "x86_amd64" : "x86_amd64", # Cross compile to 64 bit from 32bits
}
# Given a (host, target) tuple, return the argument for the bat file. Both host
@@ -88,6 +89,8 @@ _ARCH_TO_CANONICAL = {
_HOST_TARGET_ARCH_TO_BAT_ARCH = {
("x86", "x86"): "x86",
("x86", "amd64"): "x86_amd64",
+ ("x86", "x86_amd64"): "x86_amd64",
+ ("amd64", "x86_amd64"): "x86_amd64", # This is present in (at least) VS2012 express
("amd64", "amd64"): "amd64",
("amd64", "x86"): "x86",
("x86", "ia64"): "x86_ia64"
@@ -104,7 +107,7 @@ def get_host_target(env):
# PROCESSOR_ARCHITECTURE.
if not host_platform:
host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '')
-
+
# Retain user requested TARGET_ARCH
req_target_platform = env.get('TARGET_ARCH')
debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform)
@@ -114,7 +117,7 @@ def get_host_target(env):
target_platform = req_target_platform
else:
target_platform = host_platform
-
+
try:
host = _ARCH_TO_CANONICAL[host_platform.lower()]
except KeyError, e:
@@ -124,19 +127,32 @@ def get_host_target(env):
try:
target = _ARCH_TO_CANONICAL[target_platform.lower()]
except KeyError, e:
- raise ValueError("Unrecognized target architecture %s" % target_platform)
+ all_archs = str(_ARCH_TO_CANONICAL.keys())
+ raise ValueError("Unrecognized target architecture %s\n\tValid architectures: %s" % (target_platform, all_archs))
return (host, target,req_target_platform)
-_VCVER = ["12.0", "11.0", "10.0", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
+# If you update this, update SupportedVSList in Tool/MSCommon/vs.py, and the
+# MSVC_VERSION documentation in Tool/msvc.xml.
+_VCVER = ["14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
_VCVER_TO_PRODUCT_DIR = {
- '12.0': [
+ '14.0' : [
+ r'Microsoft\VisualStudio\14.0\Setup\VC\ProductDir'],
+ '14.0Exp' : [
+ r'Microsoft\VCExpress\14.0\Setup\VC\ProductDir'],
+ '12.0' : [
r'Microsoft\VisualStudio\12.0\Setup\VC\ProductDir'],
+ '12.0Exp' : [
+ r'Microsoft\VCExpress\12.0\Setup\VC\ProductDir'],
'11.0': [
r'Microsoft\VisualStudio\11.0\Setup\VC\ProductDir'],
+ '11.0Exp' : [
+ r'Microsoft\VCExpress\11.0\Setup\VC\ProductDir'],
'10.0': [
r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'],
+ '10.0Exp' : [
+ r'Microsoft\VCExpress\10.0\Setup\VC\ProductDir'],
'9.0': [
r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir'],
'9.0Exp' : [
@@ -152,7 +168,7 @@ _VCVER_TO_PRODUCT_DIR = {
'6.0': [
r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir']
}
-
+
def msvc_version_to_maj_min(msvc_version):
msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
@@ -232,7 +248,7 @@ def find_batch_file(env,msvc_version,host_arch,target_arch):
pdir = find_vc_pdir(msvc_version)
if pdir is None:
raise NoVersionFound("No version of Visual Studio found")
-
+
debug('vc.py: find_batch_file() pdir:%s'%pdir)
# filter out e.g. "Exp" from the version name
@@ -250,18 +266,19 @@ def find_batch_file(env,msvc_version,host_arch,target_arch):
if not os.path.exists(batfilename):
debug("Not found: %s" % batfilename)
batfilename = None
-
+
installed_sdks=get_installed_sdks()
for _sdk in installed_sdks:
- sdk_bat_file=_sdk.get_sdk_vc_script(host_arch,target_arch)
- sdk_bat_file_path=os.path.join(pdir,sdk_bat_file)
- debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
- if os.path.exists(sdk_bat_file_path):
- return (batfilename,sdk_bat_file_path)
+ sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch)
+ if not sdk_bat_file:
+ debug("vc.py:find_batch_file() not found:%s"%_sdk)
else:
- debug("vc.py:find_batch_file() not found:%s"%sdk_bat_file_path)
- else:
- return (batfilename,None)
+ sdk_bat_file_path = os.path.join(pdir,sdk_bat_file)
+ if os.path.exists(sdk_bat_file_path):
+ debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
+ return (batfilename,sdk_bat_file_path)
+ return (batfilename,None)
+
__INSTALLED_VCS_RUN = None
@@ -292,8 +309,21 @@ def reset_installed_vcs():
"""Make it try again to find VC. This is just for the tests."""
__INSTALLED_VCS_RUN = None
+# Running these batch files isn't cheap: most of the time spent in
+# msvs.generate() is due to vcvars*.bat. In a build that uses "tools='msvs'"
+# in multiple environments, for example:
+# env1 = Environment(tools='msvs')
+# env2 = Environment(tools='msvs')
+# we can greatly improve the speed of the second and subsequent Environment
+# (or Clone) calls by memoizing the environment variables set by vcvars*.bat.
+script_env_stdout_cache = {}
def script_env(script, args=None):
- stdout = common.get_output(script, args)
+ cache_key = (script, args)
+ stdout = script_env_stdout_cache.get(cache_key, None)
+ if stdout is None:
+ stdout = common.get_output(script, args)
+ script_env_stdout_cache[cache_key] = stdout
+
# Stupid batch files do not set return code: we take a look at the
# beginning of the output for an error message instead
olines = stdout.splitlines()
@@ -307,7 +337,7 @@ def get_default_version(env):
msvc_version = env.get('MSVC_VERSION')
msvs_version = env.get('MSVS_VERSION')
-
+
debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))
if msvs_version and not msvc_version:
@@ -328,9 +358,10 @@ def get_default_version(env):
installed_vcs = cached_get_installed_vcs()
debug('installed_vcs:%s' % installed_vcs)
if not installed_vcs:
- msg = 'No installed VCs'
- debug('msv %s\n' % repr(msg))
- SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
+ #msg = 'No installed VCs'
+ #debug('msv %s\n' % repr(msg))
+ #SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
+ debug('msvc_setup_env: No installed VCs')
return None
msvc_version = installed_vcs[0]
debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version))
@@ -353,18 +384,28 @@ def msvc_find_valid_batch_script(env,version):
# target platform
(host_platform, target_platform,req_target_platform) = get_host_target(env)
- # If the user hasn't specifically requested a TARGET_ARCH, and
- # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
- # 64 bit tools installed
try_target_archs = [target_platform]
- if target_platform=='amd64':
+ debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform))
+
+ # VS2012 has a "cross compile" environment to build 64 bit
+ # with x86_amd64 as the argument to the batch setup script
+ if req_target_platform in ('amd64','x86_64'):
+ try_target_archs.append('x86_amd64')
+ elif not req_target_platform and target_platform in ['amd64','x86_64']:
+ # There may not be "native" amd64, but maybe "cross" x86_amd64 tools
+ try_target_archs.append('x86_amd64')
+ # If the user hasn't specifically requested a TARGET_ARCH, and
+ # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
+ # 64 bit tools installed
try_target_archs.append('x86')
+ debug("msvs_find_valid_batch_script(): host_platform: %s try_target_archs:%s"%(host_platform, try_target_archs))
+
d = None
for tp in try_target_archs:
# Set to current arch.
env['TARGET_ARCH']=tp
-
+
debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)
host_target = (host_platform, tp)
if not is_host_target_supported(host_target, version):
@@ -372,7 +413,7 @@ def msvc_find_valid_batch_script(env,version):
(host_target, version)
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
-
+
# Try to locate a batch file for this host/target platform combo
try:
(vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
@@ -386,7 +427,7 @@ def msvc_find_valid_batch_script(env,version):
warn_msg = warn_msg % (version, cached_get_installed_vcs())
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
continue
-
+
# Try to use the located batch file for this host/target platform combo
debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))
if vc_script:
@@ -395,24 +436,28 @@ def msvc_find_valid_batch_script(env,version):
except BatchFileExecutionError, e:
debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
vc_script=None
+ continue
if not vc_script and sdk_script:
debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
try:
- d = script_env(sdk_script,args=[])
+ d = script_env(sdk_script)
except BatchFileExecutionError,e:
debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
continue
elif not vc_script and not sdk_script:
debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')
continue
-
+
+ debug("vc.py:msvc_find_valid_batch_script() Found a working script/target: %s %s"%(repr(sdk_script),arg))
+ break # We've found a working target_platform, so stop looking
+
# If we cannot find a viable installed compiler, reset the TARGET_ARCH
# To it's initial value
if not d:
env['TARGET_ARCH']=req_target_platform
-
+
return d
-
+
def msvc_setup_env(env):
debug('msvc_setup_env()')
@@ -431,12 +476,12 @@ def msvc_setup_env(env):
env['MSVS_VERSION'] = version
env['MSVS'] = {}
-
+
use_script = env.get('MSVC_USE_SCRIPT', True)
if SCons.Util.is_String(use_script):
debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))
d = script_env(use_script)
- elif use_script:
+ elif use_script:
d = msvc_find_valid_batch_script(env,version)
debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)
if not d:
@@ -457,3 +502,4 @@ def msvc_exists(version=None):
if version is None:
return len(vcs) > 0
return version in vcs
+
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py
index 06030e2..619cbe5 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """Module to detect Visual Studio and/or Visual C/C++
"""
@@ -73,7 +73,7 @@ class VisualStudio(object):
debug('find_vs_dir(): no installed VC %s' % self.vc_version)
return None
return dir
-
+
def find_vs_dir_by_reg(self):
root = 'Software\\'
@@ -91,13 +91,13 @@ class VisualStudio(object):
debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps)
return comps
return None
-
+
def find_vs_dir(self):
""" Can use registry or location of VC to find vs dir
First try to find by registry, and if that fails find via VC dir
"""
-
-
+
+
if True:
vs_dir=self.find_vs_dir_by_reg()
return vs_dir
@@ -115,7 +115,7 @@ class VisualStudio(object):
debug('find_executable(): %s not on file system' % executable)
return None
return executable
-
+
#
def get_batch_file(self):
@@ -199,48 +199,118 @@ class VisualStudio(object):
# good money for in preference to whatever Microsoft makes available
# for free.
#
-# If you update this list, update the documentation in Tool/msvs.xml.
+# If you update this list, update _VCVER and _VCVER_TO_PRODUCT_DIR in
+# Tool/MSCommon/vc.py, and the MSVC_VERSION documentation in Tool/msvc.xml.
SupportedVSList = [
+ # Visual Studio 2015
+ VisualStudio('14.0',
+ vc_version='14.0',
+ sdk_version='10.0A',
+ hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
+ common_tools_var='VS140COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64', "arm"],
+ ),
+
+ # Visual C++ 2015 Express Edition (for Desktop)
+ VisualStudio('14.0Exp',
+ vc_version='14.0',
+ sdk_version='10.0A',
+ hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
+ common_tools_var='VS140COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64', "arm"],
+ ),
+
+ # Visual Studio 2013
+ VisualStudio('12.0',
+ vc_version='12.0',
+ sdk_version='8.1A',
+ hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
+ common_tools_var='VS120COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2013 Express Edition (for Desktop)
+ VisualStudio('12.0Exp',
+ vc_version='12.0',
+ sdk_version='8.1A',
+ hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
+ common_tools_var='VS120COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual Studio 2012
+ VisualStudio('11.0',
+ sdk_version='8.0A',
+ hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
+ common_tools_var='VS110COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2012 Express Edition (for Desktop)
+ VisualStudio('11.0Exp',
+ vc_version='11.0',
+ sdk_version='8.0A',
+ hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
+ common_tools_var='VS110COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
# Visual Studio 2010
- # TODO: find the settings, perhaps from someone with a CTP copy?
- #VisualStudio('TBD',
- # hkey_root=r'TBD',
- # common_tools_var='TBD',
- # executable_path=r'TBD',
- # default_dirname='TBD',
- #),
+ VisualStudio('10.0',
+ sdk_version='7.0A',
+ hkeys=[r'Microsoft\VisualStudio\10.0\Setup\VS\ProductDir'],
+ common_tools_var='VS100COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2010 Express Edition
+ VisualStudio('10.0Exp',
+ vc_version='10.0',
+ sdk_version='7.0A',
+ hkeys=[r'Microsoft\VCExpress\10.0\Setup\VS\ProductDir'],
+ common_tools_var='VS100COMNTOOLS',
+ executable_path=r'Common7\IDE\VCExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86'],
+ ),
# Visual Studio 2008
- # The batch file we look for is in the VC directory,
- # so the devenv.com executable is up in ..\..\Common7\IDE.
VisualStudio('9.0',
- sdk_version='6.1',
+ sdk_version='6.0A',
hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'],
common_tools_var='VS90COMNTOOLS',
executable_path=r'Common7\IDE\devenv.com',
batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio 9',
supported_arch=['x86', 'amd64'],
),
# Visual C++ 2008 Express Edition
- # The batch file we look for is in the VC directory,
- # so the VCExpress.exe executable is up in ..\..\Common7\IDE.
VisualStudio('9.0Exp',
vc_version='9.0',
- sdk_version='6.1',
+ sdk_version='6.0A',
hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'],
common_tools_var='VS90COMNTOOLS',
executable_path=r'Common7\IDE\VCExpress.exe',
batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio 9',
supported_arch=['x86'],
),
# Visual Studio 2005
- # The batch file we look for is in the VC directory,
- # so the devenv.com executable is up in ..\..\Common7\IDE.
VisualStudio('8.0',
sdk_version='6.0A',
hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'],
@@ -252,8 +322,6 @@ SupportedVSList = [
),
# Visual C++ 2005 Express Edition
- # The batch file we look for is in the VC directory,
- # so the VCExpress.exe executable is up in ..\..\Common7\IDE.
VisualStudio('8.0Exp',
vc_version='8.0Exp',
sdk_version='6.0A',
@@ -266,8 +334,6 @@ SupportedVSList = [
),
# Visual Studio .NET 2003
- # The batch file we look for is in the Common7\Tools directory,
- # so the devenv.com executable is next door in ..\IDE.
VisualStudio('7.1',
sdk_version='6.0',
hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'],
@@ -279,8 +345,6 @@ SupportedVSList = [
),
# Visual Studio .NET
- # The batch file we look for is in the Common7\Tools directory,
- # so the devenv.com executable is next door in ..\IDE.
VisualStudio('7.0',
sdk_version='2003R2',
hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'],
@@ -339,11 +403,11 @@ def reset_installed_visual_studios():
InstalledVSMap = None
for vs in SupportedVSList:
vs.reset()
-
+
# Need to clear installed VC's as well as they are used in finding
# installed VS's
SCons.Tool.MSCommon.vc.reset_installed_vcs()
-
+
# We may be asked to update multiple construction environments with
# SDK information. When doing this, we check on-disk for whether
@@ -408,7 +472,7 @@ def get_default_version(env):
If no version was requested by the user through the MSVS environment
variable, query all the available the visual studios through
- query_versions, and take the highest one.
+ get_installed_visual_studios, and take the highest one.
Return
------
@@ -416,6 +480,7 @@ def get_default_version(env):
the default version.
"""
if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']):
+ # get all versions, and remember them for speed later
versions = [vs.version for vs in get_installed_visual_studios()]
env['MSVS'] = {'VERSIONS' : versions}
else:
@@ -425,6 +490,8 @@ def get_default_version(env):
if versions:
env['MSVS_VERSION'] = versions[0] #use highest version by default
else:
+ debug('get_default_version: WARNING: no installed versions found, '
+ 'using first in SupportedVSList (%s)'%SupportedVSList[0].version)
env['MSVS_VERSION'] = SupportedVSList[0].version
env['MSVS']['VERSION'] = env['MSVS_VERSION']
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py
index 43d9f6e..ddff25f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py
@@ -8,7 +8,7 @@ selection method.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/Perforce.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/Perforce.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py
index 64dd02f..576dea1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py
@@ -7,7 +7,7 @@ Phar Lap ETS tool chain. Right now, this is linkloc and
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ Phar Lap ETS tool chain. Right now, this is linkloc and
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py
index 5c5a6bd..d63bcd4 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py
@@ -8,7 +8,7 @@ selection method.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/RCS.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/RCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py
index 2983b83..76f69e7 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py
@@ -8,7 +8,7 @@ selection method.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/SCCS.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/SCCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py
index 26ff700..85470b1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py
@@ -8,7 +8,7 @@ selection method.
"""
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/Subversion.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/Subversion.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py
index e38d85f..bb9729a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py
@@ -14,7 +14,7 @@ tool definition.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -35,10 +35,13 @@ tool definition.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import imp
import sys
+import re
+import os
+import shutil
import SCons.Builder
import SCons.Errors
@@ -62,7 +65,7 @@ CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
".h", ".H", ".hxx", ".hpp", ".hh",
".F", ".fpp", ".FPP",
".m", ".mm",
- ".S", ".spp", ".SPP"]
+ ".S", ".spp", ".SPP", ".sx"]
DSuffixes = ['.d']
@@ -233,6 +236,151 @@ def createStaticLibBuilder(env):
return static_lib
+def VersionShLibLinkNames(version, libname, env):
+ """Generate names of symlinks to the versioned shared library"""
+ Verbose = False
+ platform = env.subst('$PLATFORM')
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
+
+ linknames = []
+ if version.count(".") != 2:
+ # We need a version string of the form x.y.z to proceed
+ # Several changes need to be made to support versions like x.y
+ raise ValueError
+
+ if platform == 'darwin':
+ # For libfoo.x.y.z.dylib, linknames libfoo.so
+ suffix_re = re.escape('.' + version + shlib_suffix)
+ linkname = re.sub(suffix_re, shlib_suffix, libname)
+ if Verbose:
+ print "VersionShLibLinkNames: linkname = ",linkname
+ linknames.append(linkname)
+ elif platform == 'posix' or platform == 'sunos':
+ if sys.platform.startswith('openbsd'):
+ # OpenBSD uses x.y shared library versioning numbering convention
+ # and doesn't use symlinks to backwards-compatible libraries
+ return []
+ # For libfoo.so.x.y.z, linknames libfoo.so libfoo.so.x.y libfoo.so.x
+ suffix_re = re.escape(shlib_suffix + '.' + version)
+ # First linkname has no version number
+ linkname = re.sub(suffix_re, shlib_suffix, libname)
+ if Verbose:
+ print "VersionShLibLinkNames: linkname = ",linkname
+ linknames.append(linkname)
+ versionparts = version.split('.')
+ major_name = linkname + "." + versionparts[0]
+ minor_name = major_name + "." + versionparts[1]
+ #Only add link for major_name
+ #for linkname in [major_name, minor_name]:
+ for linkname in [major_name, ]:
+ if Verbose:
+ print "VersionShLibLinkNames: linkname ",linkname, ", target ",libname
+ linknames.append(linkname)
+ # note: no Windows case here (win32 or cygwin);
+ # MSVC doesn't support this type of versioned shared libs.
+ # (could probably do something for MinGW though)
+ return linknames
+
+def VersionedSharedLibrary(target = None, source= None, env=None):
+ """Build a shared library. If the environment has SHLIBVERSION
+defined make a versioned shared library and create the appropriate
+symlinks for the platform we are on"""
+ Verbose = False
+ try:
+ version = env.subst('$SHLIBVERSION')
+ except KeyError:
+ version = None
+
+ # libname includes the version number if one was given
+ libname = getattr(target[0].attributes, 'shlibname', target[0].name)
+ platform = env.subst('$PLATFORM')
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
+ if Verbose:
+ print "VersionShLib: libname = ",libname
+ print "VersionShLib: platform = ",platform
+ print "VersionShLib: shlib_suffix = ",shlib_suffix
+ print "VersionShLib: target = ",str(target[0])
+
+ if version:
+ # set the shared library link flags
+ if platform == 'posix':
+ shlink_flags += [ '-Wl,-Bsymbolic' ]
+ # OpenBSD doesn't usually use SONAME for libraries
+ if not sys.platform.startswith('openbsd'):
+ # continue setup of shlink flags for all other POSIX systems
+ suffix_re = re.escape(shlib_suffix + '.' + version)
+ (major, age, revision) = version.split(".")
+ # soname will have only the major version number in it
+ soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
+ shlink_flags += [ '-Wl,-soname=%s' % soname ]
+ if Verbose:
+ print " soname ",soname,", shlink_flags ",shlink_flags
+ elif platform == 'sunos':
+ suffix_re = re.escape(shlib_suffix + '.' + version)
+ (major, age, revision) = version.split(".")
+ soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
+ shlink_flags += [ '-h', soname ]
+ elif platform == 'cygwin':
+ shlink_flags += [ '-Wl,-Bsymbolic',
+ '-Wl,--out-implib,${TARGET.base}.a' ]
+ elif platform == 'darwin':
+ shlink_flags += [ '-current_version', '%s' % version,
+ '-compatibility_version', '%s' % version,
+ '-undefined', 'dynamic_lookup' ]
+ if Verbose:
+ print "VersionShLib: shlink_flags = ",shlink_flags
+ envlink = env.Clone()
+ envlink['SHLINKFLAGS'] = shlink_flags
+ else:
+ envlink = env
+
+ result = SCons.Defaults.ShLinkAction(target, source, envlink)
+
+ if version:
+ # here we need the full pathname so the links end up in the right directory
+ libname = getattr(target[0].attributes, 'shlibpath', target[0].get_internal_path())
+ if Verbose:
+ print "VerShLib: target lib is = ", libname
+ print "VerShLib: name is = ", target[0].name
+ print "VerShLib: dir is = ", target[0].dir.path
+ linknames = VersionShLibLinkNames(version, libname, env)
+ if Verbose:
+ print "VerShLib: linknames ",linknames
+ # Here we just need the file name w/o path as the target of the link
+ lib_ver = getattr(target[0].attributes, 'shlibname', target[0].name)
+ # make symlink of adjacent names in linknames
+ for count in range(len(linknames)):
+ linkname = linknames[count]
+ if count > 0:
+ try:
+ os.remove(lastlinkname)
+ except:
+ pass
+ os.symlink(os.path.basename(linkname),lastlinkname)
+ if Verbose:
+ print "VerShLib: made sym link of %s -> %s" % (lastlinkname,linkname)
+ lastlinkname = linkname
+ # finish chain of sym links with link to the actual library
+ if len(linknames)>0:
+ try:
+ os.remove(lastlinkname)
+ except:
+ pass
+ os.symlink(lib_ver,lastlinkname)
+ if Verbose:
+ print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver)
+ return result
+
+# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 :
+# Ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM.
+# This was tricky because we don't want changing LIBPATH to cause a rebuild, but
+# changing other link args should. LIBPATH has $( ... $) around it but until this
+# fix, when the varlist was added to the build sig those ignored parts weren't getting
+# ignored.
+ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None, varlist=['SHLINKCOM'])
+
def createSharedLibBuilder(env):
"""This is a utility function that creates the SharedLibrary
Builder in an Environment if it is not there already.
@@ -245,7 +393,7 @@ def createSharedLibBuilder(env):
except KeyError:
import SCons.Defaults
action_list = [ SCons.Defaults.SharedCheck,
- SCons.Defaults.ShLinkAction ]
+ ShLibAction ]
shared_lib = SCons.Builder.Builder(action = action_list,
emitter = "$SHLIBEMITTER",
prefix = '$SHLIBPREFIX',
@@ -527,13 +675,16 @@ class ToolInitializer(object):
# the ToolInitializer class.
def Initializers(env):
- ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs'])
+ ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs', '_InternalInstallVersionedLib'])
def Install(self, *args, **kw):
return self._InternalInstall(*args, **kw)
def InstallAs(self, *args, **kw):
return self._InternalInstallAs(*args, **kw)
+ def InstallVersionedLib(self, *args, **kw):
+ return self._InternalInstallVersionedLib(*args, **kw)
env.AddMethod(Install)
env.AddMethod(InstallAs)
+ env.AddMethod(InstallVersionedLib)
def FindTool(tools, env):
for tool in tools:
@@ -563,7 +714,7 @@ def tool_list(platform, env):
assemblers = ['masm', 'nasm', 'gas', '386asm' ]
fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran']
ars = ['mslib', 'ar', 'tlib']
- other_plat_tools=['msvs','midl']
+ other_plat_tools = ['msvs', 'midl']
elif str(platform) == 'os2':
"prefer IBM tools on OS/2"
linkers = ['ilink', 'gnulink', ]#'mslink']
@@ -613,6 +764,14 @@ def tool_list(platform, env):
assemblers = ['as']
fortran_compilers = ['gfortran', 'f95', 'f90', 'g77']
ars = ['ar']
+ elif str(platform) == 'cygwin':
+ "prefer GNU tools on Cygwin, except for a platform-specific linker"
+ linkers = ['cyglink', 'mslink', 'ilink']
+ c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc']
+ cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++']
+ assemblers = ['gas', 'nasm', 'masm']
+ fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
+ ars = ['ar', 'mslib']
else:
"prefer GNU tools on all other platforms"
linkers = ['gnulink', 'mslink', 'ilink']
@@ -622,6 +781,9 @@ def tool_list(platform, env):
fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
ars = ['ar', 'mslib']
+ if not str(platform) == 'win32':
+ other_plat_tools += ['m4', 'rpm']
+
c_compiler = FindTool(c_compilers, env) or c_compilers[0]
# XXX this logic about what tool provides what should somehow be
@@ -645,12 +807,13 @@ def tool_list(platform, env):
fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0]
ar = FindTool(ars, env) or ars[0]
+ d_compilers = ['dmd', 'gdc', 'ldc']
+ d_compiler = FindTool(d_compilers, env) or d_compilers[0]
+
other_tools = FindAllTools(other_plat_tools + [
- 'dmd',
#TODO: merge 'install' into 'filesystem' and
# make 'filesystem' the default
'filesystem',
- 'm4',
'wix', #'midl', 'msvs',
# Parser generators
'lex', 'yacc',
@@ -662,14 +825,14 @@ def tool_list(platform, env):
'dvipdf', 'dvips', 'gs',
'tex', 'latex', 'pdflatex', 'pdftex',
# Archivers
- 'tar', 'zip', 'rpm',
+ 'tar', 'zip',
# SourceCode factories
'BitKeeper', 'CVS', 'Perforce',
'RCS', 'SCCS', # 'Subversion',
], env)
tools = ([linker, c_compiler, cxx_compiler,
- fortran_compiler, assembler, ar]
+ fortran_compiler, assembler, ar, d_compiler]
+ other_tools)
return [x for x in tools if x]
@@ -679,3 +842,4 @@ def tool_list(platform, env):
# indent-tabs-mode:nil
# End:
# vim: set expandtab tabstop=4 shiftwidth=4:
+
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py
index 62c5ef7..864fcdf 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/aixc++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/aixc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -43,32 +43,25 @@ packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp']
def get_xlc(env):
xlc = env.get('CXX', 'xlC')
- xlc_r = env.get('SHCXX', 'xlC_r')
- return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages)
-
-def smart_cxxflags(source, target, env, for_signature):
- build_dir = env.GetBuildPath()
- if build_dir:
- return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
- return ''
+ return SCons.Platform.aix.get_xlc(env, xlc, packages)
def generate(env):
"""Add Builders and construction variables for xlC / Visual Age
suite to an Environment."""
- path, _cxx, _shcxx, version = get_xlc(env)
- if path:
+ path, _cxx, version = get_xlc(env)
+ if path and _cxx:
_cxx = os.path.join(path, _cxx)
- _shcxx = os.path.join(path, _shcxx)
+
+ if 'CXX' not in env:
+ env['CXX'] = _cxx
cplusplus.generate(env)
- env['CXX'] = _cxx
- env['SHCXX'] = _shcxx
- env['CXXVERSION'] = version
- env['SHOBJSUFFIX'] = '.pic.o'
+ if version:
+ env['CXXVERSION'] = version
def exists(env):
- path, _cxx, _shcxx, version = get_xlc(env)
+ path, _cxx, version = get_xlc(env)
if path and _cxx:
xlc = os.path.join(path, _cxx)
if os.path.exists(xlc):
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py
index bf1de34..02e0649 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/aixcc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/aixcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -42,25 +42,25 @@ packages = ['vac.C', 'ibmcxx.cmp']
def get_xlc(env):
xlc = env.get('CC', 'xlc')
- xlc_r = env.get('SHCC', 'xlc_r')
- return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages)
+ return SCons.Platform.aix.get_xlc(env, xlc, packages)
def generate(env):
"""Add Builders and construction variables for xlc / Visual Age
suite to an Environment."""
- path, _cc, _shcc, version = get_xlc(env)
- if path:
+ path, _cc, version = get_xlc(env)
+ if path and _cc:
_cc = os.path.join(path, _cc)
- _shcc = os.path.join(path, _shcc)
+
+ if 'CC' not in env:
+ env['CC'] = _cc
cc.generate(env)
- env['CC'] = _cc
- env['SHCC'] = _shcc
- env['CCVERSION'] = version
+ if version:
+ env['CCVERSION'] = version
def exists(env):
- path, _cc, _shcc, version = get_xlc(env)
+ path, _cc, version = get_xlc(env)
if path and _cc:
xlc = os.path.join(path, _cc)
if os.path.exists(xlc):
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py
index f680247..5327cf7 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/aixf77.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/aixf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py
index 9531a4b..7ad9cc6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,14 +30,13 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/aixlink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/aixlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
import SCons.Util
-import aixcc
import link
cplusplus = __import__('c++', globals(), locals(), [])
@@ -62,12 +61,14 @@ def generate(env):
env['SHLIBSUFFIX'] = '.a'
def exists(env):
- path, _cc, _shcc, version = aixcc.get_xlc(env)
- if path and _cc:
- xlc = os.path.join(path, _cc)
- if os.path.exists(xlc):
- return xlc
- return None
+ # TODO: sync with link.smart_link() to choose a linker
+ linkers = { 'CXX': ['aixc++'], 'CC': ['aixcc'] }
+ alltools = []
+ for langvar, linktools in linkers.items():
+ if langvar in env: # use CC over CXX when user specified CC but not CXX
+ return SCons.Tool.FindTool(linktools, env)
+ alltools.extend(linktools)
+ return SCons.Tool.FindTool(alltools, env)
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py
index 4b3ae77..9ef1b75 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/applelink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/applelink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py
index 68effb1..2d7f7b9 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ar.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ar.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/as.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py
index f18ff57..6c7304f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/as.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/as.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/as.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py
index b7c7bf2..a8295a3 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py
@@ -5,7 +5,7 @@ XXX
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ XXX
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/bcc32.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/bcc32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/c++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py
index 907324d..580bf9c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/c++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/c++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/c++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -72,7 +72,8 @@ def generate(env):
SCons.Tool.cc.add_common_cc_variables(env)
- env['CXX'] = 'c++'
+ if 'CXX' not in env:
+ env['CXX'] = env.Detect(compilers) or compilers[0]
env['CXXFLAGS'] = SCons.Util.CLVar('')
env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
env['SHCXX'] = '$CXX'
@@ -90,7 +91,7 @@ def generate(env):
env['CXXFILESUFFIX'] = '.cc'
def exists(env):
- return env.Detect(compilers)
+ return env.Detect(env.get('CXX', compilers))
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py
index c3a6b92..7332ad0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/cc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/cc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool
import SCons.Defaults
@@ -62,6 +62,8 @@ def add_common_cc_variables(env):
if 'SHCCFLAGS' not in env:
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+compilers = ['cc']
+
def generate(env):
"""
Add Builders and construction variables for C compilers to an Environment.
@@ -76,7 +78,8 @@ def generate(env):
add_common_cc_variables(env)
- env['CC'] = 'cc'
+ if 'CC' not in env:
+ env['CC'] = env.Detect(compilers) or compilers[0]
env['CFLAGS'] = SCons.Util.CLVar('')
env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
env['SHCC'] = '$CC'
@@ -93,7 +96,7 @@ def generate(env):
env['CFILESUFFIX'] = '.c'
def exists(env):
- return env.Detect('cc')
+ return env.Detect(env.get('CC', compilers))
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py
index 4860241..89ac9fb 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py
@@ -5,7 +5,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/cvf.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/cvf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import fortran
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py
new file mode 100644
index 0000000..87716cf
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py
@@ -0,0 +1,94 @@
+"""SCons.Tool.cyglink
+
+Customization of gnulink for Cygwin (http://www.cygwin.com/)
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+import SCons.Action
+import SCons.Util
+
+import gnulink
+
+def shlib_generator(target, source, env, for_signature):
+ cmd = SCons.Util.CLVar(['$SHLINK'])
+
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ if dll: cmd.extend(['-o', dll])
+
+ cmd.extend(['$SHLINKFLAGS', '$__RPATH'])
+
+ implib = env.FindIxes(target, 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
+ if implib:
+ cmd.extend([
+ '-Wl,--out-implib='+implib.get_string(for_signature),
+ '-Wl,--export-all-symbols',
+ '-Wl,--enable-auto-import',
+ '-Wl,--whole-archive', '$SOURCES',
+ '-Wl,--no-whole-archive', '$_LIBDIRFLAGS', '$_LIBFLAGS'
+ ])
+ else:
+ cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+ return [cmd]
+
+def shlib_emitter(target, source, env):
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ no_import_lib = env.get('no_import_lib', 0)
+
+ if not dll or len(target) > 1:
+ raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
+
+ # Remove any "lib" after the prefix
+ pre = env.subst('$SHLIBPREFIX')
+ if dll.name[len(pre):len(pre)+3] == 'lib':
+ dll.name = pre + dll.name[len(pre)+3:]
+
+ orig_target = target
+ target = [env.fs.File(dll)]
+ target[0].attributes.shared = 1
+
+ # Append an import lib target
+ if not no_import_lib:
+ # Create list of target libraries as strings
+ target_strings = env.ReplaceIxes(orig_target[0],
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
+
+ implib_target = env.fs.File(target_strings)
+ implib_target.attributes.shared = 1
+ target.append(implib_target)
+
+ return (target, source)
+
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+
+def generate(env):
+ """Add Builders and construction variables for cyglink to an Environment."""
+ gnulink.generate(env)
+
+ env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,-no-undefined')
+
+ env['SHLINKCOM'] = shlib_action
+ env['LDMODULECOM'] = shlib_action
+ env.Append(SHLIBEMITTER = [shlib_emitter])
+
+ env['SHLIBPREFIX'] = 'cyg'
+ env['SHLIBSUFFIX'] = '.dll'
+
+ env['IMPLIBPREFIX'] = 'lib'
+ env['IMPLIBSUFFIX'] = '.dll.a'
+
+def exists(env):
+ return gnulink.exists(env)
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/default.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py
index a2883d7..35e872c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/default.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/default.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/default.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py
new file mode 100644
index 0000000..327da15
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py
@@ -0,0 +1,152 @@
+"""SCons.Tool.dmd
+
+Tool-specific initialization for the Digital Mars D compiler.
+(http://digitalmars.com/d)
+
+Originally coded by Andy Friesen (andy@ikagames.com)
+15 November 2003
+
+Evolved by Russel Winder (russel@winder.org.uk)
+2010-02-07 onwards
+
+There are a number of problems with this script at this point in time.
+The one that irritates the most is the Windows linker setup. The D
+linker doesn't have a way to add lib paths on the commandline, as far
+as I can see. You have to specify paths relative to the SConscript or
+use absolute paths. To hack around it, add '#/blah'. This will link
+blah.lib from the directory where SConstruct resides.
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to dmd or gdmd,
+ whichever is found.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to dmd or gdmd,
+ whichever is found.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/dmd.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import os
+import subprocess
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.D
+import SCons.Tool
+
+import SCons.Tool.DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect(['dmd', 'gdmd'])
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC -of$TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I'
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['DSHLINK'] = '$DC'
+ env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so')
+ env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
+ env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
+ env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+
+ env['DLIBDIRPREFIX'] = '-L-L'
+ env['DLIBDIRSUFFIX'] = ''
+ env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['DRPATHPREFIX'] = '-L-rpath='
+ env['DRPATHSUFFIX'] = ''
+ env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+
+ SCons.Tool.createStaticLibBuilder(env)
+
+
+def exists(env):
+ return env.Detect(['dmd', 'gdmd'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py
new file mode 100644
index 0000000..aead43c
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py
@@ -0,0 +1,882 @@
+
+"""SCons.Tool.docbook
+
+Tool-specific initialization for Docbook.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001-7,2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+import os
+import glob
+import re
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Script
+import SCons.Tool
+import SCons.Util
+
+# Get full path to this script
+scriptpath = os.path.dirname(os.path.realpath(__file__))
+
+# Local folder for the collection of DocBook XSLs
+db_xsl_folder = 'docbook-xsl-1.76.1'
+
+# Do we have libxml2/libxslt/lxml?
+has_libxml2 = True
+has_lxml = True
+try:
+ import libxml2
+ import libxslt
+except:
+ has_libxml2 = False
+try:
+ import lxml
+except:
+ has_lxml = False
+
+# Set this to True, to prefer xsltproc over libxml2 and lxml
+prefer_xsltproc = False
+
+# Regexs for parsing Docbook XML sources of MAN pages
+re_manvolnum = re.compile("<manvolnum>([^<]*)</manvolnum>")
+re_refname = re.compile("<refname>([^<]*)</refname>")
+
+#
+# Helper functions
+#
+def __extend_targets_sources(target, source):
+ """ Prepare the lists of target and source files. """
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target[:]
+ elif not SCons.Util.is_List(source):
+ source = [source]
+ if len(target) < len(source):
+ target.extend(source[len(target):])
+
+ return target, source
+
+def __init_xsl_stylesheet(kw, env, user_xsl_var, default_path):
+ if kw.get('DOCBOOK_XSL','') == '':
+ xsl_style = kw.get('xsl', env.subst(user_xsl_var))
+ if xsl_style == '':
+ path_args = [scriptpath, db_xsl_folder] + default_path
+ xsl_style = os.path.join(*path_args)
+ kw['DOCBOOK_XSL'] = xsl_style
+
+def __select_builder(lxml_builder, libxml2_builder, cmdline_builder):
+ """ Selects a builder, based on which Python modules are present. """
+ if prefer_xsltproc:
+ return cmdline_builder
+
+ if not has_libxml2:
+ # At the moment we prefer libxml2 over lxml, the latter can lead
+ # to conflicts when installed together with libxml2.
+ if has_lxml:
+ return lxml_builder
+ else:
+ return cmdline_builder
+
+ return libxml2_builder
+
+def __ensure_suffix(t, suffix):
+ """ Ensure that the target t has the given suffix. """
+ tpath = str(t)
+ if not tpath.endswith(suffix):
+ return tpath+suffix
+
+ return t
+
+def __ensure_suffix_stem(t, suffix):
+ """ Ensure that the target t has the given suffix, and return the file's stem. """
+ tpath = str(t)
+ if not tpath.endswith(suffix):
+ stem = tpath
+ tpath += suffix
+
+ return tpath, stem
+ else:
+ stem, ext = os.path.splitext(tpath)
+
+ return t, stem
+
+def __get_xml_text(root):
+ """ Return the text for the given root node (xml.dom.minidom). """
+ txt = ""
+ for e in root.childNodes:
+ if (e.nodeType == e.TEXT_NODE):
+ txt += e.data
+ return txt
+
+def __create_output_dir(base_dir):
+ """ Ensure that the output directory base_dir exists. """
+ root, tail = os.path.split(base_dir)
+ dir = None
+ if tail:
+ if base_dir.endswith('/'):
+ dir = base_dir
+ else:
+ dir = root
+ else:
+ if base_dir.endswith('/'):
+ dir = base_dir
+
+ if dir and not os.path.isdir(dir):
+ os.makedirs(dir)
+
+
+#
+# Supported command line tools and their call "signature"
+#
+xsltproc_com = {'xsltproc' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE',
+ 'saxon' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
+ 'saxon-xslt' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
+ 'xalan' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -q -out $TARGET -xsl $DOCBOOK_XSL -in $SOURCE'}
+xmllint_com = {'xmllint' : '$DOCBOOK_XMLLINT $DOCBOOK_XMLLINTFLAGS --xinclude $SOURCE > $TARGET'}
+fop_com = {'fop' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -fo $SOURCE -pdf $TARGET',
+ 'xep' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -valid -fo $SOURCE -pdf $TARGET',
+ 'jw' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -f docbook -b pdf $SOURCE -o $TARGET'}
+
+def __detect_cl_tool(env, chainkey, cdict):
+ """
+ Helper function, picks a command line tool from the list
+ and initializes its environment variables.
+ """
+ if env.get(chainkey,'') == '':
+ clpath = ''
+ for cltool in cdict:
+ clpath = env.WhereIs(cltool)
+ if clpath:
+ env[chainkey] = clpath
+ if not env[chainkey + 'COM']:
+ env[chainkey + 'COM'] = cdict[cltool]
+
+def _detect(env):
+ """
+ Detect all the command line tools that we might need for creating
+ the requested output formats.
+ """
+ global prefer_xsltproc
+
+ if env.get('DOCBOOK_PREFER_XSLTPROC',''):
+ prefer_xsltproc = True
+
+ if ((not has_libxml2 and not has_lxml) or (prefer_xsltproc)):
+ # Try to find the XSLT processors
+ __detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com)
+ __detect_cl_tool(env, 'DOCBOOK_XMLLINT', xmllint_com)
+
+ __detect_cl_tool(env, 'DOCBOOK_FOP', fop_com)
+
+#
+# Scanners
+#
+include_re = re.compile('fileref\\s*=\\s*["|\']([^\\n]*)["|\']')
+sentity_re = re.compile('<!ENTITY\\s+%*\\s*[^\\s]+\\s+SYSTEM\\s+["|\']([^\\n]*)["|\']>')
+
+def __xml_scan(node, env, path, arg):
+ """ Simple XML file scanner, detecting local images and XIncludes as implicit dependencies. """
+ # Does the node exist yet?
+ if not os.path.isfile(str(node)):
+ return []
+
+ if env.get('DOCBOOK_SCANENT',''):
+ # Use simple pattern matching for system entities..., no support
+ # for recursion yet.
+ contents = node.get_text_contents()
+ return sentity_re.findall(contents)
+
+ xsl_file = os.path.join(scriptpath,'utils','xmldepend.xsl')
+ if not has_libxml2 or prefer_xsltproc:
+ if has_lxml and not prefer_xsltproc:
+
+ from lxml import etree
+
+ xsl_tree = etree.parse(xsl_file)
+ doc = etree.parse(str(node))
+ result = doc.xslt(xsl_tree)
+
+ depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
+ return depfiles
+ else:
+ # Try to call xsltproc
+ xsltproc = env.subst("$DOCBOOK_XSLTPROC")
+ if xsltproc and xsltproc.endswith('xsltproc'):
+ result = env.backtick(' '.join([xsltproc, xsl_file, str(node)]))
+ depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
+ return depfiles
+ else:
+ # Use simple pattern matching, there is currently no support
+ # for xi:includes...
+ contents = node.get_text_contents()
+ return include_re.findall(contents)
+
+ styledoc = libxml2.parseFile(xsl_file)
+ style = libxslt.parseStylesheetDoc(styledoc)
+ doc = libxml2.readFile(str(node), None, libxml2.XML_PARSE_NOENT)
+ result = style.applyStylesheet(doc, None)
+
+ depfiles = []
+ for x in str(result).splitlines():
+ if x.strip() != "" and not x.startswith("<?xml "):
+ depfiles.extend(x.strip().split())
+
+ style.freeStylesheet()
+ doc.freeDoc()
+ result.freeDoc()
+
+ return depfiles
+
+# Creating the instance of our XML dependency scanner
+docbook_xml_scanner = SCons.Script.Scanner(function = __xml_scan,
+ argument = None)
+
+
+#
+# Action generators
+#
+def __generate_xsltproc_action(source, target, env, for_signature):
+ cmd = env['DOCBOOK_XSLTPROCCOM']
+ # Does the environment have a base_dir defined?
+ base_dir = env.subst('$base_dir')
+ if base_dir:
+ # Yes, so replace target path by its filename
+ return cmd.replace('$TARGET','${TARGET.file}')
+ return cmd
+
+
+#
+# Emitters
+#
+def __emit_xsl_basedir(target, source, env):
+ # Does the environment have a base_dir defined?
+ base_dir = env.subst('$base_dir')
+ if base_dir:
+ # Yes, so prepend it to each target
+ return [os.path.join(base_dir, str(t)) for t in target], source
+
+ # No, so simply pass target and source names through
+ return target, source
+
+
+#
+# Builders
+#
+def __build_libxml2(target, source, env):
+ """
+ General XSLT builder (HTML/FO), using the libxml2 module.
+ """
+ xsl_style = env.subst('$DOCBOOK_XSL')
+ styledoc = libxml2.parseFile(xsl_style)
+ style = libxslt.parseStylesheetDoc(styledoc)
+ doc = libxml2.readFile(str(source[0]),None,libxml2.XML_PARSE_NOENT)
+ # Support for additional parameters
+ parampass = {}
+ if parampass:
+ result = style.applyStylesheet(doc, parampass)
+ else:
+ result = style.applyStylesheet(doc, None)
+ style.saveResultToFilename(str(target[0]), result, 0)
+ style.freeStylesheet()
+ doc.freeDoc()
+ result.freeDoc()
+
+ return None
+
+def __build_lxml(target, source, env):
+ """
+ General XSLT builder (HTML/FO), using the lxml module.
+ """
+ from lxml import etree
+
+ xslt_ac = etree.XSLTAccessControl(read_file=True,
+ write_file=True,
+ create_dir=True,
+ read_network=False,
+ write_network=False)
+ xsl_style = env.subst('$DOCBOOK_XSL')
+ xsl_tree = etree.parse(xsl_style)
+ transform = etree.XSLT(xsl_tree, access_control=xslt_ac)
+ doc = etree.parse(str(source[0]))
+ # Support for additional parameters
+ parampass = {}
+ if parampass:
+ result = transform(doc, **parampass)
+ else:
+ result = transform(doc)
+
+ try:
+ of = open(str(target[0]), "w")
+ of.write(of.write(etree.tostring(result, pretty_print=True)))
+ of.close()
+ except:
+ pass
+
+ return None
+
+def __xinclude_libxml2(target, source, env):
+ """
+ Resolving XIncludes, using the libxml2 module.
+ """
+ doc = libxml2.readFile(str(source[0]), None, libxml2.XML_PARSE_NOENT)
+ doc.xincludeProcessFlags(libxml2.XML_PARSE_NOENT)
+ doc.saveFile(str(target[0]))
+ doc.freeDoc()
+
+ return None
+
+def __xinclude_lxml(target, source, env):
+ """
+ Resolving XIncludes, using the lxml module.
+ """
+ from lxml import etree
+
+ doc = etree.parse(str(source[0]))
+ doc.xinclude()
+ try:
+ doc.write(str(target[0]), xml_declaration=True,
+ encoding="UTF-8", pretty_print=True)
+ except:
+ pass
+
+ return None
+
+__libxml2_builder = SCons.Builder.Builder(
+ action = __build_libxml2,
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+__lxml_builder = SCons.Builder.Builder(
+ action = __build_lxml,
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+
+__xinclude_libxml2_builder = SCons.Builder.Builder(
+ action = __xinclude_libxml2,
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+__xinclude_lxml_builder = SCons.Builder.Builder(
+ action = __xinclude_lxml,
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+
+__xsltproc_builder = SCons.Builder.Builder(
+ action = SCons.Action.CommandGeneratorAction(__generate_xsltproc_action,
+ {'cmdstr' : '$DOCBOOK_XSLTPROCCOMSTR'}),
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+__xmllint_builder = SCons.Builder.Builder(
+ action = SCons.Action.Action('$DOCBOOK_XMLLINTCOM','$DOCBOOK_XMLLINTCOMSTR'),
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+__fop_builder = SCons.Builder.Builder(
+ action = SCons.Action.Action('$DOCBOOK_FOPCOM','$DOCBOOK_FOPCOMSTR'),
+ suffix = '.pdf',
+ src_suffix = '.fo',
+ ensure_suffix=1)
+
+def DocbookEpub(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for ePub output.
+ """
+ import zipfile
+ import shutil
+
+ def build_open_container(target, source, env):
+ """Generate the *.epub file from intermediate outputs
+
+ Constructs the epub file according to the Open Container Format. This
+ function could be replaced by a call to the SCons Zip builder if support
+ was added for different compression formats for separate source nodes.
+ """
+ zf = zipfile.ZipFile(str(target[0]), 'w')
+ mime_file = open('mimetype', 'w')
+ mime_file.write('application/epub+zip')
+ mime_file.close()
+ zf.write(mime_file.name, compress_type = zipfile.ZIP_STORED)
+ for s in source:
+ if os.path.isfile(str(s)):
+ head, tail = os.path.split(str(s))
+ if not head:
+ continue
+ s = head
+ for dirpath, dirnames, filenames in os.walk(str(s)):
+ for fname in filenames:
+ path = os.path.join(dirpath, fname)
+ if os.path.isfile(path):
+ zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))),
+ zipfile.ZIP_DEFLATED)
+ zf.close()
+
+ def add_resources(target, source, env):
+ """Add missing resources to the OEBPS directory
+
+ Ensure all the resources in the manifest are present in the OEBPS directory.
+ """
+ hrefs = []
+ content_file = os.path.join(source[0].get_abspath(), 'content.opf')
+ if not os.path.isfile(content_file):
+ return
+
+ hrefs = []
+ if has_libxml2:
+ nsmap = {'opf' : 'http://www.idpf.org/2007/opf'}
+ # Read file and resolve entities
+ doc = libxml2.readFile(content_file, None, 0)
+ opf = doc.getRootElement()
+ # Create xpath context
+ xpath_context = doc.xpathNewContext()
+ # Register namespaces
+ for key, val in nsmap.iteritems():
+ xpath_context.xpathRegisterNs(key, val)
+
+ if hasattr(opf, 'xpathEval') and xpath_context:
+ # Use the xpath context
+ xpath_context.setContextNode(opf)
+ items = xpath_context.xpathEval(".//opf:item")
+ else:
+ items = opf.findall(".//{'http://www.idpf.org/2007/opf'}item")
+
+ for item in items:
+ if hasattr(item, 'prop'):
+ hrefs.append(item.prop('href'))
+ else:
+ hrefs.append(item.attrib['href'])
+
+ doc.freeDoc()
+ xpath_context.xpathFreeContext()
+ elif has_lxml:
+ from lxml import etree
+
+ opf = etree.parse(content_file)
+ # All the opf:item elements are resources
+ for item in opf.xpath('//opf:item',
+ namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):
+ hrefs.append(item.attrib['href'])
+
+ for href in hrefs:
+ # If the resource was not already created by DocBook XSL itself,
+ # copy it into the OEBPS folder
+ referenced_file = os.path.join(source[0].get_abspath(), href)
+ if not os.path.exists(referenced_file):
+ shutil.copy(href, os.path.join(source[0].get_abspath(), href))
+
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_EPUB', ['epub','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ if not env.GetOption('clean'):
+ # Ensure that the folders OEBPS and META-INF exist
+ __create_output_dir('OEBPS/')
+ __create_output_dir('META-INF/')
+ dirs = env.Dir(['OEBPS', 'META-INF'])
+
+ # Set the fixed base_dir
+ kw['base_dir'] = 'OEBPS/'
+ tocncx = __builder.__call__(env, 'toc.ncx', source[0], **kw)
+ cxml = env.File('META-INF/container.xml')
+ env.SideEffect(cxml, tocncx)
+
+ env.Depends(tocncx, kw['DOCBOOK_XSL'])
+ result.extend(tocncx+[cxml])
+
+ container = env.Command(__ensure_suffix(str(target[0]), '.epub'),
+ tocncx+[cxml], [add_resources, build_open_container])
+ mimetype = env.File('mimetype')
+ env.SideEffect(mimetype, container)
+
+ result.extend(container)
+ # Add supporting files for cleanup
+ env.Clean(tocncx, dirs)
+
+ return result
+
+def DocbookHtml(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTML output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTML', ['html','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ r = __builder.__call__(env, __ensure_suffix(t,'.html'), s, **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+
+ return result
+
+def DocbookHtmlChunked(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for chunked HTML output.
+ """
+ # Init target/source
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED', ['html','chunkfast.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, glob.glob(os.path.join(base_dir, '*.html')))
+
+ return result
+
+
+def DocbookHtmlhelp(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTMLHELP output.
+ """
+ # Init target/source
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLHELP', ['htmlhelp','htmlhelp.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, ['toc.hhc', 'htmlhelp.hhp', 'index.hhk'] +
+ glob.glob(os.path.join(base_dir, '[ar|bk|ch]*.html')))
+
+ return result
+
+def DocbookPdf(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for PDF output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_PDF', ['fo','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ t, stem = __ensure_suffix_stem(t, '.pdf')
+ xsl = __builder.__call__(env, stem+'.fo', s, **kw)
+ result.extend(xsl)
+ env.Depends(xsl, kw['DOCBOOK_XSL'])
+ result.extend(__fop_builder.__call__(env, t, xsl, **kw))
+
+ return result
+
+def DocbookMan(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for Man page output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_MAN', ['manpages','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ volnum = "1"
+ outfiles = []
+ srcfile = __ensure_suffix(str(s),'.xml')
+ if os.path.isfile(srcfile):
+ try:
+ import xml.dom.minidom
+
+ dom = xml.dom.minidom.parse(__ensure_suffix(str(s),'.xml'))
+ # Extract volume number, default is 1
+ for node in dom.getElementsByTagName('refmeta'):
+ for vol in node.getElementsByTagName('manvolnum'):
+ volnum = __get_xml_text(vol)
+
+ # Extract output filenames
+ for node in dom.getElementsByTagName('refnamediv'):
+ for ref in node.getElementsByTagName('refname'):
+ outfiles.append(__get_xml_text(ref)+'.'+volnum)
+
+ except:
+ # Use simple regex parsing
+ f = open(__ensure_suffix(str(s),'.xml'), 'r')
+ content = f.read()
+ f.close()
+
+ for m in re_manvolnum.finditer(content):
+ volnum = m.group(1)
+
+ for m in re_refname.finditer(content):
+ outfiles.append(m.group(1)+'.'+volnum)
+
+ if not outfiles:
+ # Use stem of the source file
+ spath = str(s)
+ if not spath.endswith('.xml'):
+ outfiles.append(spath+'.'+volnum)
+ else:
+ stem, ext = os.path.splitext(spath)
+ outfiles.append(stem+'.'+volnum)
+ else:
+ # We have to completely rely on the given target name
+ outfiles.append(t)
+
+ __builder.__call__(env, outfiles[0], s, **kw)
+ env.Depends(outfiles[0], kw['DOCBOOK_XSL'])
+ result.append(outfiles[0])
+ if len(outfiles) > 1:
+ env.Clean(outfiles[0], outfiles[1:])
+
+
+ return result
+
+def DocbookSlidesPdf(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for PDF slides output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESPDF', ['slides','fo','plain.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ t, stem = __ensure_suffix_stem(t, '.pdf')
+ xsl = __builder.__call__(env, stem+'.fo', s, **kw)
+ env.Depends(xsl, kw['DOCBOOK_XSL'])
+ result.extend(xsl)
+ result.extend(__fop_builder.__call__(env, t, xsl, **kw))
+
+ return result
+
+def DocbookSlidesHtml(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTML slides output.
+ """
+ # Init list of targets/sources
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESHTML', ['slides','html','plain.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, [os.path.join(base_dir, 'toc.html')] +
+ glob.glob(os.path.join(base_dir, 'foil*.html')))
+
+ return result
+
+def DocbookXInclude(env, target, source, *args, **kw):
+ """
+ A pseudo-Builder, for resolving XIncludes in a separate processing step.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Setup builder
+ __builder = __select_builder(__xinclude_lxml_builder,__xinclude_libxml2_builder,__xmllint_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ result.extend(__builder.__call__(env, t, s, **kw))
+
+ return result
+
+def DocbookXslt(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, applying a simple XSL transformation to the input file.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ kw['DOCBOOK_XSL'] = kw.get('xsl', 'transform.xsl')
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ r = __builder.__call__(env, t, s, **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+
+ return result
+
+
+def generate(env):
+ """Add Builders and construction variables for docbook to an Environment."""
+
+ env.SetDefault(
+ # Default names for customized XSL stylesheets
+ DOCBOOK_DEFAULT_XSL_EPUB = '',
+ DOCBOOK_DEFAULT_XSL_HTML = '',
+ DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '',
+ DOCBOOK_DEFAULT_XSL_HTMLHELP = '',
+ DOCBOOK_DEFAULT_XSL_PDF = '',
+ DOCBOOK_DEFAULT_XSL_MAN = '',
+ DOCBOOK_DEFAULT_XSL_SLIDESPDF = '',
+ DOCBOOK_DEFAULT_XSL_SLIDESHTML = '',
+
+ # Paths to the detected executables
+ DOCBOOK_XSLTPROC = '',
+ DOCBOOK_XMLLINT = '',
+ DOCBOOK_FOP = '',
+
+ # Additional flags for the text processors
+ DOCBOOK_XSLTPROCFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_XMLLINTFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_FOPFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_XSLTPROCPARAMS = SCons.Util.CLVar(''),
+
+ # Default command lines for the detected executables
+ DOCBOOK_XSLTPROCCOM = xsltproc_com['xsltproc'],
+ DOCBOOK_XMLLINTCOM = xmllint_com['xmllint'],
+ DOCBOOK_FOPCOM = fop_com['fop'],
+
+ # Screen output for the text processors
+ DOCBOOK_XSLTPROCCOMSTR = None,
+ DOCBOOK_XMLLINTCOMSTR = None,
+ DOCBOOK_FOPCOMSTR = None,
+
+ )
+ _detect(env)
+
+ try:
+ env.AddMethod(DocbookEpub, "DocbookEpub")
+ env.AddMethod(DocbookHtml, "DocbookHtml")
+ env.AddMethod(DocbookHtmlChunked, "DocbookHtmlChunked")
+ env.AddMethod(DocbookHtmlhelp, "DocbookHtmlhelp")
+ env.AddMethod(DocbookPdf, "DocbookPdf")
+ env.AddMethod(DocbookMan, "DocbookMan")
+ env.AddMethod(DocbookSlidesPdf, "DocbookSlidesPdf")
+ env.AddMethod(DocbookSlidesHtml, "DocbookSlidesHtml")
+ env.AddMethod(DocbookXInclude, "DocbookXInclude")
+ env.AddMethod(DocbookXslt, "DocbookXslt")
+ except AttributeError:
+ # Looks like we use a pre-0.98 version of SCons...
+ from SCons.Script.SConscript import SConsEnvironment
+ SConsEnvironment.DocbookEpub = DocbookEpub
+ SConsEnvironment.DocbookHtml = DocbookHtml
+ SConsEnvironment.DocbookHtmlChunked = DocbookHtmlChunked
+ SConsEnvironment.DocbookHtmlhelp = DocbookHtmlhelp
+ SConsEnvironment.DocbookPdf = DocbookPdf
+ SConsEnvironment.DocbookMan = DocbookMan
+ SConsEnvironment.DocbookSlidesPdf = DocbookSlidesPdf
+ SConsEnvironment.DocbookSlidesHtml = DocbookSlidesHtml
+ SConsEnvironment.DocbookXInclude = DocbookXInclude
+ SConsEnvironment.DocbookXslt = DocbookXslt
+
+
+def exists(env):
+ return 1
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py
index 7eb9de4..aba7168 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py
@@ -5,7 +5,7 @@ Common DVI Builder definition for various other Tool modules that use it.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ Common DVI Builder definition for various other Tool modules that use it.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/dvi.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/dvi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Builder
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py
index 1b352b3..0a6dde7 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/dvipdf.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Defaults
@@ -115,6 +115,7 @@ def generate(env):
env['PDFCOM'] = ['$DVIPDFCOM']
def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
return env.Detect('dvipdf')
# Local Variables:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py
index d6e7006..f72f2fe 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/dvips.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/dvips.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
@@ -85,6 +85,7 @@ def generate(env):
env['PSSUFFIX'] = '.ps'
def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
return env.Detect('dvips')
# Local Variables:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py
new file mode 100644
index 0000000..77165ad
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py
@@ -0,0 +1,63 @@
+"""engine.SCons.Tool.f03
+
+Tool-specific initialization for the generic Posix f03 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/f03.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env
+
+compilers = ['f03']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f03_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f03'
+ env['F03'] = fcomp
+ env['SHF03'] = fcomp
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = fcomp
+
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py
index d4ec887..593c517 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f77.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/f77.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/f77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Scanner.Fortran
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f90.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py
index b8829b7..c4a8df3 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f90.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/f90.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/f90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Scanner.Fortran
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f95.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py
index 66be308..f361e1d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/f95.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/f95.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/f95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py
index 6bceb14..df57579 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/filesystem.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/filesystem.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons
from SCons.Tool.install import copyFunc
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py
index f7b4e8d..7a51321 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/fortran.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import re
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py
index fa93329..8246862 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/g++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/g++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
@@ -40,6 +40,8 @@ import subprocess
import SCons.Tool
import SCons.Util
+import gcc
+
cplusplus = __import__('c++', globals(), locals(), [])
compilers = ['g++']
@@ -48,9 +50,10 @@ def generate(env):
"""Add Builders and construction variables for g++ to an Environment."""
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
- cplusplus.generate(env)
+ if 'CXX' not in env:
+ env['CXX'] = env.Detect(compilers) or compilers[0]
- env['CXX'] = env.Detect(compilers)
+ cplusplus.generate(env)
# platform specific settings
if env['PLATFORM'] == 'aix':
@@ -62,26 +65,13 @@ def generate(env):
elif env['PLATFORM'] == 'sunos':
env['SHOBJSUFFIX'] = '.pic.o'
# determine compiler version
- if env['CXX']:
- #pipe = SCons.Action._subproc(env, [env['CXX'], '-dumpversion'],
- pipe = SCons.Action._subproc(env, [env['CXX'], '--version'],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = subprocess.PIPE)
- if pipe.wait() != 0: return
- # -dumpversion was added in GCC 3.0. As long as we're supporting
- # GCC versions older than that, we should use --version and a
- # regular expression.
- #line = pipe.stdout.read().strip()
- #if line:
- # env['CXXVERSION'] = line
- line = pipe.stdout.readline()
- match = re.search(r'[0-9]+(\.[0-9]+)+', line)
- if match:
- env['CXXVERSION'] = match.group(0)
+ version = gcc.detect_version(env, env['CXX'])
+ if version:
+ env['CXXVERSION'] = version
def exists(env):
- return env.Detect(compilers)
+ # is executable, and is a GNU compiler (or accepts '--version' at least)
+ return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py
index c21f34b..e09cf16 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/g77.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/g77.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/g77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gas.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py
index 0ec021a..f987b95 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gas.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/gas.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/gas.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
as_module = __import__('as', globals(), locals(), [])
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py
index 5d1a7d5..d2375c6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/gcc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/gcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import cc
import os
@@ -44,34 +44,54 @@ compilers = ['gcc', 'cc']
def generate(env):
"""Add Builders and construction variables for gcc to an Environment."""
+
+ if 'CC' not in env:
+ env['CC'] = env.Detect(compilers) or compilers[0]
+
cc.generate(env)
- env['CC'] = env.Detect(compilers) or 'gcc'
if env['PLATFORM'] in ['cygwin', 'win32']:
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
else:
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
# determine compiler version
- if env['CC']:
- #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'],
- pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = subprocess.PIPE)
- if pipe.wait() != 0: return
- # -dumpversion was added in GCC 3.0. As long as we're supporting
- # GCC versions older than that, we should use --version and a
- # regular expression.
- #line = pipe.stdout.read().strip()
- #if line:
- # env['CCVERSION'] = line
- line = pipe.stdout.readline()
- match = re.search(r'[0-9]+(\.[0-9]+)+', line)
- if match:
- env['CCVERSION'] = match.group(0)
+ version = detect_version(env, env['CC'])
+ if version:
+ env['CCVERSION'] = version
def exists(env):
- return env.Detect(compilers)
+ # is executable, and is a GNU compiler (or accepts '--version' at least)
+ return detect_version(env, env.Detect(env.get('CC', compilers)))
+
+def detect_version(env, cc):
+ """Return the version of the GNU compiler, or None if it is not a GNU compiler."""
+ cc = env.subst(cc)
+ if not cc:
+ return None
+ version = None
+ #pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['-dumpversion'],
+ pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['--version'],
+ stdin = 'devnull',
+ stderr = 'devnull',
+ stdout = subprocess.PIPE)
+ # -dumpversion was added in GCC 3.0. As long as we're supporting
+ # GCC versions older than that, we should use --version and a
+ # regular expression.
+ #line = pipe.stdout.read().strip()
+ #if line:
+ # version = line
+ line = pipe.stdout.readline()
+ match = re.search(r'[0-9]+(\.[0-9]+)+', line)
+ if match:
+ version = match.group(0)
+ # Non-GNU compiler's output (like AIX xlc's) may exceed the stdout buffer:
+ # So continue with reading to let the child process actually terminate.
+ while pipe.stdout.readline():
+ pass
+ ret = pipe.wait()
+ if ret != 0:
+ return None
+ return version
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py
new file mode 100644
index 0000000..7a67501
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py
@@ -0,0 +1,128 @@
+"""SCons.Tool.gdc
+
+Tool-specific initialization for the GDC compiler.
+(https://github.com/D-Programming-GDC/GDC)
+
+Developed by Russel Winder (russel@winder.org.uk)
+2012-05-09 onwards
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to gdc.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to gdc.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/gdc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Tool
+
+import SCons.Tool.DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect('gdc')
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -o $TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -fPIC -c -o $TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I'
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -o $TARGET $DLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+ env['DSHLINK'] = '$DC'
+ env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared')
+ env['SHDLINKCOM'] = '$DLINK -o $TARGET $DSHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+ env['DLINKFLAGPREFIX'] = '-'
+ env['DLINKFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['RPATHPREFIX'] = '-Wl,-rpath='
+ env['RPATHSUFFIX'] = ''
+ env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+ SCons.Tool.createStaticLibBuilder(env)
+
+
+def exists(env):
+ return env.Detect('gdc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py
new file mode 100644
index 0000000..e53ebdb
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py
@@ -0,0 +1,48 @@
+"""gettext tool
+"""
+
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/gettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+#############################################################################
+def generate(env,**kw):
+ import SCons.Tool
+ from SCons.Tool.GettextCommon \
+ import _translate, tool_list
+ for t in tool_list(env['PLATFORM'], env):
+ env.Tool(t)
+ env.AddMethod(_translate, 'Translate')
+#############################################################################
+
+#############################################################################
+def exists(env):
+ from SCons.Tool.GettextCommon \
+ import _xgettext_exists, _msginit_exists, \
+ _msgmerge_exists, _msgfmt_exists
+ try:
+ return _xgettext_exists(env) and _msginit_exists(env) \
+ and _msgmerge_exists(env) and _msgfmt_exists(env)
+ except:
+ return False
+#############################################################################
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py
index 2a3872e..02da302 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/gfortran.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/gfortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
@@ -43,7 +43,7 @@ def generate(env):
Environment."""
fortran.generate(env)
- for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
+ for dialect in ['F77', 'F90', 'FORTRAN', 'F95', 'F03', 'F08']:
env['%s' % dialect] = 'gfortran'
env['SH%s' % dialect] = '$%s' % dialect
if env['PLATFORM'] in ['cygwin', 'win32']:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py
index 9845a69..81c0130 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,14 +31,12 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/gnulink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/gnulink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
import link
-linkers = ['g++', 'gcc']
-
def generate(env):
"""Add Builders and construction variables for gnulink to an Environment."""
link.generate(env)
@@ -48,13 +46,19 @@ def generate(env):
# __RPATH is set to $_RPATH in the platform specification if that
# platform supports it.
- env.Append(LINKFLAGS=['$__RPATH'])
env['RPATHPREFIX'] = '-Wl,-rpath='
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
def exists(env):
- return env.Detect(linkers)
+ # TODO: sync with link.smart_link() to choose a linker
+ linkers = { 'CXX': ['g++'], 'CC': ['gcc'] }
+ alltools = []
+ for langvar, linktools in linkers.items():
+ if langvar in env: # use CC over CXX when user specified CC but not CXX
+ return SCons.Tool.FindTool(linktools, env)
+ alltools.extend(linktools)
+ return SCons.Tool.FindTool(alltools, env) # find CXX or CC
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py
index 8ab63d7..3e2eecc 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/gs.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,9 +31,10 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/gs.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/gs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
+import SCons.Builder
import SCons.Platform
import SCons.Util
@@ -52,17 +53,26 @@ GhostscriptAction = None
def generate(env):
"""Add Builders and construction variables for Ghostscript to an
Environment."""
-
global GhostscriptAction
- if GhostscriptAction is None:
- GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['PDF']
- bld.add_action('.ps', GhostscriptAction)
-
+ # The following try-except block enables us to use the Tool
+ # in standalone mode (without the accompanying pdf.py),
+ # whenever we need an explicit call of gs via the Gs()
+ # Builder ...
+ try:
+ if GhostscriptAction is None:
+ GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
+
+ import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['PDF']
+ bld.add_action('.ps', GhostscriptAction)
+ except ImportError, e:
+ pass
+
+ gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'))
+ env['BUILDERS']['Gs'] = gsbuilder
+
env['GS'] = gs
env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite')
env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py
index 5be3854..eb23e94 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/hpc++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/hpc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py
index 24b48c7..827460d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/hpcc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/hpcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py
index b2ad1ca..e3512a2 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/hplink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/hplink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py
index fd5affe..d6e3663 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/icc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/icc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import cc
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py
index f1da778..88c6881 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/icl.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/icl.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/icl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool.intelc
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py
index 17ceb34..ef5bdd6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ifl.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ifl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
from SCons.Scanner.Fortran import FortranScan
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py
index 06bf484..275c5c8 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ifort.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ifort.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
from SCons.Scanner.Fortran import FortranScan
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py
index 71025d1..b2c3513 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ilink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py
index fb570f8..a2f1e67 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py
@@ -5,7 +5,7 @@ XXX
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ XXX
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ilink32.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ilink32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool
import SCons.Tool.bcc32
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py
new file mode 100644
index 0000000..0b3642c
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py
@@ -0,0 +1,501 @@
+"""SCons.Tool.install
+
+Tool-specific initialization for the install tool.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/install.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import os
+import re
+import shutil
+import stat
+
+import SCons.Action
+from SCons.Util import make_path_relative
+
+#
+# We keep track of *all* installed files.
+_INSTALLED_FILES = []
+_UNIQUE_INSTALLED_FILES = None
+
+class CopytreeError(EnvironmentError):
+ pass
+
+# This is a patched version of shutil.copytree from python 2.5. It
+# doesn't fail if the dir exists, which regular copytree does
+# (annoyingly). Note the XXX comment in the docstring.
+def scons_copytree(src, dst, symlinks=False):
+ """Recursively copy a directory tree using copy2().
+
+ The destination directory must not already exist.
+ If exception(s) occur, an CopytreeError is raised with a list of reasons.
+
+ If the optional symlinks flag is true, symbolic links in the
+ source tree result in symbolic links in the destination tree; if
+ it is false, the contents of the files pointed to by symbolic
+ links are copied.
+
+ XXX Consider this example code rather than the ultimate tool.
+
+ """
+ names = os.listdir(src)
+ # garyo@genarts.com fix: check for dir before making dirs.
+ if not os.path.exists(dst):
+ os.makedirs(dst)
+ errors = []
+ for name in names:
+ srcname = os.path.join(src, name)
+ dstname = os.path.join(dst, name)
+ try:
+ if symlinks and os.path.islink(srcname):
+ linkto = os.readlink(srcname)
+ os.symlink(linkto, dstname)
+ elif os.path.isdir(srcname):
+ scons_copytree(srcname, dstname, symlinks)
+ else:
+ shutil.copy2(srcname, dstname)
+ # XXX What about devices, sockets etc.?
+ except (IOError, os.error), why:
+ errors.append((srcname, dstname, str(why)))
+ # catch the CopytreeError from the recursive copytree so that we can
+ # continue with other files
+ except CopytreeError, err:
+ errors.extend(err.args[0])
+ try:
+ shutil.copystat(src, dst)
+ except WindowsError:
+ # can't copy file access times on Windows
+ pass
+ except OSError, why:
+ errors.extend((src, dst, str(why)))
+ if errors:
+ raise CopytreeError, errors
+
+
+#
+# Functions doing the actual work of the Install Builder.
+#
+def copyFunc(dest, source, env):
+ """Install a source file or directory into a destination by copying,
+ (including copying permission/mode bits)."""
+
+ if os.path.isdir(source):
+ if os.path.exists(dest):
+ if not os.path.isdir(dest):
+ raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
+ else:
+ parent = os.path.split(dest)[0]
+ if not os.path.exists(parent):
+ os.makedirs(parent)
+ scons_copytree(source, dest)
+ else:
+ shutil.copy2(source, dest)
+ st = os.stat(source)
+ os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+ return 0
+
+#
+# Functions doing the actual work of the InstallVersionedLib Builder.
+#
+def copyFuncVersionedLib(dest, source, env):
+ """Install a versioned library into a destination by copying,
+ (including copying permission/mode bits) and then creating
+ required symlinks."""
+
+ if os.path.isdir(source):
+ raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) )
+ else:
+ # remove the link if it is already there
+ try:
+ os.remove(dest)
+ except:
+ pass
+ shutil.copy2(source, dest)
+ st = os.stat(source)
+ os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+ versionedLibLinks(dest, source, env)
+
+ return 0
+
+def versionedLibVersion(dest, source, env):
+ """Check if dest is a version shared library name. Return version, libname, & install_dir if it is."""
+ Verbose = False
+ platform = env.subst('$PLATFORM')
+ if not (platform == 'posix' or platform == 'darwin' or platform == 'sunos'):
+ return (None, None, None)
+
+ if (hasattr(source[0], 'attributes') and
+ hasattr(source[0].attributes, 'shlibname')):
+ libname = source[0].attributes.shlibname
+ else:
+ libname = os.path.basename(str(dest))
+ install_dir = os.path.dirname(str(dest))
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ # See if the source name is a versioned shared library, get the version number
+ result = False
+
+ version_re = re.compile("[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
+ version_File = None
+ if platform == 'posix' or platform == 'sunos':
+ # handle unix names
+ versioned_re = re.compile(re.escape(shlib_suffix + '.') + "[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
+ result = versioned_re.findall(libname)
+ if result:
+ version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
+ elif platform == 'darwin':
+ # handle OSX names
+ versioned_re = re.compile("\\.[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+" + re.escape(shlib_suffix) )
+ result = versioned_re.findall(libname)
+ if result:
+ version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
+
+ if Verbose:
+ print "install: version_File ", version_File
+ # result is False if we did not find a versioned shared library name, so return and empty list
+ if not result:
+ return (None, libname, install_dir)
+
+ version = None
+ # get version number from the environment
+ try:
+ version = env.subst('$SHLIBVERSION')
+ except KeyError:
+ version = None
+
+ if version != version_File:
+ #raise SCons.Errors.UserError("SHLIBVERSION '%s' does not match the version # '%s' in the filename" % (version, version_File) )
+ print "SHLIBVERSION '%s' does not match the version # '%s' in the filename, proceeding based on file name" % (version, version_File)
+ version = version_File
+ return (version, libname, install_dir)
+
+def versionedLibLinks(dest, source, env):
+ """If we are installing a versioned shared library create the required links."""
+ Verbose = False
+ linknames = []
+ version, libname, install_dir = versionedLibVersion(dest, source, env)
+
+ if version != None:
+ # libname includes the version number if one was given
+ linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
+ if Verbose:
+ print "versionedLibLinks: linknames ",linknames
+ # Here we just need the file name w/o path as the target of the link
+ lib_ver = libname
+ # make symlink of adjacent names in linknames
+ for count in range(len(linknames)):
+ linkname = linknames[count]
+ fulllinkname = os.path.join(install_dir, linkname)
+ if Verbose:
+ print "full link name ",fulllinkname
+ if count > 0:
+ try:
+ os.remove(lastlinkname)
+ except:
+ pass
+ os.symlink(os.path.basename(fulllinkname),lastlinkname)
+ if Verbose:
+ print "versionedLibLinks: made sym link of %s -> %s" % (lastlinkname,os.path.basename(fulllinkname))
+ lastlinkname = fulllinkname
+ # finish chain of sym links with link to the actual library
+ if len(linknames)>0:
+ try:
+ os.remove(lastlinkname)
+ except:
+ pass
+ os.symlink(lib_ver,lastlinkname)
+ if Verbose:
+ print "versionedLibLinks: made sym link of %s -> %s" % (lib_ver,lastlinkname)
+ return
+
+def installFunc(target, source, env):
+ """Install a source file into a target using the function specified
+ as the INSTALL construction variable."""
+ try:
+ install = env['INSTALL']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing INSTALL construction variable.')
+
+ assert len(target)==len(source), \
+ "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
+ for t,s in zip(target,source):
+ if install(t.get_path(),s.get_path(),env):
+ return 1
+
+ return 0
+
+def installFuncVersionedLib(target, source, env):
+ """Install a versioned library into a target using the function specified
+ as the INSTALLVERSIONEDLIB construction variable."""
+ try:
+ install = env['INSTALLVERSIONEDLIB']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing INSTALLVERSIONEDLIB construction variable.')
+
+ assert len(target)==len(source), \
+ "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
+ for t,s in zip(target,source):
+ if hasattr(t.attributes, 'shlibname'):
+ tpath = os.path.join(t.get_dir(), t.attributes.shlibname)
+ else:
+ tpath = t.get_path()
+ if install(tpath,s.get_path(),env):
+ return 1
+
+ return 0
+
+def stringFunc(target, source, env):
+ installstr = env.get('INSTALLSTR')
+ if installstr:
+ return env.subst_target_source(installstr, 0, target, source)
+ target = str(target[0])
+ source = str(source[0])
+ if os.path.isdir(source):
+ type = 'directory'
+ else:
+ type = 'file'
+ return 'Install %s: "%s" as "%s"' % (type, source, target)
+
+#
+# Emitter functions
+#
+def add_targets_to_INSTALLED_FILES(target, source, env):
+ """ an emitter that adds all target files to the list stored in the
+ _INSTALLED_FILES global variable. This way all installed files of one
+ scons call will be collected.
+ """
+ global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
+ _INSTALLED_FILES.extend(target)
+
+ _UNIQUE_INSTALLED_FILES = None
+ return (target, source)
+
+def add_versioned_targets_to_INSTALLED_FILES(target, source, env):
+ """ an emitter that adds all target files to the list stored in the
+ _INSTALLED_FILES global variable. This way all installed files of one
+ scons call will be collected.
+ """
+ global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
+ Verbose = False
+ _INSTALLED_FILES.extend(target)
+ if Verbose:
+ print "ver lib emitter ",repr(target)
+
+ # see if we have a versioned shared library, if so generate side effects
+ version, libname, install_dir = versionedLibVersion(target[0], source, env)
+ if version != None:
+ # generate list of link names
+ linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
+ for linkname in linknames:
+ if Verbose:
+ print "make side effect of %s" % os.path.join(install_dir, linkname)
+ fulllinkname = os.path.join(install_dir, linkname)
+ env.SideEffect(fulllinkname,target[0])
+ env.Clean(target[0],fulllinkname)
+ _INSTALLED_FILES.append(fulllinkname)
+ if Verbose:
+ print "installed list ", _INSTALLED_FILES
+
+ _UNIQUE_INSTALLED_FILES = None
+ return (target, source)
+
+class DESTDIR_factory(object):
+ """ a node factory, where all files will be relative to the dir supplied
+ in the constructor.
+ """
+ def __init__(self, env, dir):
+ self.env = env
+ self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
+
+ def Entry(self, name):
+ name = make_path_relative(name)
+ return self.dir.Entry(name)
+
+ def Dir(self, name):
+ name = make_path_relative(name)
+ return self.dir.Dir(name)
+
+#
+# The Builder Definition
+#
+install_action = SCons.Action.Action(installFunc, stringFunc)
+installas_action = SCons.Action.Action(installFunc, stringFunc)
+installVerLib_action = SCons.Action.Action(installFuncVersionedLib, stringFunc)
+
+BaseInstallBuilder = None
+
+def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
+ if target and dir:
+ import SCons.Errors
+ raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
+ if not dir:
+ dir=target
+
+ import SCons.Script
+ install_sandbox = SCons.Script.GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ try:
+ dnodes = env.arg2nodes(dir, target_factory.Dir)
+ except TypeError:
+ raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
+ sources = env.arg2nodes(source, env.fs.Entry)
+ tgt = []
+ for dnode in dnodes:
+ for src in sources:
+ # Prepend './' so the lookup doesn't interpret an initial
+ # '#' on the file name portion as meaning the Node should
+ # be relative to the top-level SConstruct directory.
+ target = env.fs.Entry('.'+os.sep+src.name, dnode)
+ #tgt.extend(BaseInstallBuilder(env, target, src, **kw))
+ tgt.extend(BaseInstallBuilder(env, target, src, **kw))
+ return tgt
+
+def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
+ result = []
+ for src, tgt in map(lambda x, y: (x, y), source, target):
+ #result.extend(BaseInstallBuilder(env, tgt, src, **kw))
+ result.extend(BaseInstallBuilder(env, tgt, src, **kw))
+ return result
+
+BaseVersionedInstallBuilder = None
+
+def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw):
+ if target and dir:
+ import SCons.Errors
+ raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
+ if not dir:
+ dir=target
+
+ import SCons.Script
+ install_sandbox = SCons.Script.GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ try:
+ dnodes = env.arg2nodes(dir, target_factory.Dir)
+ except TypeError:
+ raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
+ sources = env.arg2nodes(source, env.fs.Entry)
+ tgt = []
+ for dnode in dnodes:
+ for src in sources:
+ # Prepend './' so the lookup doesn't interpret an initial
+ # '#' on the file name portion as meaning the Node should
+ # be relative to the top-level SConstruct directory.
+ target = env.fs.Entry('.'+os.sep+src.name, dnode)
+ tgt.extend(BaseVersionedInstallBuilder(env, target, src, **kw))
+ return tgt
+
+added = None
+
+def generate(env):
+
+ from SCons.Script import AddOption, GetOption
+ global added
+ if not added:
+ added = 1
+ AddOption('--install-sandbox',
+ dest='install_sandbox',
+ type="string",
+ action="store",
+ help='A directory under which all installed files will be placed.')
+
+ global BaseInstallBuilder
+ if BaseInstallBuilder is None:
+ install_sandbox = GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ BaseInstallBuilder = SCons.Builder.Builder(
+ action = install_action,
+ target_factory = target_factory.Entry,
+ source_factory = env.fs.Entry,
+ multi = 1,
+ emitter = [ add_targets_to_INSTALLED_FILES, ],
+ name = 'InstallBuilder')
+
+ global BaseVersionedInstallBuilder
+ if BaseVersionedInstallBuilder is None:
+ install_sandbox = GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ BaseVersionedInstallBuilder = SCons.Builder.Builder(
+ action = installVerLib_action,
+ target_factory = target_factory.Entry,
+ source_factory = env.fs.Entry,
+ multi = 1,
+ emitter = [ add_versioned_targets_to_INSTALLED_FILES, ],
+ name = 'InstallVersionedBuilder')
+
+ env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
+ env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
+ env['BUILDERS']['_InternalInstallVersionedLib'] = InstallVersionedBuilderWrapper
+
+ # We'd like to initialize this doing something like the following,
+ # but there isn't yet support for a ${SOURCE.type} expansion that
+ # will print "file" or "directory" depending on what's being
+ # installed. For now we punt by not initializing it, and letting
+ # the stringFunc() that we put in the action fall back to the
+ # hand-crafted default string if it's not set.
+ #
+ #try:
+ # env['INSTALLSTR']
+ #except KeyError:
+ # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
+
+ try:
+ env['INSTALL']
+ except KeyError:
+ env['INSTALL'] = copyFunc
+
+ try:
+ env['INSTALLVERSIONEDLIB']
+ except KeyError:
+ env['INSTALLVERSIONEDLIB'] = copyFuncVersionedLib
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py
index 10e92cd..256f32e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from __future__ import division
-__revision__ = "src/engine/SCons/Tool/intelc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/intelc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import math, sys, os.path, glob, string, re
@@ -40,7 +40,7 @@ is_windows = sys.platform == 'win32'
is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or
('PROCESSOR_ARCHITEW6432' in os.environ and
os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64'))
-is_linux = sys.platform == 'linux2'
+is_linux = sys.platform.startswith('linux')
is_mac = sys.platform == 'darwin'
if is_windows:
@@ -78,6 +78,7 @@ def linux_ver_normalize(vstr):
Always returns an old-style float like 80 or 90 for compatibility with Windows.
Shades of Y2K!"""
# Check for version number like 9.1.026: return 91.026
+ # XXX needs to be updated for 2011+ versions (like 2011.11.344 which is compiler v12.1.5)
m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr)
if m:
vmaj,vmin,build = m.groups()
@@ -155,7 +156,43 @@ def get_intel_registry_value(valuename, version=None, abi=None):
try:
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
except SCons.Util.RegError:
- raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+ # For version 13 and later, check UUID subkeys for valuename
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+ uuid = SCons.Util.RegQueryValueEx(k, 'SubKey')[0]
+
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+
+ try:
+ v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+ return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
+ except SCons.Util.RegError:
+ if abi.upper() == 'EM64T':
+ abi = 'em64t_native'
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+
+ try:
+ v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+ return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
+ except SCons.Util.RegError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+
+ except SCons.Util.RegError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+ except WindowsError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
# Get the value:
try:
@@ -179,7 +216,16 @@ def get_all_compiler_versions():
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
keyname)
except WindowsError:
- return []
+ # For version 13 or later, check for default instance UUID
+ if is_win64:
+ keyname = 'Software\\WoW6432Node\\Intel\\Suites'
+ else:
+ keyname = 'Software\\Intel\\Suites'
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+ keyname)
+ except WindowsError:
+ return []
i = 0
versions = []
try:
@@ -191,6 +237,9 @@ def get_all_compiler_versions():
# and then the install directory deleted or moved (rather
# than uninstalling properly), so the registry values
# are still there.
+ if subkey == 'Defaults': # Ignore default instances
+ i = i + 1
+ continue
ok = False
for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'):
try:
@@ -221,7 +270,7 @@ def get_all_compiler_versions():
except EnvironmentError:
# no more subkeys
pass
- elif is_linux:
+ elif is_linux or is_mac:
for d in glob.glob('/opt/intel_cc_*'):
# Typical dir here is /opt/intel_cc_80.
m = re.search(r'cc_(.*)$', d)
@@ -230,17 +279,30 @@ def get_all_compiler_versions():
for d in glob.glob('/opt/intel/cc*/*'):
# Typical dir here is /opt/intel/cc/9.0 for IA32,
# /opt/intel/cce/9.0 for EMT64 (AMD64)
- m = re.search(r'([0-9.]+)$', d)
+ m = re.search(r'([0-9][0-9.]*)$', d)
if m:
versions.append(m.group(1))
- elif is_mac:
- for d in glob.glob('/opt/intel/cc*/*'):
- # Typical dir here is /opt/intel/cc/9.0 for IA32,
- # /opt/intel/cce/9.0 for EMT64 (AMD64)
- m = re.search(r'([0-9.]+)$', d)
+ for d in glob.glob('/opt/intel/Compiler/*'):
+ # Typical dir here is /opt/intel/Compiler/11.1
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m:
+ versions.append(m.group(1))
+ for d in glob.glob('/opt/intel/composerxe-*'):
+ # Typical dir here is /opt/intel/composerxe-2011.4.184
+ m = re.search(r'([0-9][0-9.]*)$', d)
if m:
versions.append(m.group(1))
- return sorted(uniquify(versions)) # remove dups
+ for d in glob.glob('/opt/intel/composer_xe_*'):
+ # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
+ # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
+ m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
+ if m:
+ versions.append("%s.%s"%(m.group(1), m.group(2)))
+ def keyfunc(str):
+ """Given a dot-separated version string, return a tuple of ints representing it."""
+ return [int(x) for x in str.split('.')]
+ # split into ints, sort, then remove dups
+ return sorted(uniquify(versions), key=keyfunc, reverse=True)
def get_intel_compiler_top(version, abi):
"""
@@ -254,20 +316,71 @@ def get_intel_compiler_top(version, abi):
if not SCons.Util.can_read_reg:
raise NoRegistryModuleError("No Windows registry module was found")
top = get_intel_registry_value('ProductDir', version, abi)
+ archdir={'x86_64': 'intel64',
+ 'amd64' : 'intel64',
+ 'em64t' : 'intel64',
+ 'x86' : 'ia32',
+ 'i386' : 'ia32',
+ 'ia32' : 'ia32'
+ }[abi] # for v11 and greater
# pre-11, icl was in Bin. 11 and later, it's in Bin/<abi> apparently.
if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \
- and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")):
+ and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")) \
+ and not os.path.exists(os.path.join(top, "Bin", archdir, "icl.exe")):
raise MissingDirError("Can't find Intel compiler in %s"%(top))
elif is_mac or is_linux:
- # first dir is new (>=9.0) style, second is old (8.0) style.
- dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
- if abi == 'x86_64':
- dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64
- top=None
- for d in dirs:
- if os.path.exists(os.path.join(d%version, "bin", "icc")):
- top = d%version
- break
+ def find_in_2008style_dir(version):
+ # first dir is new (>=9.0) style, second is old (8.0) style.
+ dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
+ if abi == 'x86_64':
+ dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64
+ top=None
+ for d in dirs:
+ if os.path.exists(os.path.join(d%version, "bin", "icc")):
+ top = d%version
+ break
+ return top
+ def find_in_2010style_dir(version):
+ dirs=('/opt/intel/Compiler/%s/*'%version)
+ # typically /opt/intel/Compiler/11.1/064 (then bin/intel64/icc)
+ dirs=glob.glob(dirs)
+ # find highest sub-version number by reverse sorting and picking first existing one.
+ dirs.sort()
+ dirs.reverse()
+ top=None
+ for d in dirs:
+ if (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ return top
+ def find_in_2011style_dir(version):
+ # The 2011 (compiler v12) dirs are inconsistent, so just redo the search from
+ # get_all_compiler_versions and look for a match (search the newest form first)
+ top=None
+ for d in glob.glob('/opt/intel/composer_xe_*'):
+ # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
+ # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
+ m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
+ if m:
+ cur_ver = "%s.%s"%(m.group(1), m.group(2))
+ if cur_ver == version and \
+ (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ if not top:
+ for d in glob.glob('/opt/intel/composerxe-*'):
+ # Typical dir here is /opt/intel/composerxe-2011.4.184
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m and m.group(1) == version and \
+ (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ return top
+ top = find_in_2011style_dir(version) or find_in_2010style_dir(version) or find_in_2008style_dir(version)
+ # print "INTELC: top=",top
if not top:
raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
return top
@@ -353,29 +466,42 @@ def generate(env, version=None, abi=None, topdir=None, verbose=0):
(str(version), str(abi)))
if topdir:
+ archdir={'x86_64': 'intel64',
+ 'amd64' : 'intel64',
+ 'em64t' : 'intel64',
+ 'x86' : 'ia32',
+ 'i386' : 'ia32',
+ 'ia32' : 'ia32'
+ }[abi] # for v11 and greater
+ if os.path.exists(os.path.join(topdir, 'bin', archdir)):
+ bindir="bin/%s"%archdir
+ libdir="lib/%s"%archdir
+ else:
+ bindir="bin"
+ libdir="lib"
if verbose:
- print "Intel C compiler: using version %s (%g), abi %s, in '%s'"%\
- (repr(version), linux_ver_normalize(version),abi,topdir)
+ print "Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
+ (repr(version), linux_ver_normalize(version),abi,topdir,bindir)
if is_linux:
# Show the actual compiler version by running the compiler.
- os.system('%s/bin/icc --version'%topdir)
+ os.system('%s/%s/icc --version'%(topdir,bindir))
if is_mac:
# Show the actual compiler version by running the compiler.
- os.system('%s/bin/icc --version'%topdir)
+ os.system('%s/%s/icc --version'%(topdir,bindir))
env['INTEL_C_COMPILER_TOP'] = topdir
if is_linux:
paths={'INCLUDE' : 'include',
- 'LIB' : 'lib',
- 'PATH' : 'bin',
- 'LD_LIBRARY_PATH' : 'lib'}
+ 'LIB' : libdir,
+ 'PATH' : bindir,
+ 'LD_LIBRARY_PATH' : libdir}
for p in paths.keys():
env.PrependENVPath(p, os.path.join(topdir, paths[p]))
if is_mac:
paths={'INCLUDE' : 'include',
- 'LIB' : 'lib',
- 'PATH' : 'bin',
- 'LD_LIBRARY_PATH' : 'lib'}
+ 'LIB' : libdir,
+ 'PATH' : bindir,
+ 'LD_LIBRARY_PATH' : libdir}
for p in paths.keys():
env.PrependENVPath(p, os.path.join(topdir, paths[p]))
if is_windows:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py
index c692053..bf2b496 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py
@@ -11,7 +11,7 @@ packages fake_root.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -33,7 +33,7 @@ packages fake_root.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/ipkg.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/ipkg.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/jar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py
index 9cb4eff..50d3fc0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/jar.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/jar.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/jar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Subst
import SCons.Util
@@ -97,11 +97,17 @@ def generate(env):
env['_JARMANIFEST'] = jarManifest
env['_JARSOURCES'] = jarSources
env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES'
- env['JARCOM'] = "${TEMPFILE('$_JARCOM')}"
+ env['JARCOM'] = "${TEMPFILE('$_JARCOM','$JARCOMSTR')}"
env['JARSUFFIX'] = '.jar'
def exists(env):
- return env.Detect('jar')
+ # As reported by Jan Nijtmans in issue #2730, the simple
+ # return env.Detect('jar')
+ # doesn't always work during initialization. For now, we
+ # stop trying to detect an executable (analogous to the
+ # javac Builder).
+ # TODO: Come up with a proper detect() routine...and enable it.
+ return 1
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javac.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py
index 66651c3..bb57208 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javac.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/javac.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/javac.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
@@ -150,13 +150,15 @@ class pathopt(object):
if path and not SCons.Util.is_List(path):
path = [path]
if self.default:
- path = path + [ env[self.default] ]
+ default = env[self.default]
+ if default:
+ if not SCons.Util.is_List(default):
+ default = [default]
+ path = path + default
if path:
- return [self.opt, os.pathsep.join(path)]
- #return self.opt + " " + os.pathsep.join(path)
+ return [self.opt, os.pathsep.join(map(str, path))]
else:
return []
- #return ""
def Java(env, target, source, *args, **kw):
"""
@@ -216,7 +218,7 @@ def generate(env):
env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} '
env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}'
env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES'
- env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM')}"
+ env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}"
env['JAVACLASSSUFFIX'] = '.class'
env['JAVASUFFIX'] = '.java'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javah.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py
index e92c423..1d667b9 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/javah.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/javah.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/javah.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/latex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py
index e4f1a51..69413cc 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/latex.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/latex.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/latex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Defaults
@@ -70,6 +70,7 @@ def generate(env):
SCons.Tool.tex.generate_common(env)
def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
return env.Detect('latex')
# Local Variables:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py
new file mode 100644
index 0000000..c1b558f
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py
@@ -0,0 +1,144 @@
+"""SCons.Tool.ldc
+
+Tool-specific initialization for the LDC compiler.
+(http://www.dsource.org/projects/ldc)
+
+Developed by Russel Winder (russel@winder.org.uk)
+2012-05-09 onwards
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to ldc2.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to ldc2.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/ldc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import os
+import subprocess
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.D
+import SCons.Tool
+
+import SCons.Tool.DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect('ldc2')
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of=$TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -relocation-model=pic -of=$TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I='
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['DSHLINK'] = '$DC'
+ env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc')
+ # Hack for Fedora the packages of which use the wrong name :-(
+ if os.path.exists('/usr/lib64/libphobos-ldc.so') or os.path.exists('/usr/lib32/libphobos-ldc.so') or os.path.exists('/usr/lib/libphobos-ldc.so') :
+ env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos-ldc')
+ env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
+ env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
+ #env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+
+ env['DLIBDIRPREFIX'] = '-L-L'
+ env['DLIBDIRSUFFIX'] = ''
+ env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['DRPATHPREFIX'] = '-L-rpath='
+ env['DRPATHSUFFIX'] = ''
+ env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+
+ SCons.Tool.createStaticLibBuilder(env)
+
+
+def exists(env):
+ return env.Detect('ldc2')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/lex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py
index aad5004..9f6557d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/lex.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/lex.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/lex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py
new file mode 100644
index 0000000..6874301
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py
@@ -0,0 +1,218 @@
+"""SCons.Tool.link
+
+Tool-specific initialization for the generic Posix linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "src/engine/SCons/Tool/link.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import re
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Tool.FortranCommon import isfortran
+
+from SCons.Tool.DCommon import isD
+
+cplusplus = __import__('c++', globals(), locals(), [])
+
+issued_mixed_link_warning = False
+
+def smart_link(source, target, env, for_signature):
+ has_cplusplus = cplusplus.iscplusplus(source)
+ has_fortran = isfortran(env, source)
+ has_d = isD(env, source)
+ if has_cplusplus and has_fortran and not has_d:
+ global issued_mixed_link_warning
+ if not issued_mixed_link_warning:
+ msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
+ "This may generate a buggy executable if the '%s'\n\t" + \
+ "compiler does not know how to deal with Fortran runtimes."
+ SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
+ msg % env.subst('$CXX'))
+ issued_mixed_link_warning = True
+ return '$CXX'
+ elif has_d:
+ env['LINKCOM'] = env['DLINKCOM']
+ env['SHLINKCOM'] = env['SHDLINKCOM']
+ return '$DC'
+ elif has_fortran:
+ return '$FORTRAN'
+ elif has_cplusplus:
+ return '$CXX'
+ return '$CC'
+
+def shlib_emitter(target, source, env):
+ Verbose = False
+ platform = env.subst('$PLATFORM')
+ for tgt in target:
+ tgt.attributes.shared = 1
+ try:
+ # target[0] comes in as libtest.so. Add the version extensions
+ version = env.subst('$SHLIBVERSION')
+ if version:
+ version_names = shlib_emitter_names(target, source, env)
+ # mark the target with the shared libraries name, including
+ # the version number
+ target[0].attributes.shlibname = version_names[0]
+ shlib = env.File(version_names[0], directory=target[0].get_dir())
+ target[0].attributes.shlibpath = shlib.get_internal_path()
+ for name in version_names[1:]:
+ env.SideEffect(name, shlib)
+ env.Clean(shlib, name)
+ if Verbose:
+ print "shlib_emitter: add side effect - ",name
+ env.Clean(shlib, target[0])
+ return ([shlib], source)
+ except KeyError:
+ version = None
+ return (target, source)
+
+def shlib_emitter_names(target, source, env):
+ """Return list of file names that are side effects for a versioned library build. The first name in the list is the new name for the target"""
+ Verbose = False
+ platform = env.subst('$PLATFORM')
+ version_names = []
+ try:
+ # target[0] comes in as libtest.so. Add the version extensions
+ version = env.subst('$SHLIBVERSION')
+ if version.count(".") != 2:
+ # We need a version of the form x.y.z to proceed
+ raise ValueError
+ if version:
+ if platform == 'posix' or platform == 'sunos':
+ versionparts = version.split('.')
+ if hasattr(target[0].attributes, 'shlibname'):
+ name = target[0].attributes.shlibname
+ else:
+ name = target[0].name
+ # generate library name with the version number
+ version_name = name + '.' + version
+ if Verbose:
+ print "shlib_emitter_names: target is ", version_name
+ print "shlib_emitter_names: side effect: ", name
+ # add version_name to list of names to be a Side effect
+ version_names.append(version_name)
+ if Verbose:
+ print "shlib_emitter_names: versionparts ",versionparts
+ for ver in versionparts[0:-1]:
+ name = name + '.' + ver
+ if Verbose:
+ print "shlib_emitter_names: side effect: ", name
+ # add name to list of names to be a Side effect
+ version_names.append(name)
+ elif platform == 'darwin':
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ if hasattr(target[0].attributes, 'shlibname'):
+ name = target[0].attributes.shlibname
+ else:
+ name = target[0].name
+ # generate library name with the version number
+ suffix_re = re.escape(shlib_suffix)
+ version_name = re.sub(suffix_re, '.' + version + shlib_suffix, name)
+ if Verbose:
+ print "shlib_emitter_names: target is ", version_name
+ print "shlib_emitter_names: side effect: ", name
+ # add version_name to list of names to be a Side effect
+ version_names.append(version_name)
+ elif platform == 'cygwin':
+ shlib_suffix = env.subst('$SHLIBSUFFIX')
+ if hasattr(target[0].attributes, 'shlibname'):
+ name = target[0].attributes.shlibname
+ else:
+ name = target[0].name
+ # generate library name with the version number
+ suffix_re = re.escape(shlib_suffix)
+ version_name = re.sub(suffix_re, '-' + re.sub('\.', '-', version) + shlib_suffix, name)
+ if Verbose:
+ print "shlib_emitter_names: target is ", version_name
+ print "shlib_emitter_names: side effect: ", name
+ # add version_name to list of names to be a Side effect
+ version_names.append(version_name)
+
+ except KeyError:
+ version = None
+ return version_names
+
+def generate(env):
+ """Add Builders and construction variables for gnulink to an Environment."""
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+ env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ # don't set up the emitter, cause AppendUnique will generate a list
+ # starting with None :-(
+ env.Append(SHLIBEMITTER = [shlib_emitter])
+ env['SMARTLINK'] = smart_link
+ env['LINK'] = "$SMARTLINK"
+ env['LINKFLAGS'] = SCons.Util.CLVar('')
+ # __RPATH is only set to something ($_RPATH typically) on platforms that support it.
+ env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LIBDIRPREFIX']='-L'
+ env['LIBDIRSUFFIX']=''
+ env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+ env['LIBLINKPREFIX']='-l'
+ env['LIBLINKSUFFIX']=''
+
+ if env['PLATFORM'] == 'hpux':
+ env['SHLIBSUFFIX'] = '.sl'
+ elif env['PLATFORM'] == 'aix':
+ env['SHLIBSUFFIX'] = '.a'
+
+ # For most platforms, a loadable module is the same as a shared
+ # library. Platforms which are different can override these, but
+ # setting them the same means that LoadableModule works everywhere.
+ SCons.Tool.createLoadableModuleBuilder(env)
+ env['LDMODULE'] = '$SHLINK'
+ # don't set up the emitter, cause AppendUnique will generate a list
+ # starting with None :-(
+ env.Append(LDMODULEEMITTER='$SHLIBEMITTER')
+ env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
+ env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
+ env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
+ env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+
+
+def exists(env):
+ # This module isn't really a Tool on its own, it's common logic for
+ # other linkers.
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py
index ab5b735..d2c218f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/linkloc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/linkloc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/m4.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py
index f43b594..dfc4665 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/m4.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/m4.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/m4.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/masm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py
index 5bb936a..7036de6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/masm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/masm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/masm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/midl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py
index 67660d1..0d93073 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/midl.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/midl.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/midl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py
index 6df46e0..236ce32 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mingw.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mingw.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
@@ -46,8 +46,22 @@ import SCons.Util
key_program = 'mingw32-gcc'
def find(env):
- # First search in the SCons path and then the OS path:
- return env.WhereIs(key_program) or SCons.Util.WhereIs(key_program)
+ # First search in the SCons path
+ path=env.WhereIs(key_program)
+ if (path):
+ return path
+ # then the OS path:
+ path=SCons.Util.WhereIs(key_program)
+ if (path):
+ return path
+
+ # If that doesn't work try default location for mingw
+ save_path=env['ENV']['PATH']
+ env.AppendENVPath('PATH',r'c:\MinGW\bin')
+ path =env.WhereIs(key_program)
+ if not path:
+ env['ENV']['PATH']=save_path
+ return path
def shlib_generator(target, source, env, for_signature):
cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
@@ -77,22 +91,29 @@ def shlib_emitter(target, source, env):
if not no_import_lib and \
not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
- # Append an import library to the list of targets.
- target.append(env.ReplaceIxes(dll,
+ # Create list of target libraries as strings
+ targetStrings=env.ReplaceIxes(dll,
'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'LIBPREFIX', 'LIBSUFFIX'))
+ 'LIBPREFIX', 'LIBSUFFIX')
+
+ # Now add file nodes to target list
+ target.append(env.fs.File(targetStrings))
# Append a def file target if there isn't already a def file target
- # or a def file source. There is no option to disable def file
- # target emitting, because I can't figure out why someone would ever
- # want to turn it off.
+ # or a def file source or the user has explicitly asked for the target
+ # to be emitted.
def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
- if not def_source and not def_target:
- target.append(env.ReplaceIxes(dll,
+ skip_def_insert = env.subst("$WINDOWS_INSERT_DEF") in ['', '0', 0]
+ if not def_source and not def_target and not skip_def_insert:
+ # Create list of target libraries and def files as strings
+ targetStrings=env.ReplaceIxes(dll,
'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX'))
-
+ 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+
+ # Now add file nodes to target list
+ target.append(env.fs.File(targetStrings))
+
return (target, source)
@@ -112,7 +133,7 @@ def generate(env):
# Most of mingw is the same as gcc and friends...
- gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4']
+ gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'gfortran', 'm4']
for tool in gnu_tools:
SCons.Tool.Tool(tool)(env)
@@ -147,6 +168,7 @@ def generate(env):
env['OBJSUFFIX'] = '.o'
env['LIBPREFIX'] = 'lib'
env['LIBSUFFIX'] = '.a'
+ env['PROGSUFFIX'] = '.exe'
def exists(env):
return find(env)
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py
new file mode 100644
index 0000000..4cfe686
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py
@@ -0,0 +1,108 @@
+""" msgfmt tool """
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+from SCons.Builder import BuilderBase
+#############################################################################
+class _MOFileBuilder(BuilderBase):
+ """ The builder class for `MO` files.
+
+ The reason for this builder to exists and its purpose is quite simillar
+ as for `_POFileBuilder`. This time, we extend list of sources, not targets,
+ and call `BuilderBase._execute()` only once (as we assume single-target
+ here).
+ """
+
+ def _execute(self, env, target, source, *args, **kw):
+ # Here we add support for 'LINGUAS_FILE' keyword. Emitter is not suitable
+ # in this case, as it is called too late (after multiple sources
+ # are handled single_source builder.
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _read_linguas_from_files
+ linguas_files = None
+ if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE'] is not None:
+ linguas_files = env['LINGUAS_FILE']
+ # This should prevent from endless recursion.
+ env['LINGUAS_FILE'] = None
+ # We read only languages. Suffixes shall be added automatically.
+ linguas = _read_linguas_from_files(env, linguas_files)
+ if SCons.Util.is_List(source):
+ source.extend(linguas)
+ elif source is not None:
+ source = [source] + linguas
+ else:
+ source = linguas
+ result = BuilderBase._execute(self,env,target,source,*args, **kw)
+ if linguas_files is not None:
+ env['LINGUAS_FILE'] = linguas_files
+ return result
+#############################################################################
+
+#############################################################################
+def _create_mo_file_builder(env, **kw):
+ """ Create builder object for `MOFiles` builder """
+ import SCons.Action
+ # FIXME: What factory use for source? Ours or their?
+ kw['action'] = SCons.Action.Action('$MSGFMTCOM','$MSGFMTCOMSTR')
+ kw['suffix'] = '$MOSUFFIX'
+ kw['src_suffix'] = '$POSUFFIX'
+ kw['src_builder'] = '_POUpdateBuilder'
+ kw['single_source'] = True
+ return _MOFileBuilder(**kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate `msgfmt` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _detect_msgfmt
+ try:
+ env['MSGFMT'] = _detect_msgfmt(env)
+ except:
+ env['MSGFMT'] = 'msgfmt'
+ env.SetDefault(
+ MSGFMTFLAGS = [ SCons.Util.CLVar('-c') ],
+ MSGFMTCOM = '$MSGFMT $MSGFMTFLAGS -o $TARGET $SOURCE',
+ MSGFMTCOMSTR = '',
+ MOSUFFIX = ['.mo'],
+ POSUFFIX = ['.po']
+ )
+ env.Append( BUILDERS = { 'MOFiles' : _create_mo_file_builder(env) } )
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msgfmt_exists
+ try:
+ return _msgfmt_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py
new file mode 100644
index 0000000..53046d6
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py
@@ -0,0 +1,120 @@
+""" msginit tool
+
+Tool specific initialization of msginit tool.
+"""
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/msginit.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import SCons.Warnings
+import SCons.Builder
+import re
+
+#############################################################################
+def _optional_no_translator_flag(env):
+ """ Return '--no-translator' flag if we run *msginit(1)* in non-interactive
+ mode."""
+ import SCons.Util
+ if env.has_key('POAUTOINIT'):
+ autoinit = env['POAUTOINIT']
+ else:
+ autoinit = False
+ if autoinit:
+ return [SCons.Util.CLVar('--no-translator')]
+ else:
+ return [SCons.Util.CLVar('')]
+#############################################################################
+
+#############################################################################
+def _POInitBuilder(env, **kw):
+ """ Create builder object for `POInit` builder. """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _init_po_files, _POFileBuilder
+ action = SCons.Action.Action(_init_po_files, None)
+ return _POFileBuilder(env, action=action, target_alias='$POCREATE_ALIAS')
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+#############################################################################
+def _POInitBuilderWrapper(env, target=None, source=_null, **kw):
+ """ Wrapper for _POFileBuilder. We use it to make user's life easier.
+
+ This wrapper checks for `$POTDOMAIN` construction variable (or override in
+ `**kw`) and treats it appropriatelly.
+ """
+ if source is _null:
+ if 'POTDOMAIN' in kw:
+ domain = kw['POTDOMAIN']
+ elif env.has_key('POTDOMAIN'):
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ source = [ domain ] # NOTE: Suffix shall be appended automatically
+ return env._POInitBuilder(target, source, **kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate the `msginit` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _detect_msginit
+ try:
+ env['MSGINIT'] = _detect_msginit(env)
+ except:
+ env['MSGINIT'] = 'msginit'
+ msginitcom = '$MSGINIT ${_MSGNoTranslator(__env__)} -l ${_MSGINITLOCALE}' \
+ + ' $MSGINITFLAGS -i $SOURCE -o $TARGET'
+ # NOTE: We set POTSUFFIX here, in case the 'xgettext' is not loaded
+ # (sometimes we really don't need it)
+ env.SetDefault(
+ POSUFFIX = ['.po'],
+ POTSUFFIX = ['.pot'],
+ _MSGINITLOCALE = '${TARGET.filebase}',
+ _MSGNoTranslator = _optional_no_translator_flag,
+ MSGINITCOM = msginitcom,
+ MSGINITCOMSTR = '',
+ MSGINITFLAGS = [ ],
+ POAUTOINIT = False,
+ POCREATE_ALIAS = 'po-create'
+ )
+ env.Append( BUILDERS = { '_POInitBuilder' : _POInitBuilder(env) } )
+ env.AddMethod(_POInitBuilderWrapper, 'POInit')
+ env.AlwaysBuild(env.Alias('$POCREATE_ALIAS'))
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msginit_exists
+ try:
+ return _msginit_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py
new file mode 100644
index 0000000..e2d06f4
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py
@@ -0,0 +1,104 @@
+""" msgmerget tool
+
+Tool specific initialization for `msgmerge` tool.
+"""
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+#############################################################################
+def _update_or_init_po_files(target, source, env):
+ """ Action function for `POUpdate` builder """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _init_po_files
+ for tgt in target:
+ if tgt.rexists():
+ action = SCons.Action.Action('$MSGMERGECOM', '$MSGMERGECOMSTR')
+ else:
+ action = _init_po_files
+ status = action([tgt], source, env)
+ if status : return status
+ return 0
+#############################################################################
+
+#############################################################################
+def _POUpdateBuilder(env, **kw):
+ """ Create an object of `POUpdate` builder """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _POFileBuilder
+ action = SCons.Action.Action(_update_or_init_po_files, None)
+ return _POFileBuilder(env, action=action, target_alias='$POUPDATE_ALIAS')
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+#############################################################################
+def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw):
+ """ Wrapper for `POUpdate` builder - make user's life easier """
+ if source is _null:
+ if 'POTDOMAIN' in kw:
+ domain = kw['POTDOMAIN']
+ elif env.has_key('POTDOMAIN') and env['POTDOMAIN']:
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ source = [ domain ] # NOTE: Suffix shall be appended automatically
+ return env._POUpdateBuilder(target, source, **kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate the `xgettext` tool """
+ from SCons.Tool.GettextCommon import _detect_msgmerge
+ try:
+ env['MSGMERGE'] = _detect_msgmerge(env)
+ except:
+ env['MSGMERGE'] = 'msgmerge'
+ env.SetDefault(
+ POTSUFFIX = ['.pot'],
+ POSUFFIX = ['.po'],
+ MSGMERGECOM = '$MSGMERGE $MSGMERGEFLAGS --update $TARGET $SOURCE',
+ MSGMERGECOMSTR = '',
+ MSGMERGEFLAGS = [ ],
+ POUPDATE_ALIAS = 'po-update'
+ )
+ env.Append(BUILDERS = { '_POUpdateBuilder':_POUpdateBuilder(env) })
+ env.AddMethod(_POUpdateBuilderWrapper, 'POUpdate')
+ env.AlwaysBuild(env.Alias('$POUPDATE_ALIAS'))
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msgmerge_exists
+ try:
+ return _msgmerge_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py
index a2933cb..a82e88d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mslib.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mslib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
@@ -50,7 +50,7 @@ def generate(env):
env['AR'] = 'lib'
env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
- env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
+ env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES','$ARCOMSTR')}"
env['LIBPREFIX'] = ''
env['LIBSUFFIX'] = '.lib'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py
index c291ba9..6906303 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mslink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mslink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -116,8 +116,9 @@ def _dllEmitter(target, source, env, paramtp):
"WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"))
version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
- if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0):
- # MSVC 8 automatically generates .manifest files that must be installed
+ if version_num >= 8.0 and \
+ (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
+ # MSVC 8 and above automatically generate .manifest files that must be installed
extratargets.append(
env.ReplaceIxes(dll,
'%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
@@ -128,6 +129,14 @@ def _dllEmitter(target, source, env, paramtp):
extratargets.append(pdb)
target[0].attributes.pdb = pdb
+ if version_num >= 11.0 and env.get('PCH', 0):
+ # MSVC 11 and above need the PCH object file to be added to the link line,
+ # otherwise you get link error LNK2011.
+ pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
+ # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
+ if pchobj not in extrasources:
+ extrasources.append(pchobj)
+
if not no_import_lib and \
not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
# Append an import library to the list of targets.
@@ -158,14 +167,16 @@ def prog_emitter(target, source, env):
SCons.Tool.msvc.validate_vars(env)
extratargets = []
+ extrasources = []
exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX")
if not exe:
raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX"))
version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
- if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0):
- # MSVC 8 automatically generates .manifest files that have to be installed
+ if version_num >= 8.0 and \
+ (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
+ # MSVC 8 and above automatically generate .manifest files that have to be installed
extratargets.append(
env.ReplaceIxes(exe,
"PROGPREFIX", "PROGSUFFIX",
@@ -176,7 +187,15 @@ def prog_emitter(target, source, env):
extratargets.append(pdb)
target[0].attributes.pdb = pdb
- return (target+extratargets,source)
+ if version_num >= 11.0 and env.get('PCH', 0):
+ # MSVC 11 and above need the PCH object file to be added to the link line,
+ # otherwise you get link error LNK2011.
+ pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
+ # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
+ if pchobj not in extrasources:
+ extrasources.append(pchobj)
+
+ return (target+extratargets,source+extrasources)
def RegServerFunc(target, source, env):
if 'register' in env and env['register']:
@@ -188,12 +207,50 @@ def RegServerFunc(target, source, env):
return ret
return 0
+# These are the actual actions run to embed the manifest.
+# They are only called from the Check versions below.
+embedManifestExeAction = SCons.Action.Action('$MTEXECOM')
+embedManifestDllAction = SCons.Action.Action('$MTSHLIBCOM')
+
+def embedManifestDllCheck(target, source, env):
+ """Function run by embedManifestDllCheckAction to check for existence of manifest
+ and other conditions, and embed the manifest by calling embedManifestDllAction if so."""
+ if env.get('WINDOWS_EMBED_MANIFEST', 0):
+ manifestSrc = target[0].get_abspath() + '.manifest'
+ if os.path.exists(manifestSrc):
+ ret = (embedManifestDllAction) ([target[0]],None,env)
+ if ret:
+ raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
+ return ret
+ else:
+ print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
+ return 0
+
+def embedManifestExeCheck(target, source, env):
+ """Function run by embedManifestExeCheckAction to check for existence of manifest
+ and other conditions, and embed the manifest by calling embedManifestExeAction if so."""
+ if env.get('WINDOWS_EMBED_MANIFEST', 0):
+ manifestSrc = target[0].get_abspath() + '.manifest'
+ if os.path.exists(manifestSrc):
+ ret = (embedManifestExeAction) ([target[0]],None,env)
+ if ret:
+ raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
+ return ret
+ else:
+ print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
+ return 0
+
+embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None)
+embedManifestExeCheckAction = SCons.Action.Action(embedManifestExeCheck, None)
+
regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR")
regServerCheck = SCons.Action.Action(RegServerFunc, None)
-shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}')
-compositeShLinkAction = shlibLinkAction + regServerCheck
-ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES")}')
-compositeLdmodAction = ldmodLinkAction + regServerCheck
+shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES", "$SHLINKCOMSTR")}', '$SHLINKCOMSTR')
+compositeShLinkAction = shlibLinkAction + regServerCheck + embedManifestDllCheckAction
+ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES", "$LDMODULECOMSTR")}', '$LDMODULECOMSTR')
+compositeLdmodAction = ldmodLinkAction + regServerCheck + embedManifestDllCheckAction
+exeLinkAction = SCons.Action.Action('${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows", "$LINKCOMSTR")}', '$LINKCOMSTR')
+compositeLinkAction = exeLinkAction + embedManifestExeCheckAction
def generate(env):
"""Add Builders and construction variables for ar to an Environment."""
@@ -209,7 +266,7 @@ def generate(env):
env['LINK'] = 'link'
env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
env['_PDB'] = pdbGenerator
- env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows")}'
+ env['LINKCOM'] = compositeLinkAction
env.Append(PROGEMITTER = [prog_emitter])
env['LIBDIRPREFIX']='/LIBPATH:'
env['LIBDIRSUFFIX']=''
@@ -238,6 +295,18 @@ def generate(env):
env['REGSVRFLAGS'] = '/s '
env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}'
+ env['WINDOWS_EMBED_MANIFEST'] = 0
+ env['MT'] = 'mt'
+ #env['MTFLAGS'] = ['-hashupdate']
+ env['MTFLAGS'] = SCons.Util.CLVar('/nologo')
+ # Note: use - here to prevent build failure if no manifest produced.
+ # This seems much simpler than a fancy system using a function action to see
+ # if the manifest actually exists before trying to run mt with it.
+ env['MTEXECOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;1'
+ env['MTSHLIBCOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;2'
+ # Future work garyo 27-Feb-11
+ env['_MANIFEST_SOURCES'] = None # _windowsManifestSources
+
# Set-up ms tools paths
msvc_setup_env_once(env)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py
index 08898c6..3836817 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mssdk.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mssdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
"""engine.SCons.Tool.mssdk
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py
index 8c13580..03d65ee 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/msvc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/msvc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
@@ -140,8 +140,13 @@ def msvc_batch_key(action, env, target, source):
Returning None specifies that the specified target+source should not
be batched with other compilations.
"""
- b = env.subst('$MSVC_BATCH')
- if b in (None, '', '0'):
+
+ # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
+ # was set to False. This new version should work better.
+ # Note we need to do the env.subst so $MSVC_BATCH can be a reference to
+ # another construction variable, which is why we test for False and 0
+ # as strings.
+ if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
# We're not using batching; return no key.
return None
t = target[0]
@@ -161,8 +166,13 @@ def msvc_output_flag(target, source, env, for_signature):
we return an /Fo string that just specifies the first target's
directory (where the Visual C/C++ compiler will put the .obj files).
"""
- b = env.subst('$MSVC_BATCH')
- if b in (None, '', '0') or len(source) == 1:
+
+ # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
+ # was set to False. This new version should work better. Removed
+ # len(source)==1 as batch mode can compile only one file
+ # (and it also fixed problem with compiling only one changed file
+ # with batch mode enabled)
+ if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
return '/Fo$TARGET'
else:
# The Visual C/C++ compiler requires a \ at the end of the /Fo
@@ -208,23 +218,23 @@ def generate(env):
shared_obj.add_emitter(suffix, shared_object_emitter)
env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}'])
- env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
+ env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s \\\"/Fp%s\\\""%(PCHSTOP or "",File(PCH))) or ""}'])
env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag
env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS'
env['CC'] = 'cl'
env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
env['CFLAGS'] = SCons.Util.CLVar('')
- env['CCCOM'] = '$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM'
+ env['CCCOM'] = '${TEMPFILE("$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM","$CCCOMSTR")}'
env['SHCC'] = '$CC'
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
- env['SHCCCOM'] = '$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM'
+ env['SHCCCOM'] = '${TEMPFILE("$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCCCOMSTR")}'
env['CXX'] = '$CC'
env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)')
- env['CXXCOM'] = '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM'
+ env['CXXCOM'] = '${TEMPFILE("$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM","$CXXCOMSTR")}'
env['SHCXX'] = '$CXX'
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHCXXCOM'] = '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM'
+ env['SHCXXCOM'] = '${TEMPFILE("$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCXXCOMSTR")}'
env['CPPDEFPREFIX'] = '/D'
env['CPPDEFSUFFIX'] = ''
env['INCPREFIX'] = '/I'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py
index 34fc0e7..0ad4c78 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/msvs.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/msvs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.compat
@@ -47,6 +47,7 @@ import SCons.Builder
import SCons.Node.FS
import SCons.Platform.win32
import SCons.Script.SConscript
+import SCons.PathList
import SCons.Util
import SCons.Warnings
@@ -62,8 +63,15 @@ def xmlify(s):
s = s.replace("&", "&amp;") # do this first
s = s.replace("'", "&apos;")
s = s.replace('"', "&quot;")
+ s = s.replace('\n', '&#x0A;')
return s
+# Process a CPPPATH list in includes, given the env, target and source.
+# Returns a tuple of nodes.
+def processIncludes(includes, env, target, source):
+ return SCons.PathList.PathList(includes).subst_path(env, target, source)
+
+
external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}'
def _generateGUID(slnfile, name):
@@ -92,6 +100,42 @@ def msvs_parse_version(s):
num, suite = version_re.match(s).groups()
return float(num), suite
+# os.path.relpath has been introduced in Python 2.6
+# We define it locally for earlier versions of Python
+def relpath(path, start=os.path.curdir):
+ """Return a relative version of a path"""
+ import sys
+ if not path:
+ raise ValueError("no path specified")
+ start_list = os.path.abspath(start).split(os.sep)
+ path_list = os.path.abspath(path).split(os.sep)
+ if 'posix' in sys.builtin_module_names:
+ # Work out how much of the filepath is shared by start and path.
+ i = len(os.path.commonprefix([start_list, path_list]))
+ else:
+ if start_list[0].lower() != path_list[0].lower():
+ unc_path, rest = os.path.splitunc(path)
+ unc_start, rest = os.path.splitunc(start)
+ if bool(unc_path) ^ bool(unc_start):
+ raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
+ % (path, start))
+ else:
+ raise ValueError("path is on drive %s, start on drive %s"
+ % (path_list[0], start_list[0]))
+ # Work out how much of the filepath is shared by start and path.
+ for i in range(min(len(start_list), len(path_list))):
+ if start_list[i].lower() != path_list[i].lower():
+ break
+ else:
+ i += 1
+ rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:]
+ if not rel_list:
+ return os.path.curdir
+ return os.path.join(*rel_list)
+
+if not "relpath" in os.path.__all__:
+ os.path.relpath = relpath
+
# This is how we re-invoke SCons from inside MSVS Project files.
# The problem is that we might have been invoked as either scons.bat
# or scons.py. If we were invoked directly as scons.py, then we could
@@ -155,6 +199,209 @@ def makeHierarchy(sources):
# print 'Warning: failed to decompose path for '+str(file)
return hierarchy
+class _UserGenerator(object):
+ '''
+ Base class for .dsp.user file generator
+ '''
+ # Default instance values.
+ # Ok ... a bit defensive, but it does not seems reasonable to crash the
+ # build for a workspace user file. :-)
+ usrhead = None
+ usrdebg = None
+ usrconf = None
+ createfile = False
+ def __init__(self, dspfile, source, env):
+ # DebugSettings should be a list of debug dictionary sorted in the same order
+ # than the target list and variants
+ if 'variant' not in env:
+ raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+ "'Release') to create an MSVSProject.")
+ elif SCons.Util.is_String(env['variant']):
+ variants = [env['variant']]
+ elif SCons.Util.is_List(env['variant']):
+ variants = env['variant']
+
+ if 'DebugSettings' not in env or env['DebugSettings'] == None:
+ dbg_settings = []
+ elif SCons.Util.is_Dict(env['DebugSettings']):
+ dbg_settings = [env['DebugSettings']]
+ elif SCons.Util.is_List(env['DebugSettings']):
+ if len(env['DebugSettings']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'DebugSettings' and 'variant' lists must be the same.")
+ dbg_settings = []
+ for ds in env['DebugSettings']:
+ if SCons.Util.is_Dict(ds):
+ dbg_settings.append(ds)
+ else:
+ dbg_settings.append({})
+ else:
+ dbg_settings = []
+
+ if len(dbg_settings) == 1:
+ dbg_settings = dbg_settings * len(variants)
+
+ self.createfile = self.usrhead and self.usrdebg and self.usrconf and \
+ dbg_settings and bool([ds for ds in dbg_settings if ds])
+
+ if self.createfile:
+ dbg_settings = dict(zip(variants, dbg_settings))
+ for var, src in dbg_settings.items():
+ # Update only expected keys
+ trg = {}
+ for key in [k for k in self.usrdebg.keys() if k in src]:
+ trg[key] = str(src[key])
+ self.configs[var].debug = trg
+
+ def UserHeader(self):
+ encoding = self.env.subst('$MSVSENCODING')
+ versionstr = self.versionstr
+ self.usrfile.write(self.usrhead % locals())
+
+ def UserProject(self):
+ pass
+
+ def Build(self):
+ if not self.createfile:
+ return
+ try:
+ filename = self.dspabs +'.user'
+ self.usrfile = open(filename, 'w')
+ except IOError, detail:
+ raise SCons.Errors.InternalError('Unable to open "' + filename + '" for writing:' + str(detail))
+ else:
+ self.UserHeader()
+ self.UserProject()
+ self.usrfile.close()
+
+V9UserHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioUserFile
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tShowAllFiles="false"
+\t>
+\t<Configurations>
+"""
+
+V9UserConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\t>
+\t\t\t<DebugSettings
+%(debug_settings)s
+\t\t\t/>
+\t\t</Configuration>
+"""
+
+V9DebugSettings = {
+'Command':'$(TargetPath)',
+'WorkingDirectory': None,
+'CommandArguments': None,
+'Attach':'false',
+'DebuggerType':'3',
+'Remote':'1',
+'RemoteMachine': None,
+'RemoteCommand': None,
+'HttpUrl': None,
+'PDBPath': None,
+'SQLDebugging': None,
+'Environment': None,
+'EnvironmentMerge':'true',
+'DebuggerFlavor': None,
+'MPIRunCommand': None,
+'MPIRunArguments': None,
+'MPIRunWorkingDirectory': None,
+'ApplicationCommand': None,
+'ApplicationArguments': None,
+'ShimCommand': None,
+'MPIAcceptMode': None,
+'MPIAcceptFilter': None,
+}
+
+class _GenerateV7User(_UserGenerator):
+ """Generates a Project file for MSVS .NET"""
+ def __init__(self, dspfile, source, env):
+ if self.version_num >= 9.0:
+ self.usrhead = V9UserHeader
+ self.usrconf = V9UserConfiguration
+ self.usrdebg = V9DebugSettings
+ _UserGenerator.__init__(self, dspfile, source, env)
+
+ def UserProject(self):
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ debug = self.configs[kind].debug
+ if debug:
+ debug_settings = '\n'.join(['\t\t\t\t%s="%s"' % (key, xmlify(value))
+ for key, value in debug.items()
+ if value is not None])
+ self.usrfile.write(self.usrconf % locals())
+ self.usrfile.write('\t</Configurations>\n</VisualStudioUserFile>')
+
+V10UserHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<Project ToolsVersion="%(versionstr)s" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+"""
+
+V10UserConfiguration = """\
+\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">
+%(debug_settings)s
+\t</PropertyGroup>
+"""
+
+V10DebugSettings = {
+'LocalDebuggerCommand': None,
+'LocalDebuggerCommandArguments': None,
+'LocalDebuggerEnvironment': None,
+'DebuggerFlavor': 'WindowsLocalDebugger',
+'LocalDebuggerWorkingDirectory': None,
+'LocalDebuggerAttach': None,
+'LocalDebuggerDebuggerType': None,
+'LocalDebuggerMergeEnvironment': None,
+'LocalDebuggerSQLDebugging': None,
+'RemoteDebuggerCommand': None,
+'RemoteDebuggerCommandArguments': None,
+'RemoteDebuggerWorkingDirectory': None,
+'RemoteDebuggerServerName': None,
+'RemoteDebuggerConnection': None,
+'RemoteDebuggerDebuggerType': None,
+'RemoteDebuggerAttach': None,
+'RemoteDebuggerSQLDebugging': None,
+'DeploymentDirectory': None,
+'AdditionalFiles': None,
+'RemoteDebuggerDeployDebugCppRuntime': None,
+'WebBrowserDebuggerHttpUrl': None,
+'WebBrowserDebuggerDebuggerType': None,
+'WebServiceDebuggerHttpUrl': None,
+'WebServiceDebuggerDebuggerType': None,
+'WebServiceDebuggerSQLDebugging': None,
+}
+
+class _GenerateV10User(_UserGenerator):
+ """Generates a Project'user file for MSVS 2010"""
+
+ def __init__(self, dspfile, source, env):
+ self.versionstr = '4.0'
+ self.usrhead = V10UserHeader
+ self.usrconf = V10UserConfiguration
+ self.usrdebg = V10DebugSettings
+ _UserGenerator.__init__(self, dspfile, source, env)
+
+ def UserProject(self):
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ debug = self.configs[kind].debug
+ if debug:
+ debug_settings = '\n'.join(['\t\t<%s>%s</%s>' % (key, xmlify(value), key)
+ for key, value in debug.items()
+ if value is not None])
+ self.usrfile.write(self.usrconf % locals())
+ self.usrfile.write('</Project>')
+
class _DSPGenerator(object):
""" Base class for DSP generators """
@@ -246,9 +493,17 @@ class _DSPGenerator(object):
runfile.append(s)
self.sconscript = env['MSVSSCONSCRIPT']
-
- cmdargs = env.get('cmdargs', '')
-
+
+ if 'cmdargs' not in env or env['cmdargs'] == None:
+ cmdargs = [''] * len(variants)
+ elif SCons.Util.is_String(env['cmdargs']):
+ cmdargs = [env['cmdargs']] * len(variants)
+ elif SCons.Util.is_List(env['cmdargs']):
+ if len(env['cmdargs']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'cmdargs' and 'variant' lists must be the same.")
+ else:
+ cmdargs = env['cmdargs']
+
self.env = env
if 'name' in self.env:
@@ -311,7 +566,7 @@ class _DSPGenerator(object):
print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'"
for i in range(len(variants)):
- AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs)
+ AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs[i])
self.platforms = []
for key in self.configs.keys():
@@ -516,11 +771,12 @@ class _GenerateV6DSP(_DSPGenerator):
self.file.close()
V7DSPHeader = """\
-<?xml version="1.0" encoding = "%(encoding)s"?>
+<?xml version="1.0" encoding="%(encoding)s"?>
<VisualStudioProject
\tProjectType="Visual C++"
\tVersion="%(versionstr)s"
\tName="%(name)s"
+\tProjectGUID="%(project_guid)s"
%(scc_attrs)s
\tKeyword="MakeFileProj">
"""
@@ -536,8 +792,8 @@ V7DSPConfiguration = """\
\t\t\t<Tool
\t\t\t\tName="VCNMakeTool"
\t\t\t\tBuildCommandLine="%(buildcmd)s"
+\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
\t\t\t\tCleanCommandLine="%(cleancmd)s"
-\t\t\t\tRebuildCommandLine="%(rebuildcmd)s"
\t\t\t\tOutput="%(runfile)s"/>
\t\t</Configuration>
"""
@@ -548,8 +804,9 @@ V8DSPHeader = """\
\tProjectType="Visual C++"
\tVersion="%(versionstr)s"
\tName="%(name)s"
-%(scc_attrs)s
+\tProjectGUID="%(project_guid)s"
\tRootNamespace="%(name)s"
+%(scc_attrs)s
\tKeyword="MakeFileProj">
"""
@@ -575,14 +832,18 @@ V8DSPConfiguration = """\
\t\t\t/>
\t\t</Configuration>
"""
-class _GenerateV7DSP(_DSPGenerator):
+class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):
"""Generates a Project file for MSVS .NET"""
def __init__(self, dspfile, source, env):
_DSPGenerator.__init__(self, dspfile, source, env)
self.version = env['MSVS_VERSION']
self.version_num, self.suite = msvs_parse_version(self.version)
- if self.version_num >= 8.0:
+ if self.version_num >= 9.0:
+ self.versionstr = '9.00'
+ self.dspheader = V8DSPHeader
+ self.dspconfiguration = V8DSPConfiguration
+ elif self.version_num >= 8.0:
self.versionstr = '8.00'
self.dspheader = V8DSPHeader
self.dspconfiguration = V8DSPConfiguration
@@ -594,6 +855,8 @@ class _GenerateV7DSP(_DSPGenerator):
self.dspheader = V7DSPHeader
self.dspconfiguration = V7DSPConfiguration
self.file = None
+
+ _GenerateV7User.__init__(self, dspfile, source, env)
def PrintHeader(self):
env = self.env
@@ -603,20 +866,27 @@ class _GenerateV7DSP(_DSPGenerator):
scc_provider = env.get('MSVS_SCC_PROVIDER', '')
scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
- scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '')
+ # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
project_guid = env.get('MSVS_PROJECT_GUID', '')
- if self.version_num >= 8.0 and not project_guid:
+ if not project_guid:
project_guid = _generateGUID(self.dspfile, '')
if scc_provider != '':
- scc_attrs = ('\tProjectGUID="%s"\n'
- '\tSccProjectName="%s"\n'
- '\tSccAuxPath="%s"\n'
- '\tSccLocalPath="%s"\n'
- '\tSccProvider="%s"' % (project_guid, scc_project_name, scc_aux_path, scc_local_path, scc_provider))
+ scc_attrs = '\tSccProjectName="%s"\n' % scc_project_name
+ if scc_aux_path != '':
+ scc_attrs += '\tSccAuxPath="%s"\n' % scc_aux_path
+ scc_attrs += ('\tSccLocalPath="%s"\n'
+ '\tSccProvider="%s"' % (scc_local_path, scc_provider))
+ elif scc_local_path_legacy != '':
+ # This case is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_attrs = ('\tSccProjectName="%s"\n'
+ '\tSccLocalPath="%s"' % (scc_project_name, scc_local_path_legacy))
else:
- scc_attrs = ('\tProjectGUID="%s"\n'
- '\tSccProjectName="%s"\n'
- '\tSccLocalPath="%s"' % (project_guid, scc_project_name, scc_local_path))
+ self.dspheader = self.dspheader.replace('%(scc_attrs)s\n', '')
self.file.write(self.dspheader % locals())
@@ -656,9 +926,13 @@ class _GenerateV7DSP(_DSPGenerator):
rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+ # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
+ # so they could vary depending on the command being generated. This code
+ # assumes they don't.
preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
- includepath = xmlify(';'.join(self.env.get('CPPPATH', [])))
-
+ includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+
if not env_has_buildtarget:
del self.env['MSVSBUILDTARGET']
@@ -726,19 +1000,15 @@ class _GenerateV7DSP(_DSPGenerator):
# First remove any common prefix
commonprefix = None
- if len(sources) > 1:
- s = list(map(os.path.normpath, sources))
- # take the dirname because the prefix may include parts
- # of the filenames (e.g. if you have 'dir\abcd' and
- # 'dir\acde' then the cp will be 'dir\a' )
- cp = os.path.dirname( os.path.commonprefix(s) )
- if cp and s[0][len(cp)] == os.sep:
- # +1 because the filename starts after the separator
- sources = [s[len(cp)+1:] for s in sources]
- commonprefix = cp
- elif len(sources) == 1:
- commonprefix = os.path.dirname( sources[0] )
- sources[0] = os.path.basename( sources[0] )
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
hierarchy = makeHierarchy(sources)
self.printSources(hierarchy, commonprefix=commonprefix)
@@ -811,11 +1081,324 @@ class _GenerateV7DSP(_DSPGenerator):
self.PrintHeader()
self.PrintProject()
self.file.close()
+
+ _GenerateV7User.Build(self)
+
+V10DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+"""
+
+V10DSPProjectConfiguration = """\
+\t\t<ProjectConfiguration Include="%(variant)s|%(platform)s">
+\t\t\t<Configuration>%(variant)s</Configuration>
+\t\t\t<Platform>%(platform)s</Platform>
+\t\t</ProjectConfiguration>
+"""
+
+V10DSPGlobals = """\
+\t<PropertyGroup Label="Globals">
+\t\t<ProjectGuid>%(project_guid)s</ProjectGuid>
+%(scc_attrs)s\t\t<RootNamespace>%(name)s</RootNamespace>
+\t\t<Keyword>MakeFileProj</Keyword>
+\t</PropertyGroup>
+"""
+
+V10DSPPropertyGroupCondition = """\
+\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="Configuration">
+\t\t<ConfigurationType>Makefile</ConfigurationType>
+\t\t<UseOfMfc>false</UseOfMfc>
+\t\t<PlatformToolset>%(toolset)s</PlatformToolset>
+\t</PropertyGroup>
+"""
+
+V10DSPImportGroupCondition = """\
+\t<ImportGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="PropertySheets">
+\t\t<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+\t</ImportGroup>
+"""
+
+V10DSPCommandLine = """\
+\t\t<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(buildcmd)s</NMakeBuildCommandLine>
+\t\t<NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(rebuildcmd)s</NMakeReBuildCommandLine>
+\t\t<NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(cleancmd)s</NMakeCleanCommandLine>
+\t\t<NMakeOutput Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(runfile)s</NMakeOutput>
+\t\t<NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(preprocdefs)s</NMakePreprocessorDefinitions>
+\t\t<NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(includepath)s</NMakeIncludeSearchPath>
+\t\t<NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+\t\t<NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+\t\t<NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+"""
+
+class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):
+ """Generates a Project file for MSVS 2010"""
+
+ def __init__(self, dspfile, source, env):
+ _DSPGenerator.__init__(self, dspfile, source, env)
+ self.dspheader = V10DSPHeader
+ self.dspconfiguration = V10DSPProjectConfiguration
+ self.dspglobals = V10DSPGlobals
+
+ _GenerateV10User.__init__(self, dspfile, source, env)
+
+ def PrintHeader(self):
+ env = self.env
+ name = self.name
+ encoding = env.subst('$MSVSENCODING')
+ project_guid = env.get('MSVS_PROJECT_GUID', '')
+ scc_provider = env.get('MSVS_SCC_PROVIDER', '')
+ scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
+ scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
+ # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
+ if not project_guid:
+ project_guid = _generateGUID(self.dspfile, '')
+ if scc_provider != '':
+ scc_attrs = '\t\t<SccProjectName>%s</SccProjectName>\n' % scc_project_name
+ if scc_aux_path != '':
+ scc_attrs += '\t\t<SccAuxPath>%s</SccAuxPath>\n' % scc_aux_path
+ scc_attrs += ('\t\t<SccLocalPath>%s</SccLocalPath>\n'
+ '\t\t<SccProvider>%s</SccProvider>\n' % (scc_local_path, scc_provider))
+ elif scc_local_path_legacy != '':
+ # This case is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_attrs = ('\t\t<SccProjectName>%s</SccProjectName>\n'
+ '\t\t<SccLocalPath>%s</SccLocalPath>\n' % (scc_project_name, scc_local_path_legacy))
+ else:
+ self.dspglobals = self.dspglobals.replace('%(scc_attrs)s', '')
+
+ self.file.write(self.dspheader % locals())
+
+ self.file.write('\t<ItemGroup Label="ProjectConfigurations">\n')
+
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(self.dspconfiguration % locals())
+
+ self.file.write('\t</ItemGroup>\n')
+
+ self.file.write(self.dspglobals % locals())
+
+ def PrintProject(self):
+ name = self.name
+ confkeys = sorted(self.configs.keys())
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\n')
+
+ toolset = ''
+ if 'MSVC_VERSION' in self.env:
+ version_num, suite = msvs_parse_version(self.env['MSVC_VERSION'])
+ toolset = 'v%d' % (version_num * 10)
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(V10DSPPropertyGroupCondition % locals())
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\n')
+ self.file.write('\t<ImportGroup Label="ExtensionSettings">\n')
+ self.file.write('\t</ImportGroup>\n')
+
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(V10DSPImportGroupCondition % locals())
+
+ self.file.write('\t<PropertyGroup Label="UserMacros" />\n')
+ self.file.write('\t<PropertyGroup>\n')
+ self.file.write('\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n')
+
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ outdir = self.configs[kind].outdir
+ buildtarget = self.configs[kind].buildtarget
+ runfile = self.configs[kind].runfile
+ cmdargs = self.configs[kind].cmdargs
+
+ env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+ if not env_has_buildtarget:
+ self.env['MSVSBUILDTARGET'] = buildtarget
+
+ starting = 'echo Starting SCons && '
+ if cmdargs:
+ cmdargs = ' ' + cmdargs
+ else:
+ cmdargs = ''
+ buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
+ rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
+ cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+
+ # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
+ # so they could vary depending on the command being generated. This code
+ # assumes they don't.
+ preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
+ includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+
+ if not env_has_buildtarget:
+ del self.env['MSVSBUILDTARGET']
+
+ self.file.write(V10DSPCommandLine % locals())
+
+ self.file.write('\t</PropertyGroup>\n')
+
+ #filter settings in MSVS 2010 are stored in separate file
+ self.filtersabs = self.dspabs + '.filters'
+ try:
+ self.filters_file = open(self.filtersabs, 'w')
+ except IOError, detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail))
+
+ self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'
+ '<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\n')
+
+ self.PrintSourceFiles()
+
+ self.filters_file.write('</Project>')
+ self.filters_file.close()
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\n'
+ '\t<ImportGroup Label="ExtensionTargets">\n'
+ '\t</ImportGroup>\n'
+ '</Project>\n')
+
+ if self.nokeep == 0:
+ # now we pickle some data and add it to the file -- MSDEV will ignore it.
+ pdata = pickle.dumps(self.configs,1)
+ pdata = base64.encodestring(pdata)
+ self.file.write('<!-- SCons Data:\n' + pdata + '\n')
+ pdata = pickle.dumps(self.sources,1)
+ pdata = base64.encodestring(pdata)
+ self.file.write(pdata + '-->\n')
+
+ def printFilters(self, hierarchy, name):
+ sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+
+ for key, value in sorteditems:
+ if SCons.Util.is_Dict(value):
+ filter_name = name + '\\' + key
+ self.filters_file.write('\t\t<Filter Include="%s">\n'
+ '\t\t\t<UniqueIdentifier>%s</UniqueIdentifier>\n'
+ '\t\t</Filter>\n' % (filter_name, _generateGUID(self.dspabs, filter_name)))
+ self.printFilters(value, filter_name)
+
+ def printSources(self, hierarchy, kind, commonprefix, filter_name):
+ keywords = {'Source Files': 'ClCompile',
+ 'Header Files': 'ClInclude',
+ 'Local Headers': 'ClInclude',
+ 'Resource Files': 'None',
+ 'Other Files': 'None'}
+
+ sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+
+ # First folders, then files
+ for key, value in sorteditems:
+ if SCons.Util.is_Dict(value):
+ self.printSources(value, kind, commonprefix, filter_name + '\\' + key)
+
+ for key, value in sorteditems:
+ if SCons.Util.is_String(value):
+ file = value
+ if commonprefix:
+ file = os.path.join(commonprefix, value)
+ file = os.path.normpath(file)
+
+ self.file.write('\t\t<%s Include="%s" />\n' % (keywords[kind], file))
+ self.filters_file.write('\t\t<%s Include="%s">\n'
+ '\t\t\t<Filter>%s</Filter>\n'
+ '\t\t</%s>\n' % (keywords[kind], file, filter_name, keywords[kind]))
+
+ def PrintSourceFiles(self):
+ categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
+ 'Header Files': 'h;hpp;hxx;hm;inl',
+ 'Local Headers': 'h;hpp;hxx;hm;inl',
+ 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
+ 'Other Files': ''}
+
+ cats = sorted([k for k in categories.keys() if self.sources[k]],
+ key = lambda a: a.lower())
+
+ # print vcxproj.filters file first
+ self.filters_file.write('\t<ItemGroup>\n')
+ for kind in cats:
+ self.filters_file.write('\t\t<Filter Include="%s">\n'
+ '\t\t\t<UniqueIdentifier>{7b42d31d-d53c-4868-8b92-ca2bc9fc052f}</UniqueIdentifier>\n'
+ '\t\t\t<Extensions>%s</Extensions>\n'
+ '\t\t</Filter>\n' % (kind, categories[kind]))
+
+ # First remove any common prefix
+ sources = self.sources[kind]
+ commonprefix = None
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
+
+ hierarchy = makeHierarchy(sources)
+ self.printFilters(hierarchy, kind)
+
+ self.filters_file.write('\t</ItemGroup>\n')
+
+ # then print files and filters
+ for kind in cats:
+ self.file.write('\t<ItemGroup>\n')
+ self.filters_file.write('\t<ItemGroup>\n')
+
+ # First remove any common prefix
+ sources = self.sources[kind]
+ commonprefix = None
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
+
+ hierarchy = makeHierarchy(sources)
+ self.printSources(hierarchy, kind, commonprefix, kind)
+
+ self.file.write('\t</ItemGroup>\n')
+ self.filters_file.write('\t</ItemGroup>\n')
+
+ # add the SConscript file outside of the groups
+ self.file.write('\t<ItemGroup>\n'
+ '\t\t<None Include="%s" />\n'
+ #'\t\t<None Include="SConstruct" />\n'
+ '\t</ItemGroup>\n' % str(self.sconscript))
+
+ def Parse(self):
+ print "_GenerateV10DSP.Parse()"
+
+ def Build(self):
+ try:
+ self.file = open(self.dspabs, 'w')
+ except IOError, detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+ else:
+ self.PrintHeader()
+ self.PrintProject()
+ self.file.close()
+
+ _GenerateV10User.Build(self)
class _DSWGenerator(object):
""" Base class for DSW generators """
def __init__(self, dswfile, source, env):
self.dswfile = os.path.normpath(str(dswfile))
+ self.dsw_folder_path = os.path.dirname(os.path.abspath(self.dswfile))
self.env = env
if 'projects' not in env:
@@ -846,12 +1429,16 @@ class _GenerateV7DSW(_DSWGenerator):
self.version = self.env['MSVS_VERSION']
self.version_num, self.suite = msvs_parse_version(self.version)
self.versionstr = '7.00'
- if self.version_num >= 8.0:
+ if self.version_num >= 11.0:
+ self.versionstr = '12.00'
+ elif self.version_num >= 10.0:
+ self.versionstr = '11.00'
+ elif self.version_num >= 9.0:
+ self.versionstr = '10.00'
+ elif self.version_num >= 8.0:
self.versionstr = '9.00'
elif self.version_num >= 7.1:
self.versionstr = '8.00'
- if self.version_num >= 8.0:
- self.versionstr = '9.00'
if 'slnguid' in env and env['slnguid']:
self.slnguid = env['slnguid']
@@ -896,6 +1483,26 @@ class _GenerateV7DSW(_DSWGenerator):
if not platform in self.platforms:
self.platforms.append(platform)
+ def GenerateProjectFilesInfo(self):
+ for dspfile in self.dspfiles:
+ dsp_folder_path, name = os.path.split(dspfile)
+ dsp_folder_path = os.path.abspath(dsp_folder_path)
+ dsp_relative_folder_path = os.path.relpath(dsp_folder_path, self.dsw_folder_path)
+ if dsp_relative_folder_path == os.curdir:
+ dsp_relative_file_path = name
+ else:
+ dsp_relative_file_path = os.path.join(dsp_relative_folder_path, name)
+ dspfile_info = {'NAME': name,
+ 'GUID': _generateGUID(dspfile, ''),
+ 'FOLDER_PATH': dsp_folder_path,
+ 'FILE_PATH': dspfile,
+ 'SLN_RELATIVE_FOLDER_PATH': dsp_relative_folder_path,
+ 'SLN_RELATIVE_FILE_PATH': dsp_relative_file_path}
+ self.dspfiles_info.append(dspfile_info)
+
+ self.dspfiles_info = []
+ GenerateProjectFilesInfo(self)
+
def Parse(self):
try:
dswfile = open(self.dswfile,'r')
@@ -927,17 +1534,25 @@ class _GenerateV7DSW(_DSWGenerator):
def PrintSolution(self):
"""Writes a solution file"""
- self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr )
- if self.version_num >= 8.0:
+ self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr)
+ if self.version_num >= 12.0:
+ self.file.write('# Visual Studio 14\n')
+ elif self.version_num >= 11.0:
+ self.file.write('# Visual Studio 11\n')
+ elif self.version_num >= 10.0:
+ self.file.write('# Visual Studio 2010\n')
+ elif self.version_num >= 9.0:
+ self.file.write('# Visual Studio 2008\n')
+ elif self.version_num >= 8.0:
self.file.write('# Visual Studio 2005\n')
- for p in self.dspfiles:
- name = os.path.basename(p)
+
+ for dspinfo in self.dspfiles_info:
+ name = dspinfo['NAME']
base, suffix = SCons.Util.splitext(name)
if suffix == '.vcproj':
name = base
- guid = _generateGUID(p, '')
self.file.write('Project("%s") = "%s", "%s", "%s"\n'
- % ( external_makefile_guid, name, p, guid ) )
+ % (external_makefile_guid, name, dspinfo['SLN_RELATIVE_FILE_PATH'], dspinfo['GUID']))
if self.version_num >= 7.1 and self.version_num < 8.0:
self.file.write('\tProjectSection(ProjectDependencies) = postProject\n'
'\tEndProjectSection\n')
@@ -947,30 +1562,36 @@ class _GenerateV7DSW(_DSWGenerator):
env = self.env
if 'MSVS_SCC_PROVIDER' in env:
- dspfile_base = os.path.basename(self.dspfile)
+ scc_number_of_projects = len(self.dspfiles) + 1
slnguid = self.slnguid
- scc_provider = env.get('MSVS_SCC_PROVIDER', '')
- scc_provider = scc_provider.replace(' ', r'\u0020')
- scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
- # scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
- scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '')
- scc_project_base_path = env.get('MSVS_SCC_PROJECT_BASE_PATH', '')
- # project_guid = env.get('MSVS_PROJECT_GUID', '')
-
+ scc_provider = env.get('MSVS_SCC_PROVIDER', '').replace(' ', r'\u0020')
+ scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '').replace(' ', r'\u0020')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, self.dsw_folder_path).replace('\\', '\\\\')
self.file.write('\tGlobalSection(SourceCodeControl) = preSolution\n'
- '\t\tSccNumberOfProjects = 2\n'
- '\t\tSccProjectUniqueName0 = %(dspfile_base)s\n'
+ '\t\tSccNumberOfProjects = %(scc_number_of_projects)d\n'
+ '\t\tSccProjectName0 = %(scc_project_name)s\n'
'\t\tSccLocalPath0 = %(scc_local_path)s\n'
- '\t\tCanCheckoutShared = true\n'
- '\t\tSccProjectFilePathRelativizedFromConnection0 = %(scc_project_base_path)s\n'
- '\t\tSccProjectName1 = %(scc_project_name)s\n'
- '\t\tSccLocalPath1 = %(scc_local_path)s\n'
- '\t\tSccProvider1 = %(scc_provider)s\n'
- '\t\tCanCheckoutShared = true\n'
- '\t\tSccProjectFilePathRelativizedFromConnection1 = %(scc_project_base_path)s\n'
- '\t\tSolutionUniqueID = %(slnguid)s\n'
- '\tEndGlobalSection\n' % locals())
-
+ '\t\tSccProvider0 = %(scc_provider)s\n'
+ '\t\tCanCheckoutShared = true\n' % locals())
+ sln_relative_path_from_scc = os.path.relpath(self.dsw_folder_path, scc_connection_root)
+ if sln_relative_path_from_scc != os.curdir:
+ self.file.write('\t\tSccProjectFilePathRelativizedFromConnection0 = %s\\\\\n'
+ % sln_relative_path_from_scc.replace('\\', '\\\\'))
+ if self.version_num < 8.0:
+ # When present, SolutionUniqueID is automatically removed by VS 2005
+ # TODO: check for Visual Studio versions newer than 2005
+ self.file.write('\t\tSolutionUniqueID = %s\n' % slnguid)
+ for dspinfo in self.dspfiles_info:
+ i = self.dspfiles_info.index(dspinfo) + 1
+ dsp_relative_file_path = dspinfo['SLN_RELATIVE_FILE_PATH'].replace('\\', '\\\\')
+ dsp_scc_relative_folder_path = os.path.relpath(dspinfo['FOLDER_PATH'], scc_connection_root).replace('\\', '\\\\')
+ self.file.write('\t\tSccProjectUniqueName%(i)s = %(dsp_relative_file_path)s\n'
+ '\t\tSccLocalPath%(i)d = %(scc_local_path)s\n'
+ '\t\tCanCheckoutShared = true\n'
+ '\t\tSccProjectFilePathRelativizedFromConnection%(i)s = %(dsp_scc_relative_folder_path)s\\\\\n'
+ % locals())
+ self.file.write('\tEndGlobalSection\n')
if self.version_num >= 8.0:
self.file.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
else:
@@ -987,7 +1608,7 @@ class _GenerateV7DSW(_DSWGenerator):
self.file.write('\t\tConfigName.%d = %s\n' % (cnt, variant))
cnt = cnt + 1
self.file.write('\tEndGlobalSection\n')
- if self.version_num < 7.1:
+ if self.version_num <= 7.1:
self.file.write('\tGlobalSection(ProjectDependencies) = postSolution\n'
'\tEndGlobalSection\n')
if self.version_num >= 8.0:
@@ -999,13 +1620,13 @@ class _GenerateV7DSW(_DSWGenerator):
variant = self.configs[name].variant
platform = self.configs[name].platform
if self.version_num >= 8.0:
- for p in self.dspfiles:
- guid = _generateGUID(p, '')
+ for dspinfo in self.dspfiles_info:
+ guid = dspinfo['GUID']
self.file.write('\t\t%s.%s|%s.ActiveCfg = %s|%s\n'
'\t\t%s.%s|%s.Build.0 = %s|%s\n' % (guid,variant,platform,variant,platform,guid,variant,platform,variant,platform))
else:
- for p in self.dspfiles:
- guid = _generateGUID(p, '')
+ for dspinfo in self.dspfiles_info:
+ guid = dspinfo['GUID']
self.file.write('\t\t%s.%s.ActiveCfg = %s|%s\n'
'\t\t%s.%s.Build.0 = %s|%s\n' %(guid,variant,variant,platform,guid,variant,variant,platform))
@@ -1072,7 +1693,7 @@ class _GenerateV6DSW(_DSWGenerator):
def PrintWorkspace(self):
""" writes a DSW file """
name = self.name
- dspfile = self.dspfiles[0]
+ dspfile = os.path.relpath(self.dspfiles[0], self.dsw_folder_path)
self.file.write(V6DSWHeader % locals())
def Build(self):
@@ -1091,7 +1712,10 @@ def GenerateDSP(dspfile, source, env):
version_num = 6.0
if 'MSVS_VERSION' in env:
version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
- if version_num >= 7.0:
+ if version_num >= 10.0:
+ g = _GenerateV10DSP(dspfile, source, env)
+ g.Build()
+ elif version_num >= 7.0:
g = _GenerateV7DSP(dspfile, source, env)
g.Build()
else:
@@ -1118,10 +1742,10 @@ def GenerateDSW(dswfile, source, env):
##############################################################################
def GetMSVSProjectSuffix(target, source, env, for_signature):
- return env['MSVS']['PROJECTSUFFIX']
+ return env['MSVS']['PROJECTSUFFIX']
def GetMSVSSolutionSuffix(target, source, env, for_signature):
- return env['MSVS']['SOLUTIONSUFFIX']
+ return env['MSVS']['SOLUTIONSUFFIX']
def GenerateProject(target, source, env):
# generate the dsp file, according to the version of MSVS.
@@ -1178,6 +1802,12 @@ def projectEmitter(target, source, env):
source = source + env.subst('$MSVSSCONSCOM', 1)
source = source + env.subst('$MSVSENCODING', 1)
+ # Project file depends on CPPDEFINES and CPPPATH
+ preprocdefs = xmlify(';'.join(processDefines(env.get('CPPDEFINES', []))))
+ includepath_Dirs = processIncludes(env.get('CPPPATH', []), env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+ source = source + "; ppdefs:%s incpath:%s"%(preprocdefs, includepath)
+
if 'buildtarget' in env and env['buildtarget'] != None:
if SCons.Util.is_String(env['buildtarget']):
source = source + ' "%s"' % env['buildtarget']
@@ -1246,10 +1876,14 @@ def projectEmitter(target, source, env):
sourcelist = source
if env.get('auto_build_solution', 1):
- env['projects'] = targetlist
+ env['projects'] = [env.File(t).srcnode() for t in targetlist]
t, s = solutionEmitter(target, target, env)
targetlist = targetlist + t
+ # Beginning with Visual Studio 2010 for each project file (.vcxproj) we have additional file (.vcxproj.filters)
+ if float(env['MSVS_VERSION']) >= 10.0:
+ targetlist.append(targetlist[0] + '.filters')
+
return (targetlist, sourcelist)
def solutionEmitter(target, source, env):
@@ -1349,12 +1983,11 @@ def generate(env):
env['MSVSSCONSCRIPT'] = default_MSVS_SConscript
env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env))
- env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.abspath}" -f ${MSVSSCONSCRIPT.name}'
+ env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.get_abspath()}" -f ${MSVSSCONSCRIPT.name}'
env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS'
env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
env['MSVSCLEANCOM'] = '$MSVSSCONSCOM -c "$MSVSBUILDTARGET"'
- env['MSVSENCODING'] = 'Windows-1252'
# Set-up ms tools paths for default version
msvc_setup_env_once(env)
@@ -1368,9 +2001,17 @@ def generate(env):
if (version_num < 7.0):
env['MSVS']['PROJECTSUFFIX'] = '.dsp'
env['MSVS']['SOLUTIONSUFFIX'] = '.dsw'
- else:
+ elif (version_num < 10.0):
env['MSVS']['PROJECTSUFFIX'] = '.vcproj'
env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+ else:
+ env['MSVS']['PROJECTSUFFIX'] = '.vcxproj'
+ env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+
+ if (version_num >= 10.0):
+ env['MSVSENCODING'] = 'utf-8'
+ else:
+ env['MSVSENCODING'] = 'Windows-1252'
env['GET_MSVSPROJECTSUFFIX'] = GetMSVSProjectSuffix
env['GET_MSVSSOLUTIONSUFFIX'] = GetMSVSSolutionSuffix
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py
index fe6f0b3..a130d0f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwcc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mwcc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mwcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwld.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py
index 73d9f32..8f6f3a2 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/mwld.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/mwld.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/mwld.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/nasm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py
index 212e323..86a7ef8 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/nasm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/nasm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/nasm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py
index e7d684e..2107d5f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py
@@ -4,7 +4,7 @@ SCons Packaging Tool.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -25,7 +25,7 @@ SCons Packaging Tool.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/packaging/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Environment
from SCons.Variables import *
@@ -80,7 +80,7 @@ def Tag(env, target, source, *more_tags, **kw_tags):
#if not k.startswith('PACKAGING_'):
if k[:10] != 'PACKAGING_':
k='PACKAGING_'+k
- setattr(t, k, v)
+ t.Tag(k, v)
def Package(env, target=None, source=None, **kw):
""" Entry point for the package tool.
@@ -235,9 +235,11 @@ def copy_attr(f1, f2):
#pattrs = [x for x in dir(f1) if not hasattr(f2, x) and\
# x.startswith('PACKAGING_')]
copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'
- pattrs = list(filter(copyit, dir(f1)))
- for attr in pattrs:
- setattr(f2, attr, getattr(f1, attr))
+ if f1._tags:
+ pattrs = list(filter(copyit, f1._tags))
+ for attr in pattrs:
+ f2.Tag(attr, f1.GetTag(attr))
+
def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
""" Uses the CopyAs builder to copy all source files to the directory given
in pkgroot.
@@ -262,9 +264,9 @@ def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
if file.is_under(pkgroot):
new_source.append(file)
else:
- if hasattr(file, 'PACKAGING_INSTALL_LOCATION') and\
+ if file.GetTag('PACKAGING_INSTALL_LOCATION') and\
honor_install_location:
- new_name=make_path_relative(file.PACKAGING_INSTALL_LOCATION)
+ new_name=make_path_relative(file.GetTag('PACKAGING_INSTALL_LOCATION'))
else:
new_name=make_path_relative(file.get_path())
@@ -301,7 +303,7 @@ def stripinstallbuilder(target, source, env):
for ss in s.sources:
n_source.append(ss)
copy_attr(s, ss)
- setattr(ss, 'PACKAGING_INSTALL_LOCATION', s.get_path())
+ ss.Tag('PACKAGING_INSTALL_LOCATION', s.get_path())
return (target, n_source)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/ipk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py
index 266bb70..51c3381 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/ipk.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py
@@ -2,7 +2,7 @@
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -24,7 +24,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/ipk.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Builder
import SCons.Node.FS
@@ -120,7 +120,7 @@ def build_specfiles(source, target, env):
return opened_files[needle]
except KeyError:
file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0]
- opened_files[needle]=open(file.abspath, 'w')
+ opened_files[needle]=open(file.get_abspath(), 'w')
return opened_files[needle]
control_file=open_file('control', target)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/msi.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py
index 76dca18..41b7c77 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/msi.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py
@@ -4,7 +4,7 @@ The msi packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -25,7 +25,7 @@ The msi packager.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/packaging/msi.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import SCons
@@ -189,7 +189,7 @@ def build_wxsfile(target, source, env):
""" compiles a .wxs file from the keywords given in env['msi_spec'] and
by analyzing the tree of source nodes and their tags.
"""
- file = open(target[0].abspath, 'w')
+ file = open(target[0].get_abspath(), 'w')
try:
# Create a document with the Wix root tag
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/rpm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py
index ff693b9..f7e2577 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/rpm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py
@@ -4,7 +4,7 @@ The rpm packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -25,11 +25,12 @@ The rpm packager.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Tool/packaging/rpm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import SCons.Builder
+import SCons.Tool.rpmutils
from SCons.Environment import OverrideEnvironment
from SCons.Tool.packaging import stripinstallbuilder, src_targz
@@ -52,16 +53,7 @@ def package(env, target, source, PACKAGEROOT, NAME, VERSION,
else:
# This should be overridable from the construction environment,
# which it is by using ARCHITECTURE=.
- # Guessing based on what os.uname() returns at least allows it
- # to work for both i386 and x86_64 Linux systems.
- archmap = {
- 'i686' : 'i386',
- 'i586' : 'i386',
- 'i486' : 'i386',
- }
-
- buildarchitecture = os.uname()[4]
- buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
+ buildarchitecture = SCons.Tool.rpmutils.defaultMachine()
if 'ARCHITECTURE' in kw:
buildarchitecture = kw['ARCHITECTURE']
@@ -138,8 +130,7 @@ def build_specfile(target, source, env):
""" Builds a RPM specfile from a dictionary with string metadata and
by analyzing a tree of nodes.
"""
- file = open(target[0].abspath, 'w')
- str = ""
+ file = open(target[0].get_abspath(), 'w')
try:
file.write( build_specfile_header(env) )
@@ -190,7 +181,7 @@ def build_specfile_sections(spec):
spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q'
if 'X_RPM_BUILD' not in spec:
- spec['X_RPM_BUILD'] = 'mkdir "$RPM_BUILD_ROOT"'
+ spec['X_RPM_BUILD'] = '[ ! -e "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && mkdir "$RPM_BUILD_ROOT"'
if 'X_RPM_INSTALL' not in spec:
spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"'
@@ -287,7 +278,9 @@ def build_specfile_filesection(spec, files):
tags = {}
for k in supported_tags.keys():
try:
- tags[k]=getattr(file, k)
+ v = file.GetTag(k)
+ if v:
+ tags[k] = v
except AttributeError:
pass
@@ -295,7 +288,7 @@ def build_specfile_filesection(spec, files):
str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )
str = str + ' '
- str = str + file.PACKAGING_INSTALL_LOCATION
+ str = str + file.GetTag('PACKAGING_INSTALL_LOCATION')
str = str + '\n\n'
return str
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_tarbz2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py
index 7ff3bed..438fc20 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_tarbz2.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py
@@ -4,7 +4,7 @@ The tarbz2 SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The tarbz2 SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_targz.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py
index a493cde..6a85869 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_targz.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py
@@ -4,7 +4,7 @@ The targz SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The targz SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py
index 0d89b36..e1a1d49 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_zip.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py
@@ -4,7 +4,7 @@ The zip SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The zip SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/tarbz2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py
index a1d6da8..79f8219 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/tarbz2.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py
@@ -4,7 +4,7 @@ The tarbz2 SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The tarbz2 SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/targz.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py
index f2a3d49..eeb3d6a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/targz.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py
@@ -4,7 +4,7 @@ The targz SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The targz SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/targz.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py
index 359de97..6c4037d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/packaging/zip.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py
@@ -4,7 +4,7 @@ The zip SRC packager.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ The zip SRC packager.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/packaging/zip.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py
index 9d8aaab..0ccb49b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdf.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py
@@ -6,7 +6,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -28,7 +28,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/pdf.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/pdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Builder
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py
index 368c795..42188f4 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/pdflatex.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Util
@@ -74,6 +74,7 @@ def generate(env):
SCons.Tool.tex.generate_common(env)
def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
return env.Detect('pdflatex')
# Local Variables:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py
index 6296f7a..e38a278 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/pdftex.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/pdftex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import SCons.Action
@@ -99,6 +99,7 @@ def generate(env):
SCons.Tool.tex.generate_common(env)
def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
return env.Detect('pdftex')
# Local Variables:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/qt.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py
index 90331aa..b8233c0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/qt.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/qt.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/qt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rmic.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py
index d35ea54..6045b7f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rmic.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/rmic.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/rmic.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -111,7 +111,13 @@ def generate(env):
env['JAVACLASSSUFFIX'] = '.class'
def exists(env):
- return env.Detect('rmic')
+ # As reported by Jan Nijtmans in issue #2730, the simple
+ # return env.Detect('rmic')
+ # doesn't always work during initialization. For now, we
+ # stop trying to detect an executable (analogous to the
+ # javac Builder).
+ # TODO: Come up with a proper detect() routine...and enable it.
+ return 1
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py
index 40b6ed0..1a3de76 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/rpcgen.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
from SCons.Builder import Builder
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py
index f5c41a1..46b3112 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/rpm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py
@@ -11,7 +11,7 @@ tar.gz consisting of the source file and a specfile.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -33,7 +33,7 @@ tar.gz consisting of the source file and a specfile.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/rpm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import re
@@ -51,11 +51,11 @@ def get_cmd(source, env):
if SCons.Util.is_List(source):
tar_file_with_included_specfile = source[0]
return "%s %s %s"%(env['RPM'], env['RPMFLAGS'],
- tar_file_with_included_specfile.abspath )
+ tar_file_with_included_specfile.get_abspath() )
def build_rpm(target, source, env):
# create a temporary rpm build root.
- tmpdir = os.path.join( os.path.dirname( target[0].abspath ), 'rpmtemp' )
+ tmpdir = os.path.join( os.path.dirname( target[0].get_abspath() ), 'rpmtemp' )
if os.path.exists(tmpdir):
shutil.rmtree(tmpdir)
@@ -79,7 +79,7 @@ def build_rpm(target, source, env):
errstr=output,
filename=str(target[0]) )
else:
- # XXX: assume that LC_ALL=c is set while running rpmbuild
+ # XXX: assume that LC_ALL=C is set while running rpmbuild
output_files = re.compile( 'Wrote: (.*)' ).findall( output )
for output, input in zip( output_files, target ):
@@ -87,7 +87,7 @@ def build_rpm(target, source, env):
expected = os.path.basename(input.get_path())
assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected)
- shutil.copy( output, input.abspath )
+ shutil.copy( output, input.get_abspath() )
# cleanup before leaving.
@@ -117,7 +117,7 @@ def generate(env):
bld = RpmBuilder
env['BUILDERS']['Rpm'] = bld
- env.SetDefault(RPM = 'LC_ALL=c rpmbuild')
+ env.SetDefault(RPM = 'LC_ALL=C rpmbuild')
env.SetDefault(RPMFLAGS = SCons.Util.CLVar('-ta'))
env.SetDefault(RPMCOM = rpmAction)
env.SetDefault(RPMSUFFIX = '.rpm')
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py
new file mode 100644
index 0000000..10b5560
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py
@@ -0,0 +1,543 @@
+"""SCons.Tool.rpmutils.py
+
+RPM specific helper routines for general usage in the test framework
+and SCons core modules.
+
+Since we check for the RPM package target name in several places,
+we have to know which machine/system name RPM will use for the current
+hardware setup. The following dictionaries and functions try to
+mimic the exact naming rules of the RPM source code.
+They were directly derived from the file "rpmrc.in" of the version
+rpm-4.9.1.3. For updating to a more recent version of RPM, this Python
+script can be used standalone. The usage() function below shows the
+exact syntax.
+
+"""
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/rpmutils.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+
+import platform
+import subprocess
+
+# Start of rpmrc dictionaries (Marker, don't change or remove!)
+os_canon = {
+ 'AIX' : ['AIX','5'],
+ 'AmigaOS' : ['AmigaOS','5'],
+ 'BSD_OS' : ['bsdi','12'],
+ 'CYGWIN32_95' : ['cygwin32','15'],
+ 'CYGWIN32_NT' : ['cygwin32','14'],
+ 'Darwin' : ['darwin','21'],
+ 'FreeBSD' : ['FreeBSD','8'],
+ 'HP-UX' : ['hpux10','6'],
+ 'IRIX' : ['Irix','2'],
+ 'IRIX64' : ['Irix64','10'],
+ 'Linux' : ['Linux','1'],
+ 'Linux/390' : ['OS/390','20'],
+ 'Linux/ESA' : ['VM/ESA','20'],
+ 'MacOSX' : ['macosx','21'],
+ 'MiNT' : ['FreeMiNT','17'],
+ 'NEXTSTEP' : ['NextStep','11'],
+ 'OS/390' : ['OS/390','18'],
+ 'OSF1' : ['osf1','7'],
+ 'SCO_SV' : ['SCO_SV3.2v5.0.2','9'],
+ 'SunOS4' : ['SunOS','4'],
+ 'SunOS5' : ['solaris','3'],
+ 'UNIX_SV' : ['MP_RAS','16'],
+ 'VM/ESA' : ['VM/ESA','19'],
+ 'machten' : ['machten','13'],
+ 'osf3.2' : ['osf1','7'],
+ 'osf4.0' : ['osf1','7'],
+}
+
+buildarch_compat = {
+ 'alpha' : ['noarch'],
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alphaev5'],
+ 'alphaev6' : ['alphapca56'],
+ 'alphaev67' : ['alphaev6'],
+ 'alphapca56' : ['alphaev56'],
+ 'amd64' : ['x86_64'],
+ 'armv3l' : ['noarch'],
+ 'armv4b' : ['noarch'],
+ 'armv4l' : ['armv3l'],
+ 'armv4tl' : ['armv4l'],
+ 'armv5tejl' : ['armv5tel'],
+ 'armv5tel' : ['armv4tl'],
+ 'armv6l' : ['armv5tejl'],
+ 'armv7l' : ['armv6l'],
+ 'atariclone' : ['m68kmint','noarch'],
+ 'atarist' : ['m68kmint','noarch'],
+ 'atariste' : ['m68kmint','noarch'],
+ 'ataritt' : ['m68kmint','noarch'],
+ 'athlon' : ['i686'],
+ 'falcon' : ['m68kmint','noarch'],
+ 'geode' : ['i586'],
+ 'hades' : ['m68kmint','noarch'],
+ 'hppa1.0' : ['parisc'],
+ 'hppa1.1' : ['hppa1.0'],
+ 'hppa1.2' : ['hppa1.1'],
+ 'hppa2.0' : ['hppa1.2'],
+ 'i386' : ['noarch','fat'],
+ 'i486' : ['i386'],
+ 'i586' : ['i486'],
+ 'i686' : ['i586'],
+ 'ia32e' : ['x86_64'],
+ 'ia64' : ['noarch'],
+ 'm68k' : ['noarch'],
+ 'milan' : ['m68kmint','noarch'],
+ 'mips' : ['noarch'],
+ 'mipsel' : ['noarch'],
+ 'parisc' : ['noarch'],
+ 'pentium3' : ['i686'],
+ 'pentium4' : ['pentium3'],
+ 'ppc' : ['noarch','fat'],
+ 'ppc32dy4' : ['noarch'],
+ 'ppc64' : ['noarch','fat'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['noarch'],
+ 'ppc8560' : ['noarch'],
+ 'ppciseries' : ['noarch'],
+ 'ppcpseries' : ['noarch'],
+ 's390' : ['noarch'],
+ 's390x' : ['noarch'],
+ 'sh3' : ['noarch'],
+ 'sh4' : ['noarch'],
+ 'sh4a' : ['sh4'],
+ 'sparc' : ['noarch'],
+ 'sparc64' : ['sparcv9v'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparcv8'],
+ 'sparcv9v' : ['sparcv9'],
+ 'sun4c' : ['noarch'],
+ 'sun4d' : ['noarch'],
+ 'sun4m' : ['noarch'],
+ 'sun4u' : ['noarch'],
+ 'x86_64' : ['noarch'],
+}
+
+os_compat = {
+ 'BSD_OS' : ['bsdi'],
+ 'Darwin' : ['MacOSX'],
+ 'FreeMiNT' : ['mint','MiNT','TOS'],
+ 'IRIX64' : ['IRIX'],
+ 'MiNT' : ['FreeMiNT','mint','TOS'],
+ 'TOS' : ['FreeMiNT','MiNT','mint'],
+ 'bsdi4.0' : ['bsdi'],
+ 'hpux10.00' : ['hpux9.07'],
+ 'hpux10.01' : ['hpux10.00'],
+ 'hpux10.10' : ['hpux10.01'],
+ 'hpux10.20' : ['hpux10.10'],
+ 'hpux10.30' : ['hpux10.20'],
+ 'hpux11.00' : ['hpux10.30'],
+ 'hpux9.05' : ['hpux9.04'],
+ 'hpux9.07' : ['hpux9.05'],
+ 'mint' : ['FreeMiNT','MiNT','TOS'],
+ 'ncr-sysv4.3' : ['ncr-sysv4.2'],
+ 'osf4.0' : ['osf3.2','osf1'],
+ 'solaris2.4' : ['solaris2.3'],
+ 'solaris2.5' : ['solaris2.3','solaris2.4'],
+ 'solaris2.6' : ['solaris2.3','solaris2.4','solaris2.5'],
+ 'solaris2.7' : ['solaris2.3','solaris2.4','solaris2.5','solaris2.6'],
+}
+
+arch_compat = {
+ 'alpha' : ['axp','noarch'],
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alphaev5'],
+ 'alphaev6' : ['alphapca56'],
+ 'alphaev67' : ['alphaev6'],
+ 'alphapca56' : ['alphaev56'],
+ 'amd64' : ['x86_64','athlon','noarch'],
+ 'armv3l' : ['noarch'],
+ 'armv4b' : ['noarch'],
+ 'armv4l' : ['armv3l'],
+ 'armv4tl' : ['armv4l'],
+ 'armv5tejl' : ['armv5tel'],
+ 'armv5tel' : ['armv4tl'],
+ 'armv6l' : ['armv5tejl'],
+ 'armv7l' : ['armv6l'],
+ 'atariclone' : ['m68kmint','noarch'],
+ 'atarist' : ['m68kmint','noarch'],
+ 'atariste' : ['m68kmint','noarch'],
+ 'ataritt' : ['m68kmint','noarch'],
+ 'athlon' : ['i686'],
+ 'falcon' : ['m68kmint','noarch'],
+ 'geode' : ['i586'],
+ 'hades' : ['m68kmint','noarch'],
+ 'hppa1.0' : ['parisc'],
+ 'hppa1.1' : ['hppa1.0'],
+ 'hppa1.2' : ['hppa1.1'],
+ 'hppa2.0' : ['hppa1.2'],
+ 'i370' : ['noarch'],
+ 'i386' : ['noarch','fat'],
+ 'i486' : ['i386'],
+ 'i586' : ['i486'],
+ 'i686' : ['i586'],
+ 'ia32e' : ['x86_64','athlon','noarch'],
+ 'ia64' : ['noarch'],
+ 'milan' : ['m68kmint','noarch'],
+ 'mips' : ['noarch'],
+ 'mipsel' : ['noarch'],
+ 'osfmach3_i386' : ['i486'],
+ 'osfmach3_i486' : ['i486','osfmach3_i386'],
+ 'osfmach3_i586' : ['i586','osfmach3_i486'],
+ 'osfmach3_i686' : ['i686','osfmach3_i586'],
+ 'osfmach3_ppc' : ['ppc'],
+ 'parisc' : ['noarch'],
+ 'pentium3' : ['i686'],
+ 'pentium4' : ['pentium3'],
+ 'powerpc' : ['ppc'],
+ 'powerppc' : ['ppc'],
+ 'ppc' : ['rs6000'],
+ 'ppc32dy4' : ['ppc'],
+ 'ppc64' : ['ppc'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['ppc'],
+ 'ppc8560' : ['ppc'],
+ 'ppciseries' : ['ppc'],
+ 'ppcpseries' : ['ppc'],
+ 'rs6000' : ['noarch','fat'],
+ 's390' : ['noarch'],
+ 's390x' : ['s390','noarch'],
+ 'sh3' : ['noarch'],
+ 'sh4' : ['noarch'],
+ 'sh4a' : ['sh4'],
+ 'sparc' : ['noarch'],
+ 'sparc64' : ['sparcv9'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparcv8'],
+ 'sparcv9v' : ['sparcv9'],
+ 'sun4c' : ['sparc'],
+ 'sun4d' : ['sparc'],
+ 'sun4m' : ['sparc'],
+ 'sun4u' : ['sparc64'],
+ 'x86_64' : ['amd64','athlon','noarch'],
+}
+
+buildarchtranslate = {
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alpha'],
+ 'alphaev6' : ['alpha'],
+ 'alphaev67' : ['alpha'],
+ 'alphapca56' : ['alpha'],
+ 'amd64' : ['x86_64'],
+ 'armv3l' : ['armv3l'],
+ 'armv4b' : ['armv4b'],
+ 'armv4l' : ['armv4l'],
+ 'armv4tl' : ['armv4tl'],
+ 'armv5tejl' : ['armv5tejl'],
+ 'armv5tel' : ['armv5tel'],
+ 'armv6l' : ['armv6l'],
+ 'armv7l' : ['armv7l'],
+ 'atariclone' : ['m68kmint'],
+ 'atarist' : ['m68kmint'],
+ 'atariste' : ['m68kmint'],
+ 'ataritt' : ['m68kmint'],
+ 'athlon' : ['i386'],
+ 'falcon' : ['m68kmint'],
+ 'geode' : ['i386'],
+ 'hades' : ['m68kmint'],
+ 'i386' : ['i386'],
+ 'i486' : ['i386'],
+ 'i586' : ['i386'],
+ 'i686' : ['i386'],
+ 'ia32e' : ['x86_64'],
+ 'ia64' : ['ia64'],
+ 'milan' : ['m68kmint'],
+ 'osfmach3_i386' : ['i386'],
+ 'osfmach3_i486' : ['i386'],
+ 'osfmach3_i586' : ['i386'],
+ 'osfmach3_i686' : ['i386'],
+ 'osfmach3_ppc' : ['ppc'],
+ 'pentium3' : ['i386'],
+ 'pentium4' : ['i386'],
+ 'powerpc' : ['ppc'],
+ 'powerppc' : ['ppc'],
+ 'ppc32dy4' : ['ppc'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['ppc'],
+ 'ppc8560' : ['ppc'],
+ 'ppciseries' : ['ppc'],
+ 'ppcpseries' : ['ppc'],
+ 's390' : ['s390'],
+ 's390x' : ['s390x'],
+ 'sh3' : ['sh3'],
+ 'sh4' : ['sh4'],
+ 'sh4a' : ['sh4'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparc'],
+ 'sparcv9v' : ['sparc'],
+ 'sun4c' : ['sparc'],
+ 'sun4d' : ['sparc'],
+ 'sun4m' : ['sparc'],
+ 'sun4u' : ['sparc64'],
+ 'x86_64' : ['x86_64'],
+}
+
+optflags = {
+ 'alpha' : ['-O2','-g','-mieee'],
+ 'alphaev5' : ['-O2','-g','-mieee','-mtune=ev5'],
+ 'alphaev56' : ['-O2','-g','-mieee','-mtune=ev56'],
+ 'alphaev6' : ['-O2','-g','-mieee','-mtune=ev6'],
+ 'alphaev67' : ['-O2','-g','-mieee','-mtune=ev67'],
+ 'alphapca56' : ['-O2','-g','-mieee','-mtune=pca56'],
+ 'amd64' : ['-O2','-g'],
+ 'armv3l' : ['-O2','-g','-march=armv3'],
+ 'armv4b' : ['-O2','-g','-march=armv4'],
+ 'armv4l' : ['-O2','-g','-march=armv4'],
+ 'armv4tl' : ['-O2','-g','-march=armv4t'],
+ 'armv5tejl' : ['-O2','-g','-march=armv5te'],
+ 'armv5tel' : ['-O2','-g','-march=armv5te'],
+ 'armv6l' : ['-O2','-g','-march=armv6'],
+ 'armv7l' : ['-O2','-g','-march=armv7'],
+ 'atariclone' : ['-O2','-g','-fomit-frame-pointer'],
+ 'atarist' : ['-O2','-g','-fomit-frame-pointer'],
+ 'atariste' : ['-O2','-g','-fomit-frame-pointer'],
+ 'ataritt' : ['-O2','-g','-fomit-frame-pointer'],
+ 'athlon' : ['-O2','-g','-march=athlon'],
+ 'falcon' : ['-O2','-g','-fomit-frame-pointer'],
+ 'fat' : ['-O2','-g','-arch','i386','-arch','ppc'],
+ 'geode' : ['-Os','-g','-m32','-march=geode'],
+ 'hades' : ['-O2','-g','-fomit-frame-pointer'],
+ 'hppa1.0' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa1.1' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa1.2' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa2.0' : ['-O2','-g','-mpa-risc-1-0'],
+ 'i386' : ['-O2','-g','-march=i386','-mtune=i686'],
+ 'i486' : ['-O2','-g','-march=i486'],
+ 'i586' : ['-O2','-g','-march=i586'],
+ 'i686' : ['-O2','-g','-march=i686'],
+ 'ia32e' : ['-O2','-g'],
+ 'ia64' : ['-O2','-g'],
+ 'm68k' : ['-O2','-g','-fomit-frame-pointer'],
+ 'milan' : ['-O2','-g','-fomit-frame-pointer'],
+ 'mips' : ['-O2','-g'],
+ 'mipsel' : ['-O2','-g'],
+ 'parisc' : ['-O2','-g','-mpa-risc-1-0'],
+ 'pentium3' : ['-O2','-g','-march=pentium3'],
+ 'pentium4' : ['-O2','-g','-march=pentium4'],
+ 'ppc' : ['-O2','-g','-fsigned-char'],
+ 'ppc32dy4' : ['-O2','-g','-fsigned-char'],
+ 'ppc64' : ['-O2','-g','-fsigned-char'],
+ 'ppc8260' : ['-O2','-g','-fsigned-char'],
+ 'ppc8560' : ['-O2','-g','-fsigned-char'],
+ 'ppciseries' : ['-O2','-g','-fsigned-char'],
+ 'ppcpseries' : ['-O2','-g','-fsigned-char'],
+ 's390' : ['-O2','-g'],
+ 's390x' : ['-O2','-g'],
+ 'sh3' : ['-O2','-g'],
+ 'sh4' : ['-O2','-g','-mieee'],
+ 'sh4a' : ['-O2','-g','-mieee'],
+ 'sparc' : ['-O2','-g','-m32','-mtune=ultrasparc'],
+ 'sparc64' : ['-O2','-g','-m64','-mtune=ultrasparc'],
+ 'sparc64v' : ['-O2','-g','-m64','-mtune=niagara'],
+ 'sparcv8' : ['-O2','-g','-m32','-mtune=ultrasparc','-mv8'],
+ 'sparcv9' : ['-O2','-g','-m32','-mtune=ultrasparc'],
+ 'sparcv9v' : ['-O2','-g','-m32','-mtune=niagara'],
+ 'x86_64' : ['-O2','-g'],
+}
+
+arch_canon = {
+ 'IP' : ['sgi','7'],
+ 'alpha' : ['alpha','2'],
+ 'alphaev5' : ['alphaev5','2'],
+ 'alphaev56' : ['alphaev56','2'],
+ 'alphaev6' : ['alphaev6','2'],
+ 'alphaev67' : ['alphaev67','2'],
+ 'alphapca56' : ['alphapca56','2'],
+ 'amd64' : ['amd64','1'],
+ 'armv3l' : ['armv3l','12'],
+ 'armv4b' : ['armv4b','12'],
+ 'armv4l' : ['armv4l','12'],
+ 'armv5tejl' : ['armv5tejl','12'],
+ 'armv5tel' : ['armv5tel','12'],
+ 'armv6l' : ['armv6l','12'],
+ 'armv7l' : ['armv7l','12'],
+ 'atariclone' : ['m68kmint','13'],
+ 'atarist' : ['m68kmint','13'],
+ 'atariste' : ['m68kmint','13'],
+ 'ataritt' : ['m68kmint','13'],
+ 'athlon' : ['athlon','1'],
+ 'falcon' : ['m68kmint','13'],
+ 'geode' : ['geode','1'],
+ 'hades' : ['m68kmint','13'],
+ 'i370' : ['i370','14'],
+ 'i386' : ['i386','1'],
+ 'i486' : ['i486','1'],
+ 'i586' : ['i586','1'],
+ 'i686' : ['i686','1'],
+ 'ia32e' : ['ia32e','1'],
+ 'ia64' : ['ia64','9'],
+ 'm68k' : ['m68k','6'],
+ 'm68kmint' : ['m68kmint','13'],
+ 'milan' : ['m68kmint','13'],
+ 'mips' : ['mips','4'],
+ 'mipsel' : ['mipsel','11'],
+ 'pentium3' : ['pentium3','1'],
+ 'pentium4' : ['pentium4','1'],
+ 'ppc' : ['ppc','5'],
+ 'ppc32dy4' : ['ppc32dy4','5'],
+ 'ppc64' : ['ppc64','16'],
+ 'ppc64iseries' : ['ppc64iseries','16'],
+ 'ppc64pseries' : ['ppc64pseries','16'],
+ 'ppc8260' : ['ppc8260','5'],
+ 'ppc8560' : ['ppc8560','5'],
+ 'ppciseries' : ['ppciseries','5'],
+ 'ppcpseries' : ['ppcpseries','5'],
+ 'rs6000' : ['rs6000','8'],
+ 's390' : ['s390','14'],
+ 's390x' : ['s390x','15'],
+ 'sh' : ['sh','17'],
+ 'sh3' : ['sh3','17'],
+ 'sh4' : ['sh4','17'],
+ 'sh4a' : ['sh4a','17'],
+ 'sparc' : ['sparc','3'],
+ 'sparc64' : ['sparc64','2'],
+ 'sparc64v' : ['sparc64v','2'],
+ 'sparcv8' : ['sparcv8','3'],
+ 'sparcv9' : ['sparcv9','3'],
+ 'sparcv9v' : ['sparcv9v','3'],
+ 'sun4' : ['sparc','3'],
+ 'sun4c' : ['sparc','3'],
+ 'sun4d' : ['sparc','3'],
+ 'sun4m' : ['sparc','3'],
+ 'sun4u' : ['sparc64','2'],
+ 'x86_64' : ['x86_64','1'],
+ 'xtensa' : ['xtensa','18'],
+}
+
+# End of rpmrc dictionaries (Marker, don't change or remove!)
+
+def defaultMachine(use_rpm_default=True):
+ """ Return the canonicalized machine name. """
+
+ if use_rpm_default:
+ try:
+ # This should be the most reliable way to get the default arch
+ rmachine = subprocess.check_output(['rpm', '--eval=%_target_cpu'], shell=False).rstrip()
+ except Exception as e:
+ # Something went wrong, try again by looking up platform.machine()
+ return defaultMachine(False)
+ else:
+ rmachine = platform.machine()
+
+ # Try to lookup the string in the canon table
+ if rmachine in arch_canon:
+ rmachine = arch_canon[rmachine][0]
+
+ return rmachine
+
+def defaultSystem():
+ """ Return the canonicalized system name. """
+ rsystem = platform.system()
+
+ # Try to lookup the string in the canon tables
+ if rsystem in os_canon:
+ rsystem = os_canon[rsystem][0]
+
+ return rsystem
+
+def defaultNames():
+ """ Return the canonicalized machine and system name. """
+ return defaultMachine(), defaultSystem()
+
+def updateRpmDicts(rpmrc, pyfile):
+ """ Read the given rpmrc file with RPM definitions and update the
+ info dictionaries in the file pyfile with it.
+ The arguments will usually be 'rpmrc.in' from a recent RPM source
+ tree, and 'rpmutils.py' referring to this script itself.
+ See also usage() below.
+ """
+ try:
+ # Read old rpmutils.py file
+ oldpy = open(pyfile,"r").readlines()
+ # Read current rpmrc.in file
+ rpm = open(rpmrc,"r").readlines()
+ # Parse for data
+ data = {}
+ # Allowed section names that get parsed
+ sections = ['optflags',
+ 'arch_canon',
+ 'os_canon',
+ 'buildarchtranslate',
+ 'arch_compat',
+ 'os_compat',
+ 'buildarch_compat']
+ for l in rpm:
+ l = l.rstrip('\n').replace(':',' ')
+ # Skip comments
+ if l.lstrip().startswith('#'):
+ continue
+ tokens = l.strip().split()
+ if len(tokens):
+ key = tokens[0]
+ if key in sections:
+ # Have we met this section before?
+ if not data.has_key(tokens[0]):
+ # No, so insert it
+ data[key] = {}
+ # Insert data
+ data[key][tokens[1]] = tokens[2:]
+ # Write new rpmutils.py file
+ out = open(pyfile,"w")
+ pm = 0
+ for l in oldpy:
+ if pm:
+ if l.startswith('# End of rpmrc dictionaries'):
+ pm = 0
+ out.write(l)
+ else:
+ out.write(l)
+ if l.startswith('# Start of rpmrc dictionaries'):
+ pm = 1
+ # Write data sections to single dictionaries
+ for key, entries in data.iteritems():
+ out.write("%s = {\n" % key)
+ for arch in sorted(entries.keys()):
+ out.write(" '%s' : ['%s'],\n" % (arch, "','".join(entries[arch])))
+ out.write("}\n\n")
+ out.close()
+ except:
+ pass
+
+def usage():
+ print "rpmutils.py rpmrc.in rpmutils.py"
+
+def main():
+ import sys
+
+ if len(sys.argv) < 3:
+ usage()
+ sys.exit(0)
+ updateRpmDicts(sys.argv[1], sys.argv[2])
+
+if __name__ == "__main__":
+ main()
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgiar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py
index aa5d451..6be4c65 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgiar.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py
@@ -11,7 +11,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -33,7 +33,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sgiar.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sgiar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgic++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py
index ae6460a..8ae115a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgic++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sgic++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sgic++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgicc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py
index 08f42fa..ec26bf1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgicc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sgicc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sgicc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import cc
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgilink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py
index 0f1060f..828f6d0 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sgilink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sgilink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sgilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
@@ -48,7 +48,6 @@ def generate(env):
# __RPATH is set to $_RPATH in the platform specification if that
# platform supports it.
- env.Append(LINKFLAGS=['$__RPATH'])
env['RPATHPREFIX'] = '-rpath '
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py
index 0fe3820..9c3e481 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunar.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunar.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Defaults
import SCons.Tool
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py
index 14ae59f..75fe435 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunc++.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunc++.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/suncc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py
index 4848766..b543b95 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/suncc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/suncc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/suncc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py
index 34dea3e..bff5c1a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf77.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunf77.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf90.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py
index 74a3856..b0e31d1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf90.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunf90.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunf90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf95.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py
index e825f61..5263f5a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunf95.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunf95.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunf95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Util
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunlink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py
index 5af2256..d8a941f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/sunlink.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/sunlink.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/sunlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import os.path
@@ -62,7 +62,6 @@ def generate(env):
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
- env.Append(LINKFLAGS=['$__RPATH'])
env['RPATHPREFIX'] = '-R'
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/swig.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py
index 85aab70..83cd315 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/swig.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/swig.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/swig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
@@ -42,6 +42,7 @@ import SCons.Defaults
import SCons.Scanner
import SCons.Tool
import SCons.Util
+import SCons.Node
SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR')
@@ -53,7 +54,8 @@ def swigSuffixEmitter(env, source):
# Match '%module test', as well as '%module(directors="1") test'
# Also allow for test to be quoted (SWIG permits double quotes, but not single)
-_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(.+)\2')
+# Also allow for the line to have spaces after test if not quoted
+_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(\S+)\2')
def _find_modules(src):
"""Find all modules referenced by %module lines in `src`, a SWIG .i file.
@@ -65,9 +67,9 @@ def _find_modules(src):
try:
matches = _reModule.findall(open(src).read())
except IOError:
- # If the file's not yet generated, guess the module name from the filename
+ # If the file's not yet generated, guess the module name from the file stem
matches = []
- mnames.append(os.path.splitext(src)[0])
+ mnames.append(os.path.splitext(os.path.basename(src))[0])
for m in matches:
mnames.append(m[2])
@@ -116,9 +118,13 @@ def _swigEmitter(target, source, env):
if outdir:
java_files = [os.path.join(outdir, j) for j in java_files]
java_files = list(map(env.fs.File, java_files))
+ def t_from_s(t, p, s, x):
+ return t.dir
+ tsm = SCons.Node._target_from_source_map
+ tkey = len(tsm)
+ tsm[tkey] = t_from_s
for jf in java_files:
- t_from_s = lambda t, p, s, x: t.dir
- SCons.Util.AddMethod(jf, t_from_s, 'target_from_source')
+ jf._func_target_from_source = tkey
target.extend(java_files)
return (target, source)
@@ -173,7 +179,8 @@ def generate(env):
env.Append(SCANNERS = scanner)
def exists(env):
- return env.Detect(['swig'])
+ swig = env.get('SWIG') or env.Detect(['swig'])
+ return swig
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py
index 0005ef7..50afeae 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tar.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/tar.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/tar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Action
import SCons.Builder
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py
index b4b2819..9dd462e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tex.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py
@@ -10,7 +10,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,12 +32,14 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/tex.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/tex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import re
import shutil
import sys
+import platform
+import glob
import SCons.Action
import SCons.Node
@@ -53,14 +55,18 @@ must_rerun_latex = True
check_suffixes = ['.toc', '.lof', '.lot', '.out', '.nav', '.snm']
# these are files that require bibtex or makeindex to be run when they change
-all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo', '.acn']
+all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo', '.acn', '.bcf']
#
# regular expressions used to search for Latex features
# or outputs that require rerunning latex
#
# search for all .aux files opened by latex (recorded in the .fls file)
-openout_aux_re = re.compile(r"INPUT *(.*\.aux)")
+openout_aux_re = re.compile(r"OUTPUT *(.*\.aux)")
+
+# search for all .bcf files opened by latex (recorded in the .fls file)
+# for use by biber
+openout_bcf_re = re.compile(r"OUTPUT *(.*\.bcf)")
#printindex_re = re.compile(r"^[^%]*\\printindex", re.MULTILINE)
#printnomenclature_re = re.compile(r"^[^%]*\\printnomenclature", re.MULTILINE)
@@ -83,6 +89,9 @@ auxfile_re = re.compile(r".", re.MULTILINE)
tableofcontents_re = re.compile(r"^[^%\n]*\\tableofcontents", re.MULTILINE)
makeindex_re = re.compile(r"^[^%\n]*\\makeindex", re.MULTILINE)
bibliography_re = re.compile(r"^[^%\n]*\\bibliography", re.MULTILINE)
+bibunit_re = re.compile(r"^[^%\n]*\\begin\{bibunit\}", re.MULTILINE)
+multibib_re = re.compile(r"^[^%\n]*\\newcites\{([^\}]*)\}", re.MULTILINE)
+addbibresource_re = re.compile(r"^[^%\n]*\\(addbibresource|addglobalbib|addsectionbib)", re.MULTILINE)
listoffigures_re = re.compile(r"^[^%\n]*\\listoffigures", re.MULTILINE)
listoftables_re = re.compile(r"^[^%\n]*\\listoftables", re.MULTILINE)
hyperref_re = re.compile(r"^[^%\n]*\\usepackage.*\{hyperref\}", re.MULTILINE)
@@ -91,6 +100,11 @@ makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE)
makeglossaries_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
makeacronyms_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE)
+regex = r'^[^%\n]*\\newglossary\s*\[([^\]]+)\]?\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}'
+newglossary_re = re.compile(regex, re.MULTILINE)
+biblatex_re = re.compile(r"^[^%\n]*\\usepackage.*\{biblatex\}", re.MULTILINE)
+
+newglossary_suffix = []
# search to find all files included by Latex
include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE)
@@ -116,6 +130,9 @@ LaTeXAction = None
# An action to run BibTeX on a file.
BibTeXAction = None
+# An action to run Biber on a file.
+BiberAction = None
+
# An action to run MakeIndex on a file.
MakeIndexAction = None
@@ -128,6 +145,9 @@ MakeGlossaryAction = None
# An action to run MakeIndex (for acronyms) on a file.
MakeAcronymsAction = None
+# An action to run MakeIndex (for newglossary commands) on a file.
+MakeNewGlossaryAction = None
+
# Used as a return value of modify_env_var if the variable is not set.
_null = SCons.Scanner.LaTeX._null
@@ -150,7 +170,7 @@ def FindFile(name,suffixes,paths,env,requireExt=False):
testName = os.path.join(path,name)
if Verbose:
print " look for '%s'" % testName
- if os.path.exists(testName):
+ if os.path.isfile(testName):
if Verbose:
print " found '%s'" % testName
return env.fs.File(testName)
@@ -165,7 +185,7 @@ def FindFile(name,suffixes,paths,env,requireExt=False):
if Verbose:
print " look for '%s'" % testNameExt
- if os.path.exists(testNameExt):
+ if os.path.isfile(testNameExt):
if Verbose:
print " found '%s'" % testNameExt
return env.fs.File(testNameExt)
@@ -212,18 +232,19 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
# if there is a \makeindex there will be a .idx and thus
# we have to run makeindex at least once to keep the build
# happy even if there is no index.
- # Same for glossaries and nomenclature
+ # Same for glossaries, nomenclature, and acronyms
src_content = source[0].get_text_contents()
- run_makeindex = makeindex_re.search(src_content) and not os.path.exists(targetbase + '.idx')
- run_nomenclature = makenomenclature_re.search(src_content) and not os.path.exists(targetbase + '.nlo')
- run_glossary = makeglossary_re.search(src_content) and not os.path.exists(targetbase + '.glo')
- run_glossaries = makeglossaries_re.search(src_content) and not os.path.exists(targetbase + '.glo')
- run_acronyms = makeacronyms_re.search(src_content) and not os.path.exists(targetbase + '.acn')
+ run_makeindex = makeindex_re.search(src_content) and not os.path.isfile(targetbase + '.idx')
+ run_nomenclature = makenomenclature_re.search(src_content) and not os.path.isfile(targetbase + '.nlo')
+ run_glossary = makeglossary_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
+ run_glossaries = makeglossaries_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
+ run_acronyms = makeacronyms_re.search(src_content) and not os.path.isfile(targetbase + '.acn')
saved_hashes = {}
suffix_nodes = {}
- for suffix in all_suffixes:
+
+ for suffix in all_suffixes+sum(newglossary_suffix, []):
theNode = env.fs.File(targetbase + suffix)
suffix_nodes[suffix] = theNode
saved_hashes[suffix] = theNode.get_csig()
@@ -233,6 +254,9 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
must_rerun_latex = True
+ # .aux files already processed by BibTex
+ already_bibtexed = []
+
#
# routine to update MD5 hash and compare
#
@@ -271,7 +295,7 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
# Read the log file to find warnings/errors
logfilename = targetbase + '.log'
logContent = ''
- if os.path.exists(logfilename):
+ if os.path.isfile(logfilename):
logContent = open(logfilename, "rb").read()
@@ -279,32 +303,72 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
flsfilename = targetbase + '.fls'
flsContent = ''
auxfiles = []
- if os.path.exists(flsfilename):
+ if os.path.isfile(flsfilename):
flsContent = open(flsfilename, "rb").read()
auxfiles = openout_aux_re.findall(flsContent)
+ # remove duplicates
+ dups = {}
+ for x in auxfiles:
+ dups[x] = 1
+ auxfiles = list(dups.keys())
+
+ bcffiles = []
+ if os.path.isfile(flsfilename):
+ flsContent = open(flsfilename, "rb").read()
+ bcffiles = openout_bcf_re.findall(flsContent)
+ # remove duplicates
+ dups = {}
+ for x in bcffiles:
+ dups[x] = 1
+ bcffiles = list(dups.keys())
+
if Verbose:
print "auxfiles ",auxfiles
+ print "bcffiles ",bcffiles
# Now decide if bibtex will need to be run.
# The information that bibtex reads from the .aux file is
# pass-independent. If we find (below) that the .bbl file is unchanged,
# then the last latex saw a correct bibliography.
- # Therefore only do this on the first pass
- if count == 1:
- for auxfilename in auxfiles:
+ # Therefore only do this once
+ # Go through all .aux files and remember the files already done.
+ for auxfilename in auxfiles:
+ if auxfilename not in already_bibtexed:
+ already_bibtexed.append(auxfilename)
target_aux = os.path.join(targetdir, auxfilename)
- if os.path.exists(target_aux):
+ if os.path.isfile(target_aux):
content = open(target_aux, "rb").read()
if content.find("bibdata") != -1:
if Verbose:
- print "Need to run bibtex"
- bibfile = env.fs.File(targetbase)
+ print "Need to run bibtex on ",auxfilename
+ bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])
result = BibTeXAction(bibfile, bibfile, env)
if result != 0:
check_file_error_message(env['BIBTEX'], 'blg')
- return result
- must_rerun_latex = check_MD5(suffix_nodes['.bbl'],'.bbl')
- break
+ must_rerun_latex = True
+
+ # Now decide if biber will need to be run.
+ # When the backend for biblatex is biber (by choice or default) the
+ # citation information is put in the .bcf file.
+ # The information that biber reads from the .bcf file is
+ # pass-independent. If we find (below) that the .bbl file is unchanged,
+ # then the last latex saw a correct bibliography.
+ # Therefore only do this once
+ # Go through all .bcf files and remember the files already done.
+ for bcffilename in bcffiles:
+ if bcffilename not in already_bibtexed:
+ already_bibtexed.append(bcffilename)
+ target_bcf = os.path.join(targetdir, bcffilename)
+ if os.path.isfile(target_bcf):
+ content = open(target_bcf, "rb").read()
+ if content.find("bibdata") != -1:
+ if Verbose:
+ print "Need to run biber on ",bcffilename
+ bibfile = env.fs.File(SCons.Util.splitext(target_bcf)[0])
+ result = BiberAction(bibfile, bibfile, env)
+ if result != 0:
+ check_file_error_message(env['BIBER'], 'blg')
+ must_rerun_latex = True
# Now decide if latex will need to be run again due to index.
if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):
@@ -360,6 +424,21 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
'alg')
return result
+ # Now decide if latex will need to be run again due to newglossary command.
+ for ig in range(len(newglossary_suffix)):
+ if check_MD5(suffix_nodes[newglossary_suffix[ig][2]],newglossary_suffix[ig][2]) or (count == 1):
+ # We must run makeindex
+ if Verbose:
+ print "Need to run makeindex for newglossary"
+ newglfile = suffix_nodes[newglossary_suffix[ig][2]]
+ MakeNewGlossaryAction = SCons.Action.Action("$MAKENEWGLOSSARYCOM ${SOURCE.filebase}%s -s ${SOURCE.filebase}.ist -t ${SOURCE.filebase}%s -o ${SOURCE.filebase}%s" % (newglossary_suffix[ig][2],newglossary_suffix[ig][0],newglossary_suffix[ig][1]), "$MAKENEWGLOSSARYCOMSTR")
+
+ result = MakeNewGlossaryAction(newglfile, newglfile, env)
+ if result != 0:
+ check_file_error_message('%s (newglossary)' % env['MAKENEWGLOSSARY'],
+ newglossary_suffix[ig][0])
+ return result
+
# Now decide if latex needs to be run yet again to resolve warnings.
if warning_rerun_re.search(logContent):
must_rerun_latex = True
@@ -381,8 +460,8 @@ def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None
# end of while loop
# rename Latex's output to what the target name is
- if not (str(target[0]) == resultfilename and os.path.exists(resultfilename)):
- if os.path.exists(resultfilename):
+ if not (str(target[0]) == resultfilename and os.path.isfile(resultfilename)):
+ if os.path.isfile(resultfilename):
print "move %s to %s" % (resultfilename, str(target[0]), )
shutil.move(resultfilename,str(target[0]))
@@ -545,7 +624,23 @@ def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphi
for i in range(len(file_tests_search)):
if file_tests[i][0] is None:
+ if Verbose:
+ print "scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1]
file_tests[i][0] = file_tests_search[i].search(content)
+ if Verbose and file_tests[i][0]:
+ print " found match for ",file_tests[i][1][-1]
+ # for newglossary insert the suffixes in file_tests[i]
+ if file_tests[i][0] and file_tests[i][1][-1] == 'newglossary':
+ findresult = file_tests_search[i].findall(content)
+ for l in range(len(findresult)) :
+ (file_tests[i][1]).insert(0,'.'+findresult[l][3])
+ (file_tests[i][1]).insert(0,'.'+findresult[l][2])
+ (file_tests[i][1]).insert(0,'.'+findresult[l][0])
+ suffix_list = ['.'+findresult[l][0],'.'+findresult[l][2],'.'+findresult[l][3] ]
+ newglossary_suffix.append(suffix_list)
+ if Verbose:
+ print " new suffixes for newglossary ",newglossary_suffix
+
incResult = includeOnly_re.search(content)
if incResult:
@@ -582,7 +677,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):
basedir = os.path.split(str(source[0]))[0]
abspath = os.path.abspath(basedir)
target[0].attributes.path = abspath
-
+
#
# file names we will make use of in searching the sources and log file
#
@@ -590,28 +685,35 @@ def tex_emitter_core(target, source, env, graphics_extensions):
auxfilename = targetbase + '.aux'
logfilename = targetbase + '.log'
flsfilename = targetbase + '.fls'
+ syncfilename = targetbase + '.synctex.gz'
env.SideEffect(auxfilename,target[0])
env.SideEffect(logfilename,target[0])
env.SideEffect(flsfilename,target[0])
+ env.SideEffect(syncfilename,target[0])
if Verbose:
- print "side effect :",auxfilename,logfilename,flsfilename
+ print "side effect :",auxfilename,logfilename,flsfilename,syncfilename
env.Clean(target[0],auxfilename)
env.Clean(target[0],logfilename)
env.Clean(target[0],flsfilename)
+ env.Clean(target[0],syncfilename)
content = source[0].get_text_contents()
- idx_exists = os.path.exists(targetbase + '.idx')
- nlo_exists = os.path.exists(targetbase + '.nlo')
- glo_exists = os.path.exists(targetbase + '.glo')
- acr_exists = os.path.exists(targetbase + '.acn')
+ # These variables are no longer used.
+ #idx_exists = os.path.isfile(targetbase + '.idx')
+ #nlo_exists = os.path.isfile(targetbase + '.nlo')
+ #glo_exists = os.path.isfile(targetbase + '.glo')
+ #acr_exists = os.path.isfile(targetbase + '.acn')
# set up list with the regular expressions
# we use to find features used
file_tests_search = [auxfile_re,
makeindex_re,
bibliography_re,
+ bibunit_re,
+ multibib_re,
+ addbibresource_re,
tableofcontents_re,
listoffigures_re,
listoftables_re,
@@ -620,21 +722,29 @@ def tex_emitter_core(target, source, env, graphics_extensions):
makeglossary_re,
makeglossaries_re,
makeacronyms_re,
- beamer_re ]
+ beamer_re,
+ newglossary_re,
+ biblatex_re ]
# set up list with the file suffixes that need emitting
# when a feature is found
- file_tests_suff = [['.aux'],
- ['.idx', '.ind', '.ilg'],
- ['.bbl', '.blg'],
- ['.toc'],
- ['.lof'],
- ['.lot'],
- ['.out'],
- ['.nlo', '.nls', '.nlg'],
- ['.glo', '.gls', '.glg'],
- ['.glo', '.gls', '.glg'],
- ['.acn', '.acr', '.alg'],
- ['.nav', '.snm', '.out', '.toc'] ]
+ file_tests_suff = [['.aux','aux_file'],
+ ['.idx', '.ind', '.ilg','makeindex'],
+ ['.bbl', '.blg','bibliography'],
+ ['.bbl', '.blg','bibunit'],
+ ['.bbl', '.blg','multibib'],
+ ['.bbl', '.blg','.bcf','addbibresource'],
+ ['.toc','contents'],
+ ['.lof','figures'],
+ ['.lot','tables'],
+ ['.out','hyperref'],
+ ['.nlo', '.nls', '.nlg','nomenclature'],
+ ['.glo', '.gls', '.glg','glossary'],
+ ['.glo', '.gls', '.glg','glossaries'],
+ ['.acn', '.acr', '.alg','acronyms'],
+ ['.nav', '.snm', '.out', '.toc','beamer'],
+ ['newglossary',],
+ ['.bcf', '.blg','biblatex'] ]
+ # for newglossary the suffixes are added as we find the command
# build the list of lists
file_tests = []
for i in range(len(file_tests_search)):
@@ -663,26 +773,51 @@ def tex_emitter_core(target, source, env, graphics_extensions):
if Verbose:
print "search path ",paths
+ # scan all sources for side effect files
aux_files = []
file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
for (theSearch,suffix_list) in file_tests:
- if theSearch:
- for suffix in suffix_list:
- env.SideEffect(targetbase + suffix,target[0])
- if Verbose:
- print "side effect :",targetbase + suffix
- env.Clean(target[0],targetbase + suffix)
+ # add side effects if feature is present.If file is to be generated,add all side effects
+ if Verbose and theSearch:
+ print "check side effects for ",suffix_list[-1]
+ if (theSearch != None) or (not source[0].exists() ):
+ file_list = [targetbase,]
+ # for bibunit we need a list of files
+ if suffix_list[-1] == 'bibunit':
+ file_basename = os.path.join(targetdir, 'bu*.aux')
+ file_list = glob.glob(file_basename)
+ # remove the suffix '.aux'
+ for i in range(len(file_list)):
+ file_list.append(SCons.Util.splitext(file_list[i])[0])
+ # for multibib we need a list of files
+ if suffix_list[-1] == 'multibib':
+ for multibibmatch in multibib_re.finditer(content):
+ if Verbose:
+ print "multibib match ",multibibmatch.group(1)
+ if multibibmatch != None:
+ baselist = multibibmatch.group(1).split(',')
+ if Verbose:
+ print "multibib list ", baselist
+ for i in range(len(baselist)):
+ file_list.append(os.path.join(targetdir, baselist[i]))
+ # now define the side effects
+ for file_name in file_list:
+ for suffix in suffix_list[:-1]:
+ env.SideEffect(file_name + suffix,target[0])
+ if Verbose:
+ print "side effect tst :",file_name + suffix, " target is ",str(target[0])
+ env.Clean(target[0],file_name + suffix)
for aFile in aux_files:
aFile_base = SCons.Util.splitext(aFile)[0]
env.SideEffect(aFile_base + '.aux',target[0])
if Verbose:
- print "side effect :",aFile_base + '.aux'
+ print "side effect aux :",aFile_base + '.aux'
env.Clean(target[0],aFile_base + '.aux')
# read fls file to get all other files that latex creates and will read on the next pass
# remove files from list that we explicitly dealt with above
- if os.path.exists(flsfilename):
+ if os.path.isfile(flsfilename):
content = open(flsfilename, "rb").read()
out_files = openout_re.findall(content)
myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']
@@ -691,7 +826,7 @@ def tex_emitter_core(target, source, env, graphics_extensions):
out_files.remove(filename)
env.SideEffect(out_files,target[0])
if Verbose:
- print "side effect :",out_files
+ print "side effect fls :",out_files
env.Clean(target[0],out_files)
return (target, source)
@@ -718,9 +853,28 @@ def generate(env):
bld.add_action('.tex', TeXLaTeXAction)
bld.add_emitter('.tex', tex_eps_emitter)
+def generate_darwin(env):
+ try:
+ environ = env['ENV']
+ except KeyError:
+ environ = {}
+ env['ENV'] = environ
+
+ if (platform.system() == 'Darwin'):
+ try:
+ ospath = env['ENV']['PATHOSX']
+ except:
+ ospath = None
+ if ospath:
+ env.AppendENVPath('PATH', ospath)
+
def generate_common(env):
"""Add internal Builders and construction variables for LaTeX to an Environment."""
+ # Add OSX system paths so TeX tools can be found
+ # when a list of tools is given the exists() method is not called
+ generate_darwin(env)
+
# A generic tex file Action, sufficient for all tex files.
global TeXAction
if TeXAction is None:
@@ -737,6 +891,11 @@ def generate_common(env):
if BibTeXAction is None:
BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR")
+ # Define an action to run Biber on a file.
+ global BiberAction
+ if BiberAction is None:
+ BiberAction = SCons.Action.Action("$BIBERCOM", "$BIBERCOMSTR")
+
# Define an action to run MakeIndex on a file.
global MakeIndexAction
if MakeIndexAction is None:
@@ -757,47 +916,73 @@ def generate_common(env):
if MakeAcronymsAction is None:
MakeAcronymsAction = SCons.Action.Action("$MAKEACRONYMSCOM", "$MAKEACRONYMSCOMSTR")
+ try:
+ environ = env['ENV']
+ except KeyError:
+ environ = {}
+ env['ENV'] = environ
+
+ # Some Linux platforms have pdflatex set up in a way
+ # that requires that the HOME environment variable be set.
+ # Add it here if defined.
+ v = os.environ.get('HOME')
+ if v:
+ environ['HOME'] = v
+
+ CDCOM = 'cd '
+ if platform.system() == 'Windows':
+ # allow cd command to change drives on Windows
+ CDCOM = 'cd /D '
+
env['TEX'] = 'tex'
env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['TEXCOM'] = 'cd ${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
+ env['TEXCOM'] = CDCOM + '${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
env['PDFTEX'] = 'pdftex'
env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['PDFTEXCOM'] = 'cd ${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
+ env['PDFTEXCOM'] = CDCOM + '${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
env['LATEX'] = 'latex'
env['LATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['LATEXCOM'] = 'cd ${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
- env['LATEXRETRIES'] = 3
+ env['LATEXCOM'] = CDCOM + '${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
+ env['LATEXRETRIES'] = 4
env['PDFLATEX'] = 'pdflatex'
env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['PDFLATEXCOM'] = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
+ env['PDFLATEXCOM'] = CDCOM + '${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
env['BIBTEX'] = 'bibtex'
env['BIBTEXFLAGS'] = SCons.Util.CLVar('')
- env['BIBTEXCOM'] = 'cd ${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}'
+ env['BIBTEXCOM'] = CDCOM + '${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}'
+
+ env['BIBER'] = 'biber'
+ env['BIBERFLAGS'] = SCons.Util.CLVar('')
+ env['BIBERCOM'] = CDCOM + '${TARGET.dir} && $BIBER $BIBERFLAGS ${SOURCE.filebase}'
env['MAKEINDEX'] = 'makeindex'
env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('')
- env['MAKEINDEXCOM'] = 'cd ${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}'
+ env['MAKEINDEXCOM'] = CDCOM + '${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}'
env['MAKEGLOSSARY'] = 'makeindex'
env['MAKEGLOSSARYSTYLE'] = '${SOURCE.filebase}.ist'
env['MAKEGLOSSARYFLAGS'] = SCons.Util.CLVar('-s ${MAKEGLOSSARYSTYLE} -t ${SOURCE.filebase}.glg')
- env['MAKEGLOSSARYCOM'] = 'cd ${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls'
+ env['MAKEGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls'
env['MAKEACRONYMS'] = 'makeindex'
env['MAKEACRONYMSSTYLE'] = '${SOURCE.filebase}.ist'
env['MAKEACRONYMSFLAGS'] = SCons.Util.CLVar('-s ${MAKEACRONYMSSTYLE} -t ${SOURCE.filebase}.alg')
- env['MAKEACRONYMSCOM'] = 'cd ${TARGET.dir} && $MAKEACRONYMS ${SOURCE.filebase}.acn $MAKEACRONYMSFLAGS -o ${SOURCE.filebase}.acr'
+ env['MAKEACRONYMSCOM'] = CDCOM + '${TARGET.dir} && $MAKEACRONYMS ${SOURCE.filebase}.acn $MAKEACRONYMSFLAGS -o ${SOURCE.filebase}.acr'
env['MAKENCL'] = 'makeindex'
env['MAKENCLSTYLE'] = 'nomencl.ist'
env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg'
- env['MAKENCLCOM'] = 'cd ${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls'
+ env['MAKENCLCOM'] = CDCOM + '${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls'
+
+ env['MAKENEWGLOSSARY'] = 'makeindex'
+ env['MAKENEWGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKENEWGLOSSARY '
def exists(env):
+ generate_darwin(env)
return env.Detect('tex')
# Local Variables:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/textfile.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py
index 0293bb9..9c2b3a1 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/textfile.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py
@@ -1,6 +1,6 @@
# -*- python -*-
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -44,7 +44,7 @@ Textfile/Substfile builder for SCons.
is unpredictible whether the expansion will occur.
"""
-__revision__ = "src/engine/SCons/Tool/textfile.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/textfile.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tlib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py
index 6344e71..9040439 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/tlib.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py
@@ -5,7 +5,7 @@ XXX
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ XXX
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/tlib.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/tlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Tool
import SCons.Tool.bcc32
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/wix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py
index 1a95e22..1291f18 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/wix.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py
@@ -8,7 +8,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/wix.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/wix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import SCons.Builder
import SCons.Action
@@ -47,15 +47,17 @@ def generate(env):
env['WIXLIGHTFLAGS'].append( '-nologo' )
env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}"
+ env['WIXSRCSUF'] = '.wxs'
+ env['WIXOBJSUF'] = '.wixobj'
object_builder = SCons.Builder.Builder(
action = '$WIXCANDLECOM',
- suffix = '.wxiobj',
- src_suffix = '.wxs')
+ suffix = '$WIXOBJSUF',
+ src_suffix = '$WIXSRCSUF')
linker_builder = SCons.Builder.Builder(
action = '$WIXLIGHTCOM',
- src_suffix = '.wxiobj',
+ src_suffix = '$WIXOBJSUF',
src_builder = object_builder)
env['BUILDERS']['WiX'] = linker_builder
@@ -66,7 +68,6 @@ def exists(env):
# try to find the candle.exe and light.exe tools and
# add the install directory to light libpath.
- #for path in os.environ['PATH'].split(os.pathsep):
for path in os.environ['PATH'].split(os.pathsep):
if not path:
continue
@@ -80,13 +81,17 @@ def exists(env):
# search for the tools in the PATH environment variable
try:
- if env['WIXCANDLE'] in os.listdir(path) and\
- env['WIXLIGHT'] in os.listdir(path):
- env.PrependENVPath('PATH', path)
- env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ),
- '-loc',
- os.path.join( path, 'WixUI_en-us.wxl' ) ]
- return 1
+ files = os.listdir(path)
+ if env['WIXCANDLE'] in files and env['WIXLIGHT'] in files:
+ env.PrependENVPath('PATH', path)
+ # include appropriate flags if running WiX 2.0
+ if 'wixui.wixlib' in files and 'WixUI_en-us.wxl' in files:
+ env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ),
+ '-loc',
+ os.path.join( path, 'WixUI_en-us.wxl' ) ]
+ else:
+ env['WIXLIGHTFLAGS'] = []
+ return 1
except OSError:
pass # ignore this, could be a stale PATH entry.
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py
new file mode 100644
index 0000000..ed6245d
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py
@@ -0,0 +1,339 @@
+""" xgettext tool
+
+Tool specific initialization of `xgettext` tool.
+"""
+
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "src/engine/SCons/Tool/xgettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+#############################################################################
+class _CmdRunner(object):
+ """ Callabe object, which runs shell command storing its stdout and stderr to
+ variables. It also provides `strfunction()` method, which shall be used by
+ scons Action objects to print command string. """
+
+ def __init__( self, command, commandstr = None):
+ self.out = None
+ self.err = None
+ self.status = None
+ self.command = command
+ self.commandstr = commandstr
+
+ def __call__(self, target, source, env):
+ import SCons.Action
+ import subprocess
+ import os
+ import sys
+ kw = {
+ 'stdin' : 'devnull',
+ 'stdout' : subprocess.PIPE,
+ 'stderr' : subprocess.PIPE,
+ 'universal_newlines' : True,
+ 'shell' : True
+ }
+ command = env.subst(self.command, target = target, source = source)
+ proc = SCons.Action._subproc(env, command, **kw)
+ self.out, self.err = proc.communicate()
+ self.status = proc.wait()
+ if self.err: sys.stderr.write(unicode(self.err))
+ return self.status
+
+ def strfunction(self, target, source, env):
+ import os
+ comstr = self.commandstr
+ if env.subst(comstr, target = target, source = source) == "":
+ comstr = self.command
+ s = env.subst(comstr, target = target, source = source)
+ return s
+#############################################################################
+
+#############################################################################
+def _update_pot_file(target, source, env):
+ """ Action function for `POTUpdate` builder """
+ import re
+ import os
+ import SCons.Action
+ nop = lambda target, source, env : 0
+
+ # Save scons cwd and os cwd (NOTE: they may be different. After the job, we
+ # revert ech one to its original state).
+ save_cwd = env.fs.getcwd()
+ save_os_cwd = os.getcwd()
+ chdir = target[0].dir
+ chdir_str = repr(chdir.get_abspath())
+ # Print chdir message (employ SCons.Action.Action for that. It knows better
+ # than me how to to this correctly).
+ env.Execute(SCons.Action.Action(nop, "Entering " + chdir_str))
+ # Go to target's directory and do our job
+ env.fs.chdir(chdir, 1) # Go into target's directory
+ try:
+ cmd = _CmdRunner('$XGETTEXTCOM', '$XGETTEXTCOMSTR')
+ action = SCons.Action.Action(cmd, strfunction=cmd.strfunction)
+ status = action([ target[0] ], source, env)
+ except:
+ # Something went wrong.
+ env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
+ # Revert working dirs to previous state and re-throw exception.
+ env.fs.chdir(save_cwd, 0)
+ os.chdir(save_os_cwd)
+ raise
+ # Print chdir message.
+ env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
+ # Revert working dirs to previous state.
+ env.fs.chdir(save_cwd, 0)
+ os.chdir(save_os_cwd)
+ # If the command was not successfull, return error code.
+ if status: return status
+
+ new_content = cmd.out
+
+ if not new_content:
+ # When xgettext finds no internationalized messages, no *.pot is created
+ # (because we don't want to bother translators with empty POT files).
+ needs_update = False
+ explain = "no internationalized messages encountered"
+ else:
+ if target[0].exists():
+ # If the file already exists, it's left unaltered unless its messages
+ # are outdated (w.r.t. to these recovered by xgettext from sources).
+ old_content = target[0].get_text_contents()
+ re_cdate = re.compile(r'^"POT-Creation-Date: .*"$[\r\n]?', re.M)
+ old_content_nocdate = re.sub(re_cdate,"",old_content)
+ new_content_nocdate = re.sub(re_cdate,"",new_content)
+ if(old_content_nocdate == new_content_nocdate):
+ # Messages are up-to-date
+ needs_update = False
+ explain = "messages in file found to be up-to-date"
+ else:
+ # Messages are outdated
+ needs_update = True
+ explain = "messages in file were outdated"
+ else:
+ # No POT file found, create new one
+ needs_update = True
+ explain = "new file"
+ if needs_update:
+ # Print message employing SCons.Action.Action for that.
+ msg = "Writting " + repr(str(target[0])) + " (" + explain + ")"
+ env.Execute(SCons.Action.Action(nop, msg))
+ f = open(str(target[0]),"w")
+ f.write(new_content)
+ f.close()
+ return 0
+ else:
+ # Print message employing SCons.Action.Action for that.
+ msg = "Not writting " + repr(str(target[0])) + " (" + explain + ")"
+ env.Execute(SCons.Action.Action(nop, msg))
+ return 0
+#############################################################################
+
+#############################################################################
+from SCons.Builder import BuilderBase
+#############################################################################
+class _POTBuilder(BuilderBase):
+ def _execute(self, env, target, source, *args):
+ if not target:
+ if env.has_key('POTDOMAIN') and env['POTDOMAIN']:
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ target = [ domain ]
+ return BuilderBase._execute(self, env, target, source, *args)
+#############################################################################
+
+#############################################################################
+def _scan_xgettext_from_files(target, source, env, files = None, path = None):
+ """ Parses `POTFILES.in`-like file and returns list of extracted file names.
+ """
+ import re
+ import SCons.Util
+ import SCons.Node.FS
+
+ if files is None:
+ return 0
+ if not SCons.Util.is_List(files):
+ files = [ files ]
+
+ if path is None:
+ if env.has_key('XGETTEXTPATH'):
+ path = env['XGETTEXTPATH']
+ else:
+ path = []
+ if not SCons.Util.is_List(path):
+ path = [ path ]
+
+ path = SCons.Util.flatten(path)
+
+ dirs = ()
+ for p in path:
+ if not isinstance(p, SCons.Node.FS.Base):
+ if SCons.Util.is_String(p):
+ p = env.subst(p, source = source, target = target)
+ p = env.arg2nodes(p, env.fs.Dir)
+ dirs += tuple(p)
+ # cwd is the default search path (when no path is defined by user)
+ if not dirs:
+ dirs = (env.fs.getcwd(),)
+
+ # Parse 'POTFILE.in' files.
+ re_comment = re.compile(r'^#[^\n\r]*$\r?\n?', re.M)
+ re_emptyln = re.compile(r'^[ \t\r]*$\r?\n?', re.M)
+ re_trailws = re.compile(r'[ \t\r]+$')
+ for f in files:
+ # Find files in search path $XGETTEXTPATH
+ if isinstance(f, SCons.Node.FS.Base) and f.rexists():
+ contents = f.get_text_contents()
+ contents = re_comment.sub("", contents)
+ contents = re_emptyln.sub("", contents)
+ contents = re_trailws.sub("", contents)
+ depnames = contents.splitlines()
+ for depname in depnames:
+ depfile = SCons.Node.FS.find_file(depname, dirs)
+ if not depfile:
+ depfile = env.arg2nodes(depname, dirs[0].File)
+ env.Depends(target, depfile)
+ return 0
+#############################################################################
+
+#############################################################################
+def _pot_update_emitter(target, source, env):
+ """ Emitter function for `POTUpdate` builder """
+ from SCons.Tool.GettextCommon import _POTargetFactory
+ import SCons.Util
+ import SCons.Node.FS
+
+ if env.has_key('XGETTEXTFROM'):
+ xfrom = env['XGETTEXTFROM']
+ else:
+ return target, source
+ if not SCons.Util.is_List(xfrom):
+ xfrom = [ xfrom ]
+
+ xfrom = SCons.Util.flatten(xfrom)
+
+ # Prepare list of 'POTFILE.in' files.
+ files = []
+ for xf in xfrom:
+ if not isinstance(xf, SCons.Node.FS.Base):
+ if SCons.Util.is_String(xf):
+ # Interpolate variables in strings
+ xf = env.subst(xf, source = source, target = target)
+ xf = env.arg2nodes(xf)
+ files.extend(xf)
+ if files:
+ env.Depends(target, files)
+ _scan_xgettext_from_files(target, source, env, files)
+ return target, source
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+#############################################################################
+def _POTUpdateBuilderWrapper(env, target=None, source=_null, **kw):
+ return env._POTUpdateBuilder(target, source, **kw)
+#############################################################################
+
+#############################################################################
+def _POTUpdateBuilder(env, **kw):
+ """ Creates `POTUpdate` builder object """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _POTargetFactory
+ kw['action'] = SCons.Action.Action(_update_pot_file, None)
+ kw['suffix'] = '$POTSUFFIX'
+ kw['target_factory'] = _POTargetFactory(env, alias='$POTUPDATE_ALIAS').File
+ kw['emitter'] = _pot_update_emitter
+ return _POTBuilder(**kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate `xgettext` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import RPaths, _detect_xgettext
+
+ try:
+ env['XGETTEXT'] = _detect_xgettext(env)
+ except:
+ env['XGETTEXT'] = 'xgettext'
+ # NOTE: sources="$SOURCES" would work as well. However, we use following
+ # construction to convert absolute paths provided by scons onto paths
+ # relative to current working dir. Note, that scons expands $SOURCE(S) to
+ # absolute paths for sources $SOURCE(s) outside of current subtree (e.g. in
+ # "../"). With source=$SOURCE these absolute paths would be written to the
+ # resultant *.pot file (and its derived *.po files) as references to lines in
+ # source code (e.g. referring lines in *.c files). Such references would be
+ # correct (e.g. in poedit) only on machine on which *.pot was generated and
+ # would be of no use on other hosts (having a copy of source code located
+ # in different place in filesystem).
+ sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET' \
+ + ', SOURCES)} $)'
+
+ # NOTE: the output from $XGETTEXTCOM command must go to stdout, not to a file.
+ # This is required by the POTUpdate builder's action.
+ xgettextcom = '$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS' \
+ + ' $_XGETTEXTFROMFLAGS -o - ' + sources
+
+ xgettextpathflags = '$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH' \
+ + ', XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)'
+ xgettextfromflags = '$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM' \
+ + ', XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)'
+
+ env.SetDefault(
+ _XGETTEXTDOMAIN = '${TARGET.filebase}',
+ XGETTEXTFLAGS = [ ],
+ XGETTEXTCOM = xgettextcom,
+ XGETTEXTCOMSTR = '',
+ XGETTEXTPATH = [ ],
+ XGETTEXTPATHPREFIX = '-D',
+ XGETTEXTPATHSUFFIX = '',
+ XGETTEXTFROM = None,
+ XGETTEXTFROMPREFIX = '-f',
+ XGETTEXTFROMSUFFIX = '',
+ _XGETTEXTPATHFLAGS = xgettextpathflags,
+ _XGETTEXTFROMFLAGS = xgettextfromflags,
+ POTSUFFIX = ['.pot'],
+ POTUPDATE_ALIAS = 'pot-update',
+ XgettextRPaths = RPaths(env)
+ )
+ env.Append( BUILDERS = {
+ '_POTUpdateBuilder' : _POTUpdateBuilder(env)
+ } )
+ env.AddMethod(_POTUpdateBuilderWrapper, 'POTUpdate')
+ env.AlwaysBuild(env.Alias('$POTUPDATE_ALIAS'))
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check, whether the tool exists """
+ from SCons.Tool.GettextCommon import _xgettext_exists
+ try:
+ return _xgettext_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/yacc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py
index 0f8744f..4b8d938 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/yacc.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/yacc.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/yacc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -61,6 +61,16 @@ def _yaccEmitter(target, source, env, ysuf, hsuf):
base, ext = os.path.splitext(SCons.Util.to_String(source[0]))
target.append(base + env.subst("$YACCVCGFILESUFFIX"))
+ # If -v is specirfied yacc will create the output debug file
+ # which is not really source for any process, but should
+ # be noted and also be cleaned
+ # Bug #2558
+ if "-v" in flags:
+ env.SideEffect(targetBase+'.output',target[0])
+ env.Clean(target[0],targetBase+'.output')
+
+
+
# With --defines and --graph, the name of the file is totally defined
# in the options.
fileGenOptions = ["--defines=", "--graph="]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py
index 36fd436..750769a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/zip.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py
@@ -9,7 +9,7 @@ selection method.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ selection method.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Tool/zip.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Tool/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
@@ -57,9 +57,9 @@ if internal_zip:
for fname in filenames:
path = os.path.join(dirpath, fname)
if os.path.isfile(path):
- zf.write(path)
+ zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))))
else:
- zf.write(str(s))
+ zf.write(str(s), os.path.relpath(str(s), str(env.get('ZIPROOT', ''))))
zf.close()
else:
zipcompression = 0
@@ -88,6 +88,7 @@ def generate(env):
env['ZIPCOM'] = zipAction
env['ZIPCOMPRESSION'] = zipcompression
env['ZIPSUFFIX'] = '.zip'
+ env['ZIPROOT'] = SCons.Util.CLVar('')
def exists(env):
return internal_zip or env.Detect('zip')
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Util.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py
index 45278fa..343f0a7 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Util.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py
@@ -3,7 +3,7 @@
Various utility functions go here.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -24,7 +24,7 @@ Various utility functions go here.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Util.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Util.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import sys
@@ -179,7 +179,7 @@ def render_tree(root, child_func, prune=0, margin=[0], visited={}):
or in the whole tree if prune.
"""
- rname = repr(str(root))
+ rname = str(root)
children = child_func(root)
retval = ""
@@ -223,7 +223,7 @@ def print_tree(root, child_func, prune=0, showtags=0, margin=[0], visited={}):
or in the whole tree if prune.
"""
- rname = repr(str(root))
+ rname = str(root)
if showtags:
@@ -430,15 +430,15 @@ def to_String_for_signature(obj, to_String_for_subst=to_String_for_subst,
# references to anything else it finds.
#
# A special case is any object that has a __semi_deepcopy__() method,
-# which we invoke to create the copy, which is used by the BuilderDict
-# class because of its extra initialization argument.
+# which we invoke to create the copy. Currently only used by
+# BuilderDict to actually prevent the copy operation (as invalid on that object)
#
# The dispatch table approach used here is a direct rip-off from the
# normal Python copy module.
_semi_deepcopy_dispatch = d = {}
-def _semi_deepcopy_dict(x):
+def semi_deepcopy_dict(x, exclude = [] ):
copy = {}
for key, val in x.items():
# The regular Python copy.deepcopy() also deepcopies the key,
@@ -447,9 +447,10 @@ def _semi_deepcopy_dict(x):
# copy[semi_deepcopy(key)] = semi_deepcopy(val)
#
# Doesn't seem like we need to, but we'll comment it just in case.
- copy[key] = semi_deepcopy(val)
+ if key not in exclude:
+ copy[key] = semi_deepcopy(val)
return copy
-d[dict] = _semi_deepcopy_dict
+d[dict] = semi_deepcopy_dict
def _semi_deepcopy_list(x):
return list(map(semi_deepcopy, x))
@@ -459,26 +460,21 @@ def _semi_deepcopy_tuple(x):
return tuple(map(semi_deepcopy, x))
d[tuple] = _semi_deepcopy_tuple
-def _semi_deepcopy_inst(x):
- if hasattr(x, '__semi_deepcopy__'):
- return x.__semi_deepcopy__()
- elif isinstance(x, UserDict):
- return x.__class__(_semi_deepcopy_dict(x))
- elif isinstance(x, UserList):
- return x.__class__(_semi_deepcopy_list(x))
- else:
- return x
-d[InstanceType] = _semi_deepcopy_inst
-
def semi_deepcopy(x):
copier = _semi_deepcopy_dispatch.get(type(x))
if copier:
return copier(x)
else:
+ if hasattr(x, '__semi_deepcopy__') and callable(x.__semi_deepcopy__):
+ return x.__semi_deepcopy__()
+ elif isinstance(x, UserDict):
+ return x.__class__(semi_deepcopy_dict(x))
+ elif isinstance(x, UserList):
+ return x.__class__(_semi_deepcopy_list(x))
+
return x
-
class Proxy(object):
"""A simple generic Proxy class, forwarding all calls to
subject. So, for the benefit of the python newbie, what does
@@ -996,7 +992,7 @@ class Selector(OrderedDict):
def __call__(self, env, source, ext=None):
if ext is None:
try:
- ext = source[0].suffix
+ ext = source[0].get_suffix()
except IndexError:
ext = ""
try:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py
index 2eeda77..1594559 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py
@@ -12,7 +12,7 @@ Usage example:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -34,7 +34,7 @@ Usage example:
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Variables/BoolVariable.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/BoolVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__all__ = ['BoolVariable',]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py
index 9ae93fb..bc95cf6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py
@@ -15,7 +15,7 @@ Usage example:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -37,7 +37,7 @@ Usage example:
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Variables/EnumVariable.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/EnumVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__all__ = ['EnumVariable',]
@@ -47,7 +47,7 @@ import SCons.Errors
def _validator(key, val, env, vals):
if not val in vals:
raise SCons.Errors.UserError(
- 'Invalid value for option %s: %s' % (key, val))
+ 'Invalid value for option %s: %s. Valid values are: %s' % (key, val, vals))
def EnumVariable(key, help, default, allowed_values, map={}, ignorecase=0):
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py
index dbd5f4b..1faee72 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py
@@ -25,7 +25,7 @@ Usage example:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -46,7 +46,7 @@ Usage example:
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Variables/ListVariable.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/ListVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
# Know Bug: This should behave like a Set-Type, but does not really,
# since elements can occur twice.
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py
index d9ce2a6..b7a59fe 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py
@@ -28,7 +28,7 @@ Usage example:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -50,7 +50,7 @@ Usage example:
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Variables/PackageVariable.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/PackageVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__all__ = ['PackageVariable',]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py
index 445cfe2..b095cbc 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py
@@ -46,7 +46,7 @@ Usage example:
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -68,7 +68,7 @@ Usage example:
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/Variables/PathVariable.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/PathVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__all__ = ['PathVariable',]
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py
index d8562b0..a00d4f8 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Variables/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py
@@ -5,7 +5,7 @@ customizable variables to an SCons build.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -26,7 +26,7 @@ customizable variables to an SCons build.
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/engine/SCons/Variables/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Variables/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os.path
import sys
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Warnings.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py
index aa6074c..615bc45 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Warnings.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@ This file implements the warnings framework for SCons.
"""
-__revision__ = "src/engine/SCons/Warnings.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/Warnings.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import sys
@@ -42,6 +42,9 @@ class WarningOnByDefault(Warning):
# NOTE: If you add a new warning class, add it to the man page, too!
+class TargetNotBuiltWarning(Warning): # Should go to OnByDefault
+ pass
+
class CacheWriteErrorWarning(Warning):
pass
@@ -51,6 +54,9 @@ class CorruptSConsignWarning(WarningOnByDefault):
class DependencyWarning(Warning):
pass
+class DevelopmentVersionWarning(WarningOnByDefault):
+ pass
+
class DuplicateEnvironmentWarning(WarningOnByDefault):
pass
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py
index 5ffbf8a..019cbf9 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py
@@ -5,7 +5,7 @@ The main package for the SCons software construction utility.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,17 +27,17 @@ The main package for the SCons software construction utility.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-__version__ = "2.0.0.final.0"
+__version__ = "2.4.0"
-__build__ = "r5023"
+__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-__buildsys__ = "scons-dev"
+__buildsys__ = "hpmicrodog"
-__date__ = "2010/06/14 22:05:46"
+__date__ = "2015/09/21 14:03:43"
-__developer__ = "scons"
+__developer__ = "bdbaddog"
# make sure compatibility is always in place
import SCons.compat
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py
index cba69ef..2352d4c 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/__init__.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -60,7 +60,7 @@ function defined below loads the module as the "real" name (without the
rest of our code will find our pre-loaded compatibility module.
"""
-__revision__ = "src/engine/SCons/compat/__init__.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import os
import sys
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py
index 234d380..bf2005f 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -37,7 +37,6 @@ This module checks for the following builtins names:
all()
any()
- sorted()
memoryview()
Implementations of functions are *NOT* guaranteed to be fully compliant
@@ -52,7 +51,7 @@ the FUNCTIONS or DATA output, that means those names are already built in
to this version of Python and we don't need to add them from this module.
"""
-__revision__ = "src/engine/SCons/compat/_scons_builtins.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/_scons_builtins.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import builtins
@@ -101,48 +100,6 @@ except NameError:
return self.obj[indx]
builtins.memoryview = memoryview
-try:
- sorted
-except NameError:
- # Pre-2.4 Python has no sorted() function.
- #
- # The pre-2.4 Python list.sort() method does not support
- # list.sort(key=) nor list.sort(reverse=) keyword arguments, so
- # we must implement the functionality of those keyword arguments
- # by hand instead of passing them to list.sort().
- def sorted(iterable, cmp=None, key=None, reverse=False):
- if key is not None:
- result = [(key(x), x) for x in iterable]
- else:
- result = iterable[:]
- if cmp is None:
- # Pre-2.3 Python does not support list.sort(None).
- result.sort()
- else:
- result.sort(cmp)
- if key is not None:
- result = [t1 for t0,t1 in result]
- if reverse:
- result.reverse()
- return result
- builtins.sorted = sorted
-
-#if sys.version_info[:3] in ((2, 2, 0), (2, 2, 1)):
-# def lstrip(s, c=string.whitespace):
-# while s and s[0] in c:
-# s = s[1:]
-# return s
-# def rstrip(s, c=string.whitespace):
-# while s and s[-1] in c:
-# s = s[:-1]
-# return s
-# def strip(s, c=string.whitespace, l=lstrip, r=rstrip):
-# return l(r(s, c), c)
-#
-# object.__setattr__(str, 'lstrip', lstrip)
-# object.__setattr__(str, 'rstrip', rstrip)
-# object.__setattr__(str, 'strip', strip)
-
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_collections.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py
index b44319c..1f13065 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_collections.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ used by SCons, in an interface that looks enough like collections for
our purposes.
"""
-__revision__ = "src/engine/SCons/compat/_scons_collections.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/_scons_collections.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
# Use exec to hide old names from fixers.
exec("""if True:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_dbm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py
index 6228aee..3bc0768 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_dbm.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -30,7 +30,7 @@ that the whichdb.whichdb() implementstation in the various 2.X versions of
Python won't blow up even if dbm wasn't compiled in.
"""
-__revision__ = "src/engine/SCons/compat/_scons_dbm.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/_scons_dbm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
class error(Exception):
pass
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_hashlib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py
index 1c93787..de93e4b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_hashlib.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -31,7 +31,7 @@ purposes, anyway). In fact, this module will raise an ImportError if
the underlying md5 module isn't available.
"""
-__revision__ = "src/engine/SCons/compat/_scons_hashlib.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/_scons_hashlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import md5
from string import hexdigits
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_io.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py
index 3dc6ffd..72cd3b6 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_io.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -29,7 +29,7 @@ functionality. It only wraps the portions of io functionality used
by SCons, in an interface that looks enough like io for our purposes.
"""
-__revision__ = "src/engine/SCons/compat/_scons_io.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/compat/_scons_io.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
# Use the "imp" module to protect the imports below from fixers.
import imp
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_sets.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py
index 0fde994..0fde994 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_sets.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_subprocess.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py
index eebe53d..eebe53d 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/compat/_scons_subprocess.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/cpp.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py
index ef09e11..cf80a4b 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/cpp.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,7 +21,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/cpp.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/cpp.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
__doc__ = """
SCons C Pre-Processor module
@@ -395,9 +395,10 @@ class PreProcessor(object):
"""
d = self.dispatch_table
- d['import'] = self.do_import
- d['include'] = self.do_include
- d['include_next'] = self.do_include
+ p = self.stack[-1] if self.stack else self.default_table
+
+ for k in ('import', 'include', 'include_next'):
+ d[k] = p[k]
def stop_handling_includes(self, t=None):
"""
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/dblite.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py
index ea24e6a..f4ba90a 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/dblite.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py
@@ -104,10 +104,13 @@ class dblite(object):
if (ignore_corrupt_dbfiles == 1):
corruption_warning(self._file_name)
- def __del__(self):
+ def close(self):
if (self._needs_sync):
self.sync()
+ def __del__(self):
+ self.close()
+
def sync(self):
self._check_writable()
f = self._open(self._tmp_name, "wb", self._mode)
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/exitfuncs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py
index 0521568..19c8e8e 100644
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/exitfuncs.py
+++ b/3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py
@@ -5,7 +5,7 @@ Register functions which are executed when SCons exits for any reason.
"""
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -27,9 +27,10 @@ Register functions which are executed when SCons exits for any reason.
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
-__revision__ = "src/engine/SCons/exitfuncs.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/engine/SCons/exitfuncs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+import atexit
_exithandlers = []
def _run_exitfuncs():
@@ -52,23 +53,9 @@ def register(func, *targs, **kargs):
"""
_exithandlers.append((func, targs, kargs))
-import sys
-try:
- x = sys.exitfunc
-
- # if x isn't our own exit func executive, assume it's another
- # registered exit function - append it to our list...
- if x != _run_exitfuncs:
- register(x)
-
-except AttributeError:
- pass
-
-# make our exit function get run by python when it exits:
-sys.exitfunc = _run_exitfuncs
-
-del sys
+# make our exit function get run by python when it exits
+atexit.register(_run_exitfuncs)
# Local Variables:
# tab-width:4
diff --git a/3rdParty/SCons/scons-2.4.0/scons-time.1 b/3rdParty/SCons/scons-2.4.0/scons-time.1
new file mode 100644
index 0000000..fa4b01d
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/scons-time.1
@@ -0,0 +1,795 @@
+'\" t
+.\" Title: SCONS-TIME
+.\" Author: [see the "AUTHORS" section]
+.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
+.\" Date: 09/21/2015
+.\" Manual: SCons 2.4.0
+.\" Source: SCons 2.4.0
+.\" Language: English
+.\"
+.TH "SCONS\-TIME" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\" -----------------------------------------------------------------
+.\" * set default formatting
+.\" -----------------------------------------------------------------
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.\" -----------------------------------------------------------------
+.\" * MAIN CONTENT STARTS HERE *
+.\" -----------------------------------------------------------------
+.SH "NAME"
+scons-time \- generate and display SCons timing information
+.SH "SYNOPSIS"
+.HP \w'\fBscons\-time\fR\ 'u
+\fBscons\-time\fR \fIsubcommand\fR [\fIoptions\fR...] [\fIarguments\fR...]
+.SH "GENERATING TIMING INFORMATION"
+.PP
+\fBscons\-time run\fR
+[\fB\-hnqv\fR] [\fB\-\-aegis=\fR\fIPROJECT\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-number=\fR\fINUMBER\fR] [\fB\-\-outdir=\fR\fIOUTDIR\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-python=\fR\fIPYTHON\fR] [\fB\-s \fR\fIDIR\fR] [\fB\-\-scons=\fR\fISCONS\fR] [\fB\-\-svn=\fR\fIURL\fR] [\fIARGUMENTS\fR]
+.SS "Extracting Function Timings"
+.PP
+\fBscons\-time func\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-\-func=\fR\fINAME\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title= TITLE\fR] [\fIARGUMENTS\fR]
+.SS "Extracting Memory Statistics"
+.PP
+\fBscons\-time mem\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
+.SS "Extracting Object Counts"
+.PP
+\fBscons\-time obj\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
+.SS "Extracting Execution Times"
+.PP
+\fBscons\-time time\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fB\-\-which=\fR\fIWHICH\fR] [\fIARGUMENTS\fR]
+.SS "Help Text"
+.PP
+\fBscons\-time help\fR
+\fISUBCOMMAND\fR
+[\&.\&.\&.]
+.SH "DESCRIPTION"
+.PP
+The
+\fBscons\-time\fR
+command runs an SCons configuration through a standard set of profiled timings and can extract and graph information from the resulting profiles and log files of those timings\&. The action to be performed by the
+\fBscons\-time\fR
+script is specified by a subcommand, the first argument on the command line\&. See the
+SUBCOMMANDS
+section below for information about the operation of specific subcommands\&.
+.PP
+The basic way to use
+\fBscons\-time\fR
+is to run the
+\fBscons\-time run\fR
+subcommand (possibly multiple times) to generate profile and log file output, and then use one of the other subcommands to display the results captured in the profiles and log files for a particular kind of information: function timings (the
+\fBscons\-time func\fR
+subcommand), total memory used (the
+\fBscons\-time mem\fR
+subcommand), object counts (the
+\fBscons\-time obj\fR
+subcommand) and overall execution time (the
+\fBscons\-time time\fR
+subcommand)\&. Options exist to place and find the profiles and log files in separate directories, to generate the output in a format suitable for graphing with the
+\fBgnuplot\fR(1)
+program, and so on\&.
+.PP
+There are two basic ways the
+\fBscons\-time run\fR
+subcommand is intended to be used to gather timing statistics for a configuration\&. One is to use the
+\fB\-\-svn=\fR
+option to test a configuration against a list of revisions from the SCons Subversion repository\&. This will generate a profile and timing log file for every revision listed with the
+\fB\-\-number=\fR
+option, and can be used to look at the impact of committed changes to the SCons code base on a particular configuration over time\&.
+.PP
+The other way is to profile incremental changes to a local SCons code base during a development cycle\-\-that is, to look at the performance impact of changes you\*(Aqre making in the local tree\&. In this mode, you run the
+\fBscons\-time run\fR
+subcommand
+\fIwithout\fR
+the
+\fB\-\-svn=\fR
+option, in which case it simply looks in the profile/log file output directory (the current directory by default) and automatically figures out the
+\fInext\fR
+run number for the output profile and log file\&. Used in this way, the development cycle goes something like: make a change to SCons; run
+\fBscons\-time run\fR
+to profile it against a specific configuration; make another change to SCons; run
+\fBscons\-time run\fR
+again to profile it; etc\&.
+.SH "OPTIONS"
+.PP
+The
+\fBscons\-time\fR
+command only supports a few global options:
+.PP
+\-h, \-\-help
+.RS 4
+Displays the global help text and exits, identical to the
+\fBscons\-time help\fR
+subcommand\&.
+.RE
+.PP
+\-V, \-\-version
+.RS 4
+Displays the
+\fBscons\-time\fR
+version and exits\&.
+.RE
+.PP
+Most functionality is controlled by options to the individual subcommands\&. See the next section for information about individual subcommand options\&.
+.SH "SUBCOMMANDS"
+.PP
+The
+\fBscons\-time\fR
+command supports the following individual subcommands\&.
+.SS "The func Subcommand"
+.PP
+\fBscons\-time func\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-\-func=\fR\fINAME\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title= TITLE\fR] [\fIARGUMENTS\fR]
+.PP
+The
+\fBscons\-time func\fR
+subcommand displays timing information for a specific Python function within SCons\&. By default, it extracts information about the
+\fB_main\fR() function, which includes the Python profiler timing for all of SCons\&.
+.PP
+The
+\fBscons\-time func\fR
+subcommand extracts function timing information from all the specified file arguments, which should be Python profiler output files\&. (Normally, these would be
+\fB*\&.prof\fR
+files generated by the
+\fBscons\-time run\fR
+subcommand, but they can actually be generated by any Python profiler invocation\&.) All file name arguments will be globbed for on\-disk files\&.
+.PP
+If no arguments are specified, then function timing information will be extracted from all
+\fB*\&.prof\fR
+files, or the subset of them with a prefix specified by the
+\fB\-p\fR
+option\&.
+.PP
+Options include:
+.PP
+\-C DIRECTORY, \-\-chdir=DIRECTORY
+.RS 4
+Changes to the specified
+\fIDIRECTORY\fR
+before looking for the specified files (or files that match the specified patterns)\&.
+.RE
+.PP
+\-f FILE, \-\-file=FILE
+.RS 4
+Reads configuration information from the specified
+\fIFILE\fR\&.
+.RE
+.PP
+\-fmt=FORMAT, \-\-format=FORMAT
+.RS 4
+Reports the output in the specified
+\fIFORMAT\fR\&. The formats currently supported are
+\fBascii\fR
+(the default) and
+\fBgnuplot\fR\&.
+.RE
+.PP
+\-\-func=NAME
+.RS 4
+Extracts timings for the specified function
+\fINAME\fR\&. The default is to report cumulative timings for the
+\fB_main\fR() function, which contains the entire SCons run\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Displays help text for the
+\fBscons\-time func\fR
+subcommand\&.
+.RE
+.PP
+\-p STRING, \-\-prefix=STRING
+.RS 4
+Specifies the prefix string for profiles from which to extract function timing information\&. This will be used to search for profiles if no arguments are specified on the command line\&.
+.RE
+.PP
+\-t NUMBER, \-\-tail=NUMBER
+.RS 4
+Only extracts function timings from the last
+\fINUMBER\fR
+files\&.
+.RE
+.SS "The help Subcommand"
+.PP
+\fBscons\-time help\fR
+\fISUBCOMMAND\fR
+[\&.\&.\&.] The
+\fBhelp\fR
+subcommand prints help text for any other subcommands listed as later arguments on the command line\&.
+.SS "The mem Subcommand"
+.PP
+\fBscons\-time mem\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
+.PP
+The
+\fBscons\-time mem\fR
+subcommand displays how much memory SCons uses\&.
+.PP
+The
+\fBscons\-time mem\fR
+subcommand extracts memory use information from all the specified file arguments, which should be files containing output from running SCons with the
+\fB\-\-debug=memory\fR
+option\&. (Normally, these would be
+\fB*\&.log\fR
+files generated by the
+\fBscons\-time run\fR
+subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
+.PP
+If no arguments are specified, then memory information will be extracted from all
+\fB*\&.log\fR
+files, or the subset of them with a prefix specified by the
+\fB\-p\fR
+option\&.
+.PP
+\-C DIR, \-\-chdir=DIR
+.RS 4
+Changes to the specified
+\fIDIRECTORY\fR
+before looking for the specified files (or files that match the specified patterns)\&.
+.RE
+.PP
+\-f FILE, \-\-file=FILE
+.RS 4
+Reads configuration information from the specified
+\fIFILE\fR\&.
+.RE
+.PP
+\-fmt=FORMAT, \-\-format=FORMAT
+.RS 4
+Reports the output in the specified
+\fIFORMAT\fR\&. The formats currently supported are
+\fBascii\fR
+(the default) and
+\fBgnuplot\fR\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Displays help text for the
+\fBscons\-time mem\fR
+subcommand\&.
+.RE
+.PP
+\-p STRING, \-\-prefix=STRING
+.RS 4
+Specifies the prefix string for log files from which to extract memory usage information\&. This will be used to search for log files if no arguments are specified on the command line\&.
+.RE
+.PP
+\-\-stage=STAGE
+.RS 4
+Prints the memory used at the end of the specified
+\fISTAGE\fR:
+\fBpre\-read\fR
+(before the SConscript files are read),
+\fBpost\-read ,\fR
+(after the SConscript files are read),
+\fBpre\-build\fR
+(before any targets are built) or
+\fBpost\-build\fR
+(after any targets are built)\&. If no
+\fB\-\-stage\fR
+option is specified, the default behavior is
+\fBpost\-build\fR, which reports the final amount of memory used by SCons during each run\&.
+.RE
+.PP
+\-t NUMBER, \-\-tail=NUMBER
+.RS 4
+Only reports memory statistics from the last
+\fINUMBER\fR
+files\&.
+.RE
+.SS "The obj Subcommand"
+.PP
+\fBscons\-time obj\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
+.PP
+The
+\fBscons\-time obj\fR
+subcommand displays how many objects of a specific named type are created by SCons\&.
+.PP
+The
+\fBscons\-time obj\fR
+subcommand extracts object counts from all the specified file arguments, which should be files containing output from running SCons with the
+\fB\-\-debug=count\fR
+option\&. (Normally, these would be
+\fB*\&.log\fR
+files generated by the
+\fBscons\-time run\fR
+subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
+.PP
+If no arguments are specified, then object counts will be extracted from all
+\fB*\&.log\fR
+files, or the subset of them with a prefix specified by the
+\fB\-p\fR
+option\&.
+.PP
+\-C DIR, \-\-chdir=DIR
+.RS 4
+Changes to the specified
+\fIDIRECTORY\fR
+before looking for the specified files (or files that match the specified patterns)\&.
+.RE
+.PP
+\-f FILE, \-\-file=FILE
+.RS 4
+Reads configuration information from the specified
+\fIFILE\fR\&.
+.RE
+.PP
+\-fmt=FORMAT, \-\-format=FORMAT
+.RS 4
+Reports the output in the specified
+\fIFORMAT\fR\&. The formats currently supported are
+\fBascii\fR
+(the default) and
+\fBgnuplot\fR\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Displays help text for the
+\fBscons\-time obj\fR
+subcommand\&.
+.RE
+.PP
+\-p STRING, \-\-prefix=STRING
+.RS 4
+Specifies the prefix string for log files from which to extract object counts\&. This will be used to search for log files if no arguments are specified on the command line\&.
+.RE
+.PP
+\-\-stage=STAGE
+.RS 4
+Prints the object count at the end of the specified
+\fISTAGE\fR:
+\fBpre\-read\fR
+(before the SConscript files are read),
+\fBpost\-read ,\fR
+(after the SConscript files are read),
+\fBpre\-build\fR
+(before any targets are built) or
+\fBpost\-build\fR
+(after any targets are built)\&. If no
+\fB\-\-stage\fR
+option is specified, the default behavior is
+\fBpost\-build\fR, which reports the final object count during each run\&.
+.RE
+.PP
+\-t NUMBER, \-\-tail=NUMBER
+.RS 4
+Only reports object counts from the last
+\fINUMBER\fR
+files\&.
+.RE
+.SS "The run Subcommand"
+.PP
+\fBscons\-time run\fR
+[\fB\-hnqv\fR] [\fB\-\-aegis=\fR\fIPROJECT\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-number=\fR\fINUMBER\fR] [\fB\-\-outdir=\fR\fIOUTDIR\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-python=\fR\fIPYTHON\fR] [\fB\-s \fR\fIDIR\fR] [\fB\-\-scons=\fR\fISCONS\fR] [\fB\-\-svn=\fR\fIURL\fR] [\fIARGUMENTS\fR] The
+\fBscons\-time run\fR
+subcommand is the basic subcommand for profiling a specific configuration against a version of SCons\&.
+.PP
+The configuration to be tested is specified as a list of files or directories that will be unpacked or copied into a temporary directory in which SCons will be invoked\&. The
+\fBscons\-time run\fR
+subcommand understands file suffixes like
+\fB\&.tar\fR,
+\fB\&.tar\&.gz\fR,
+\fB\&.tgz\fR
+and
+\fB\&.zip\fR
+and will unpack their contents into a temporary directory\&. If more than one argument is specified, each one will be unpacked or copied into the temporary directory "on top of" the previous archives or directories, so the expectation is that multiple specified archives share the same directory layout\&.
+.PP
+Once the file or directory arguments are unpacked or copied to the temporary directory, the
+\fBscons\-time run\fR
+subcommand runs the requested version of SCons against the configuration three times:
+.PP
+Startup
+.RS 4
+SCons is run with the
+\fB\-\-help\fR
+option so that just the SConscript files are read, and then the default help text is printed\&. This profiles just the perceived "overhead" of starting up SCons and processing the SConscript files\&.
+.RE
+.PP
+Full build
+.RS 4
+SCons is run to build everything specified in the configuration\&. Specific targets to be passed in on the command l ine may be specified by the
+\fBtargets\fR
+keyword in a configuration file; see below for details\&.
+.RE
+.PP
+Rebuild
+.RS 4
+SCons is run again on the same just\-built directory\&. If the dependencies in the SCons configuration are correct, this should be an up\-to\-date, "do nothing" rebuild\&.
+.RE
+.PP
+Each invocation captures the output log file and a profile\&.
+.PP
+The
+\fBscons\-time run\fR
+subcommand supports the following options:
+.PP
+\-\-aegis=PROJECT
+.RS 4
+Specifies the Aegis
+\fIPROJECT\fR
+from which the version(s) of
+\fBscons\fR
+being timed will be extracted\&. When
+\fB\-\-aegis\fR
+is specified, the
+\fB\-\-number=\fR\fINUMBER\fR
+option specifies delta numbers that will be tested\&. Output from each invocation run will be placed in file names that match the Aegis delta numbers\&. If the
+\fB\-\-number=\fR
+option is not specified, then the default behavior is to time the tip of the specified
+\fIPROJECT\fR\&.
+.RE
+.PP
+\-f FILE, \-\-file=FILE
+.RS 4
+Reads configuration information from the specified
+\fIFILE\fR\&. This often provides a more convenient way to specify and collect parameters associated with a specific timing configuration than specifying them on the command line\&. See the
+CONFIGURATION FILE
+section below for information about the configuration file parameters\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Displays help text for the
+\fBscons\-time run\fR
+subcommand\&.
+.RE
+.PP
+\-n, \-\-no\-exec
+.RS 4
+Do not execute commands, just printing the command\-line equivalents of what would be executed\&. Note that the
+\fBscons\-time\fR
+script actually executes its actions in Python, where possible, for portability\&. The commands displayed are UNIX
+\fIequivalents\fR
+of what it\*(Aqs doing\&.
+.RE
+.PP
+\-\-number=NUMBER
+.RS 4
+Specifies the run number to be used in the names of the log files and profile outputs generated by this run\&.
+.RE
+.PP
+When used in conjunction with the
+\fB\-\-aegis=\fR\fIPROJECT\fR
+option,
+\fINUMBER\fR
+specifies one or more comma\-separated Aegis delta numbers that will be retrieved automatically from the specified Aegis
+\fIPROJECT\fR\&.
+.PP
+When used in conjunction with the
+\fB\-\-svn=\fR\fIURL\fR
+option,
+\fINUMBER\fR
+specifies one or more comma\-separated Subversion revision numbers that will be retrieved automatically from the Subversion repository at the specified
+\fIURL\fR\&. Ranges of delta or revision numbers may be specified be separating two numbers with a hyphen (\fB\-\fR)\&.
+.PP
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+% scons\-time run \-\-svn=\m[blue]\fBhttp://scons\&.tigris\&.org/svn/trunk\fR\m[] \-\-num=1247,1249\-1252 \&.
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\-p STRING, \-\-prefix=STRING
+.RS 4
+Specifies the prefix string to be used for all of the log files and profiles generated by this run\&. The default is derived from the first specified argument: if the first argument is a directory, the default prefix is the name of the directory; if the first argument is an archive (tar or zip file), the default prefix is the the base name of the archive, that is, what remains after stripping the archive suffix (\fB\&.tgz\fR,
+\fB\&.tar\&.gz\fR
+or
+\fB\&.zip\fR)\&.
+.RE
+.PP
+\-\-python=PYTHON
+.RS 4
+Specifies a path to the Python executable to be used for the timing runs\&. The default is to use the same Python executable that is running the
+\fBscons\-time\fR
+command itself\&.
+.RE
+.PP
+\-q, \-\-quiet
+.RS 4
+Suppresses display of the command lines being executed\&.
+.RE
+.PP
+\-s DIR, \-\-subdir=DIR
+.RS 4
+Specifies the name of directory or subdirectory from which the commands should be executed\&. The default is XXX
+.RE
+.PP
+\-\-scons=SCONS
+.RS 4
+Specifies a path to the SCons script to be used for the timing runs\&. The default is XXX
+.RE
+.PP
+\-\-svn=URL, \-\-subversion=URL
+.RS 4
+Specifies the
+\fIURL\fR
+of the Subversion repository from which the version(s) of
+\fBscons\fR
+being timed will be extracted\&. When
+\fB\-\-svn\fR
+is specified, the
+\fB\-\-number=\fR\fINUMBER\fR
+option specifies revision numbers that will be tested\&. Output from each invocation run will be placed in file names that match the Subversion revision numbers\&. If the
+\fB\-\-number=\fR
+option is not specified, then the default behavior is to time the
+\fBHEAD\fR
+of the specified
+\fIURL\fR\&.
+.RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Displays the output from individual commands to the screen (in addition to capturing the output in log files)\&.
+.RE
+.SS "The time Subcommand"
+.PP
+\fBscons\-time time\fR
+[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fB\-\-which=\fR\fIWHICH\fR] [\fIARGUMENTS\fR]
+.PP
+The
+\fBscons\-time time\fR
+subcommand displays SCons execution times as reported by the
+\fBscons \-\-debug=time\fR
+option\&.
+.PP
+The
+\fBscons\-time time\fR
+subcommand extracts SCons timing from all the specified file arguments, which should be files containing output from running SCons with the
+\fB\-\-debug=time\fR
+option\&. (Normally, these would be
+\fB*\&.log\fR
+files generated by the
+\fBscons\-time run\fR
+subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
+.PP
+If no arguments are specified, then execution timings will be extracted from all
+\fB*\&.log\fR
+files, or the subset of them with a prefix specified by the
+\fB\-p\fR
+option\&.
+.PP
+\-C DIR, \-\-chdir=DIR
+.RS 4
+Changes to the specified
+\fIDIRECTORY\fR
+before looking for the specified files (or files that match the specified patterns)\&.
+.RE
+.PP
+\-f FILE, \-\-file=FILE
+.RS 4
+Reads configuration information from the specified
+\fIFILE\fR\&.
+.RE
+.PP
+\-fmt=FORMAT, \-\-format=FORMAT
+.RS 4
+Reports the output in the specified
+\fIFORMAT\fR\&. The formats currently supported are
+\fBascii\fR
+(the default) and
+\fBgnuplot\fR\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Displays help text for the
+\fBscons\-time time\fR
+subcommand\&.
+.RE
+.PP
+\-p STRING, \-\-prefix=STRING
+.RS 4
+Specifies the prefix string for log files from which to extract execution timings\&. This will be used to search for log files if no arguments are specified on the command line\&.
+.RE
+.PP
+\-t NUMBER, \-\-tail=NUMBER
+.RS 4
+Only reports object counts from the last
+\fINUMBER\fR
+files\&.
+.RE
+.PP
+\-\-which=WHICH
+.RS 4
+Prints the execution time for the specified
+\fIWHICH\fR
+value:
+\fBtotal\fR
+(the total execution time),
+\fBSConscripts\fR
+(total execution time for the SConscript files themselves),
+\fBSCons\fR
+(exectuion time in SCons code itself) or
+\fBcommands\fR
+(execution time of the commands and other actions used to build targets)\&. If no
+\fB\-\-which\fR
+option is specified, the default behavior is
+\fBtotal\fR, which reports the total execution time for each run\&.
+.RE
+.SH "CONFIGURATION FILE"
+.PP
+Various
+\fBscons\-time\fR
+subcommands can read information from a specified configuration file when passed the
+\fB\-f\fR
+or
+\fB\-\-file\fR
+options\&. The configuration file is actually executed as a Python script\&. Setting Python variables in the configuration file controls the behavior of the
+\fBscons\-time\fR
+script more conveniently than having to specify command\-line options or arguments for every run, and provides a handy way to "shrink\-wrap" the necessary information for producing (and reporting) consistent timing runs for a given configuration\&.
+.PP
+\fBaegis\fR
+.RS 4
+The Aegis executable for extracting deltas\&. The default is simply
+\fBaegis\fR\&.
+.RE
+.PP
+\fBaegis_project\fR
+.RS 4
+The Aegis project from which deltas should be extracted\&. The default is whatever is specified with the
+\fB\-\-aegis=\fR
+command\-line option\&.
+.RE
+.PP
+\fBarchive_list\fR
+.RS 4
+A list of archives (files or directories) that will be copied to the temporary directory in which SCons will be invoked\&.
+\fB\&.tar\fR,
+\fB\&.tar\&.gz\fR,
+\fB\&.tgz\fR
+and
+\fB\&.zip\fR
+files will have their contents unpacked in the temporary directory\&. Directory trees and files will be copied as\-is\&.
+.RE
+.PP
+\fBinitial_commands\fR
+.RS 4
+A list of commands that will be executed before the actual timed
+\fBscons\fR
+runs\&. This can be used for commands that are necessary to prepare the source tree\-for example, creating a configuration file that should not be part of the timed run\&.
+.RE
+.PP
+\fBkey_location\fR
+.RS 4
+The location of the key on Gnuplot graphing information generated with the
+\fB\-\-format=gnuplot\fR
+option\&. The default is
+\fBbottom left\fR\&.
+.RE
+.PP
+\fBprefix\fR
+.RS 4
+The file name prefix to be used when running or extracting timing for this configuration\&.
+.RE
+.PP
+\fBpython\fR
+.RS 4
+The path name of the Python executable to be used when running or extracting information for this configuration\&. The default is the same version of Python used to run the SCons
+.RE
+.PP
+\fBscons\fR
+.RS 4
+The path name of the SCons script to be used when running or extracting information for this configuration\&. The default is simply
+\fBscons\fR\&.
+.RE
+.PP
+\fBscons_flags\fR
+.RS 4
+The
+\fBscons\fR
+flags used when running SCons to collect timing information\&. The default value is
+\fB\-\-debug=count \-\-debug=memory \-\-debug=time \-\-debug=memoizer\fR\&.
+.RE
+.PP
+\fBscons_lib_dir\fR, \fBscons_wrapper\fR, \fBstartup_targets\fR, \fBsubdir\fR
+.RS 4
+The subdirectory of the project into which the
+\fBscons\-time\fR
+script should change before executing the SCons commands to time\&.
+.RE
+.PP
+\fBsubversion_url\fR
+.RS 4
+The Subversion URL from
+.RE
+.PP
+\fBsvn\fR
+.RS 4
+The subversion executable used to check out revisions of SCons to be timed\&. The default is simple
+\fBsvn\fR\&.
+.RE
+.PP
+\fBsvn_co_flag\fR, \fBtar\fR, \fBtargets\fR
+.RS 4
+A string containing the targets that should be added to the command line of every timed
+\fBscons\fR
+run\&. This can be used to restrict what\*(Aqs being timed to a subset of the full build for the configuration\&.
+.RE
+.PP
+\fBtargets0\fR, \fBtargets1\fR, \fBtargets2\fR, \fBtitle\fR, \fBunzip\fR, \fBverbose\fR, \fBvertical_bars\fR
+.RS 4
+.RE
+.SS "Example"
+.PP
+Here is an example
+\fBscons\-time\fR
+configuration file for a hypothetical sample project:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# The project doesn\*(Aqt use SCons natively (yet), so we\*(Aqre
+# timing a separate set of SConscript files that we lay
+# on top of the vanilla unpacked project tarball\&.
+arguments = [\*(Aqproject\-1\&.2\&.tgz\*(Aq, \*(Aqproject\-SConscripts\&.tar\*(Aq]
+
+# The subdirectory name contains the project version number,
+# so tell scons\-time to chdir there before building\&.
+subdir = \*(Aqproject\-1\&.2\*(Aq
+
+# Set the prefix so output log files and profiles are named:
+# project\-000\-[012]\&.{log,prof}
+# project\-001\-[012]\&.{log,prof}
+# etc\&.
+prefix = \*(Aqproject\*(Aq
+
+# The SConscript files being tested don\*(Aqt do any SConf
+# configuration, so run their normal \&./configure script
+# before we invoke SCons\&.
+initial_commands = [
+ \*(Aq\&./configure\*(Aq,
+]
+
+# Only time building the bin/project executable\&.
+targets = \*(Aqbin/project\*(Aq
+
+# Time against SCons revisions of the branches/core branch
+subversion_url = \*(Aq\m[blue]\fBhttp://scons\&.tigris\&.org/svn/scons/branches/core\fR\m[]\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.SH "ENVIRONMENT"
+.PP
+The
+\fBscons\-time\fR
+script uses the following environment variables:
+.PP
+\fBPRESERVE\fR
+.RS 4
+If this value is set, the
+\fBscons\-time\fR
+script will
+\fInot\fR
+remove the temporary directory or directories in which it builds the specified configuration or downloads a specific version of SCons\&.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBgnuplot\fR(1),
+\fBscons\fR(1)
+.SH "AUTHORS"
+.PP
+Steven Knight <knight at baldmt dot com>
diff --git a/3rdParty/SCons/scons-2.4.0/scons.1 b/3rdParty/SCons/scons-2.4.0/scons.1
new file mode 100644
index 0000000..bf22dac
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/scons.1
@@ -0,0 +1,19588 @@
+'\" t
+.\" Title: SCONS
+.\" Author: Steven Knight
+.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
+.\" Date: <pubdate>2004 - 2015</pubdate>
+.\" Manual: SCons 2.4.0
+.\" Source: SCons 2.4.0 version 2.4.0
+.\" Language: English
+.\"
+.TH "SCONS" "1" "<pubdate>2004 - 2015</pubdate>" "SCons 2\&.4\&.0 version 2.4.0" "SCons 2\&.4\&.0"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\" -----------------------------------------------------------------
+.\" * set default formatting
+.\" -----------------------------------------------------------------
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.\" -----------------------------------------------------------------
+.\" * MAIN CONTENT STARTS HERE *
+.\" -----------------------------------------------------------------
+.SH "NAME"
+scons \- a software construction tool
+.SH "SYNOPSIS"
+.HP \w'\fBscons\fR\ 'u
+\fBscons\fR [\fIoptions\fR...] [\fIname=val\fR...] [\fItargets\fR...]
+.SH "DESCRIPTION"
+.PP
+The
+\fBscons\fR
+utility builds software (or other files) by determining which component pieces must be rebuilt and executing the necessary commands to rebuild them\&.
+.PP
+By default,
+\fBscons\fR
+searches for a file named
+\fISConstruct\fR,
+\fISconstruct\fR, or
+\fIsconstruct\fR
+(in that order) in the current directory and reads its configuration from the first file found\&. An alternate file name may be specified via the
+\fB\-f\fR
+option\&.
+.PP
+The
+\fISConstruct\fR
+file can specify subsidiary configuration files using the
+\fBSConscript\fR() function\&. By convention, these subsidiary files are named
+\fISConscript\fR, although any name may be used\&. (Because of this naming convention, the term "SConscript files" is sometimes used to refer generically to all
+\fBscons\fR
+configuration files, regardless of actual file name\&.)
+.PP
+The configuration files specify the target files to be built, and (optionally) the rules to build those targets\&. Reasonable default rules exist for building common software components (executable programs, object files, libraries), so that for most software projects, only the target and input files need be specified\&.
+.PP
+Before reading the
+\fISConstruct\fR
+file,
+\fBscons\fR
+looks for a directory named
+\fIsite_scons\fR
+in various system directories (see below) and the directory containing the
+\fISConstruct\fR
+file; for each of those dirs which exists,
+\fIsite_scons\fR
+is prepended to sys\&.path, the file
+\fIsite_scons/site_init\&.py\fR, is evaluated if it exists, and the directory
+\fIsite_scons/site_tools\fR
+is prepended to the default toolpath if it exists\&. See the
+\fB\-\-no\-site\-dir\fR
+and
+\fB\-\-site\-dir\fR
+options for more details\&.
+.PP
+\fBscons\fR
+reads and executes the SConscript files as Python scripts, so you may use normal Python scripting capabilities (such as flow control, data manipulation, and imported Python libraries) to handle complicated build situations\&.
+\fBscons\fR, however, reads and executes all of the SConscript files
+\fIbefore\fR
+it begins building any targets\&. To make this obvious,
+\fBscons\fR
+prints the following messages about what it is doing:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons foo\&.out
+scons: Reading SConscript files \&.\&.\&.
+scons: done reading SConscript files\&.
+scons: Building targets \&.\&.\&.
+cp foo\&.in foo\&.out
+scons: done building targets\&.
+$
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The status messages (everything except the line that reads "cp foo\&.in foo\&.out") may be suppressed using the
+\fB\-Q\fR
+option\&.
+.PP
+\fBscons\fR
+does not automatically propagate the external environment used to execute
+\fBscons\fR
+to the commands used to build target files\&. This is so that builds will be guaranteed repeatable regardless of the environment variables set at the time
+\fBscons\fR
+is invoked\&. This also means that if the compiler or other commands that you want to use to build your target files are not in standard system locations,
+\fBscons\fR
+will not find them unless you explicitly set the PATH to include those locations\&. Whenever you create an
+\fBscons\fR
+construction environment, you can propagate the value of PATH from your external environment as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import os
+env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq]})
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Similarly, if the commands use external environment variables like $PATH, $HOME, $JAVA_HOME, $LANG, $SHELL, $TERM, etc\&., these variables can also be explicitly propagated:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import os
+env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq],
+ \*(AqHOME\*(Aq : os\&.environ[\*(AqHOME\*(Aq]})
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Or you may explicitly propagate the invoking user\*(Aqs complete external environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import os
+env = Environment(ENV = os\&.environ)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+This comes at the expense of making your build dependent on the user\*(Aqs environment being set correctly, but it may be more convenient for many configurations\&.
+.PP
+\fBscons\fR
+can scan known input files automatically for dependency information (for example, #include statements in C or C++ files) and will rebuild dependent files appropriately whenever any "included" input file changes\&.
+\fBscons\fR
+supports the ability to define new scanners for unknown input file types\&.
+.PP
+\fBscons\fR
+knows how to fetch files automatically from SCCS or RCS subdirectories using SCCS, RCS or BitKeeper\&.
+.PP
+\fBscons\fR
+is normally executed in a top\-level directory containing a
+\fISConstruct\fR
+file, optionally specifying as command\-line arguments the target file or files to be built\&.
+.PP
+By default, the command
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+will build all target files in or below the current directory\&. Explicit default targets (to be built when no targets are specified on the command line) may be defined the SConscript file(s) using the
+\fBDefault()\fR
+function, described below\&.
+.PP
+Even when
+\fBDefault()\fR
+targets are specified in the SConscript file(s), all target files in or below the current directory may be built by explicitly specifying the current directory (\&.) as a command\-line target:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons \&.
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Building all target files, including any files outside of the current directory, may be specified by supplying a command\-line target of the root directory (on POSIX systems):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons /
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or the path name(s) of the volume(s) in which all the targets should be built (on Windows systems):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons C:\e D:\e
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+To build only specific targets, supply them as command\-line arguments:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons foo bar
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+in which case only the specified targets will be built (along with any derived files on which they depend)\&.
+.PP
+Specifying "cleanup" targets in SConscript files is not usually necessary\&. The
+\fB\-c\fR
+flag removes all files necessary to build the specified target:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons \-c \&.
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+to remove all target files, or:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons \-c build export
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+to remove target files under build and export\&. Additional files or directories to remove can be specified using the
+\fBClean()\fR
+function\&. Conversely, targets that would normally be removed by the
+\fB\-c\fR
+invocation can be prevented from being removed by using the
+\fBNoClean\fR() function\&.
+.PP
+A subset of a hierarchical tree may be built by remaining at the top\-level directory (where the
+\fISConstruct\fR
+file lives) and specifying the subdirectory as the target to be built:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons src/subdir
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or by changing directory and invoking scons with the
+\fB\-u\fR
+option, which traverses up the directory hierarchy until it finds the
+\fISConstruct\fR
+file, and then builds targets relatively to the current subdirectory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+cd src/subdir
+scons \-u \&.
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\fBscons\fR
+supports building multiple targets in parallel via a
+\fB\-j\fR
+option that takes, as its argument, the number of simultaneous tasks that may be spawned:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons \-j 4
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+builds four targets in parallel, for example\&.
+.PP
+\fBscons\fR
+can maintain a cache of target (derived) files that can be shared between multiple builds\&. When caching is enabled in a SConscript file, any target files built by
+\fBscons\fR
+will be copied to the cache\&. If an up\-to\-date target file is found in the cache, it will be retrieved from the cache instead of being rebuilt locally\&. Caching behavior may be disabled and controlled in other ways by the
+\fB\-\-cache\-force\fR,
+\fB\-\-cache\-disable\fR,
+\fB\-\-cache\-readonly\fR, and
+\fB\-\-cache\-show\fR
+command\-line options\&. The
+\fB\-\-random\fR
+option is useful to prevent multiple builds from trying to update the cache simultaneously\&.
+.PP
+Values of variables to be passed to the SConscript file(s) may be specified on the command line:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons debug=1 \&.
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+These variables are available in SConscript files through the ARGUMENTS dictionary, and can be used in the SConscript file(s) to modify the build in any way:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+if ARGUMENTS\&.get(\*(Aqdebug\*(Aq, 0):
+ env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
+else:
+ env = Environment()
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The command\-line variable arguments are also available in the ARGLIST list, indexed by their order on the command line\&. This allows you to process them in order rather than by name, if necessary\&. ARGLIST[0] returns a tuple containing (argname, argvalue)\&. A Python exception is thrown if you try to access a list member that does not exist\&.
+.PP
+\fBscons\fR
+requires Python version 2\&.7 or later\&. There should be no other dependencies or requirements to run
+\fBscons\&.\fR
+.PP
+By default,
+\fBscons\fR
+knows how to search for available programming tools on various systems\&. On Windows systems,
+\fBscons\fR
+searches in order for the Microsoft Visual C++ tools, the MinGW tool chain, the Intel compiler tools, and the PharLap ETS compiler\&. On OS/2 systems,
+\fBscons\fR
+searches in order for the OS/2 compiler, the GCC tool chain, and the Microsoft Visual C++ tools, On SGI IRIX, IBM AIX, Hewlett Packard HP\-UX, and Sun Solaris systems,
+\fBscons\fR
+searches for the native compiler tools (MIPSpro, Visual Age, aCC, and Forte tools respectively) and the GCC tool chain\&. On all other platforms, including POSIX (Linux and UNIX) platforms,
+\fBscons\fR
+searches in order for the GCC tool chain, the Microsoft Visual C++ tools, and the Intel compiler tools\&. You may, of course, override these default values by appropriate configuration of Environment construction variables\&.
+.SH "OPTIONS"
+.PP
+In general,
+\fBscons\fR
+supports the same command\-line options as GNU
+\fBmake\fR, and many of those supported by
+\fBcons\fR\&.
+.PP
+\-b
+.RS 4
+Ignored for compatibility with non\-GNU versions of
+\fBmake\&.\fR
+.RE
+.PP
+\-c, \-\-clean, \-\-remove
+.RS 4
+Clean up by removing all target files for which a construction command is specified\&. Also remove any files or directories associated to the construction command using the
+\fBClean\fR() function\&. Will not remove any targets specified by the
+\fBNoClean\fR() function\&.
+.RE
+.PP
+\-\-cache\-debug=\fIfile\fR
+.RS 4
+Print debug information about the
+\fBCacheDir\fR() derived\-file caching to the specified
+\fIfile\fR\&. If
+\fIfile\fR
+is
+\fB\-\fR
+(a hyphen), the debug information are printed to the standard output\&. The printed messages describe what signature file names are being looked for in, retrieved from, or written to the
+\fBCacheDir\fR() directory tree\&.
+.RE
+.PP
+\-\-cache\-disable, \-\-no\-cache
+.RS 4
+Disable the derived\-file caching specified by
+\fBCacheDir\fR()\&.
+\fBscons\fR
+will neither retrieve files from the cache nor copy files to the cache\&.
+.RE
+.PP
+\-\-cache\-force, \-\-cache\-populate
+.RS 4
+When using
+\fBCacheDir\fR(), populate a cache by copying any already\-existing, up\-to\-date derived files to the cache, in addition to files built by this invocation\&. This is useful to populate a new cache with all the current derived files, or to add to the cache any derived files recently built with caching disabled via the
+\fB\-\-cache\-disable\fR
+option\&.
+.RE
+.PP
+\-\-cache\-readonly
+.RS 4
+Use the cache (if enabled) for reading, but do not not update the cache with changed files\&.
+.RE
+.PP
+\-\-cache\-show
+.RS 4
+When using
+\fBCacheDir\fR() and retrieving a derived file from the cache, show the command that would have been executed to build the file, instead of the usual report, "Retrieved `file\*(Aq from cache\&." This will produce consistent output for build logs, regardless of whether a target file was rebuilt or retrieved from the cache\&.
+.RE
+.PP
+\-\-config=\fImode\fR
+.RS 4
+This specifies how the
+\fBConfigure\fR
+call should use or generate the results of configuration tests\&. The option should be specified from among the following choices:
+.RE
+.PP
+\-\-config=auto
+.RS 4
+scons will use its normal dependency mechanisms to decide if a test must be rebuilt or not\&. This saves time by not running the same configuration tests every time you invoke scons, but will overlook changes in system header files or external commands (such as compilers) if you don\*(Aqt specify those dependecies explicitly\&. This is the default behavior\&.
+.RE
+.PP
+\-\-config=force
+.RS 4
+If this option is specified, all configuration tests will be re\-run regardless of whether the cached results are out of date\&. This can be used to explicitly force the configuration tests to be updated in response to an otherwise unconfigured change in a system header file or compiler\&.
+.RE
+.PP
+\-\-config=cache
+.RS 4
+If this option is specified, no configuration tests will be rerun and all results will be taken from cache\&. Note that scons will still consider it an error if \-\-config=cache is specified and a necessary test does not yet have any results in the cache\&.
+.RE
+.PP
+\-C\fI directory\fR, \-\-directory=\fIdirectory\fR
+.RS 4
+Change to the specified
+\fIdirectory\fR
+before searching for the
+\fISConstruct\fR,
+\fISconstruct\fR, or
+\fIsconstruct\fR
+file, or doing anything else\&. Multiple
+\fB\-C\fR
+options are interpreted relative to the previous one, and the right\-most
+\fB\-C\fR
+option wins\&. (This option is nearly equivalent to
+\fB\-f directory/SConstruct\fR, except that it will search for
+\fISConstruct\fR,
+\fISconstruct\fR, or
+\fIsconstruct\fR
+in the specified directory\&.)
+.RE
+.PP
+\-D
+.RS 4
+Works exactly the same way as the
+\fB\-u\fR
+option except for the way default targets are handled\&. When this option is used and no targets are specified on the command line, all default targets are built, whether or not they are below the current directory\&.
+.RE
+.PP
+\-\-debug=\fItype\fR
+.RS 4
+Debug the build process\&.
+\fItype[,type\&.\&.\&.]\fR
+specifies what type of debugging\&. Multiple types may be specified, separated by commas\&. The following types are valid:
+.RE
+.PP
+\-\-debug=count
+.RS 4
+Print how many objects are created of the various classes used internally by SCons before and after reading the SConscript files and before and after building targets\&. This is not supported when SCons is executed with the Python
+\fB\-O\fR
+(optimized) option or when the SCons modules have been compiled with optimization (that is, when executing from
+\fB*\&.pyo\fR
+files)\&.
+.RE
+.PP
+\-\-debug=duplicate
+.RS 4
+Print a line for each unlink/relink (or copy) of a variant file from its source file\&. Includes debugging info for unlinking stale variant files, as well as unlinking old targets before building them\&.
+.RE
+.PP
+\-\-debug=dtree
+.RS 4
+A synonym for the newer
+\fB\-\-tree=derived\fR
+option\&. This will be deprecated in some future release and ultimately removed\&.
+.RE
+.PP
+\-\-debug=explain
+.RS 4
+Print an explanation of precisely why
+\fBscons\fR
+is deciding to (re\-)build any targets\&. (Note: this does not print anything for targets that are
+\fInot\fR
+rebuilt\&.)
+.RE
+.PP
+\-\-debug=findlibs
+.RS 4
+Instruct the scanner that searches for libraries to print a message about each potential library name it is searching for, and about the actual libraries it finds\&.
+.RE
+.PP
+\-\-debug=includes
+.RS 4
+Print the include tree after each top\-level target is built\&. This is generally used to find out what files are included by the sources of a given derived file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons \-\-debug=includes foo\&.o
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\-\-debug=memoizer
+.RS 4
+Prints a summary of hits and misses using the Memoizer, an internal subsystem that counts how often SCons uses cached values in memory instead of recomputing them each time they\*(Aqre needed\&.
+.RE
+.PP
+\-\-debug=memory
+.RS 4
+Prints how much memory SCons uses before and after reading the SConscript files and before and after building targets\&.
+.RE
+.PP
+\-\-debug=nomemoizer
+.RS 4
+A deprecated option preserved for backwards compatibility\&.
+.RE
+.PP
+\-\-debug=objects
+.RS 4
+Prints a list of the various objects of the various classes used internally by SCons\&.
+.RE
+.PP
+\-\-debug=pdb
+.RS 4
+Re\-run SCons under the control of the pdb Python debugger\&.
+.RE
+.PP
+\-\-debug=prepare
+.RS 4
+Print a line each time any target (internal or external) is prepared for building\&.
+\fBscons\fR
+prints this for each target it considers, even if that target is up to date (see also \-\-debug=explain)\&. This can help debug problems with targets that aren\*(Aqt being built; it shows whether
+\fBscons\fR
+is at least considering them or not\&.
+.RE
+.PP
+\-\-debug=presub
+.RS 4
+Print the raw command line used to build each target before the construction environment variables are substituted\&. Also shows which targets are being built by this command\&. Output looks something like this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons \-\-debug=presub
+Building myprog\&.o with action(s):
+ $SHCC $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPINCFLAGS \-c \-o $TARGET $SOURCES
+\&.\&.\&.
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\-\-debug=stacktrace
+.RS 4
+Prints an internal Python stack trace when encountering an otherwise unexplained error\&.
+.RE
+.PP
+\-\-debug=stree
+.RS 4
+A synonym for the newer
+\fB\-\-tree=all,status\fR
+option\&. This will be deprecated in some future release and ultimately removed\&.
+.RE
+.PP
+\-\-debug=time
+.RS 4
+Prints various time profiling information: the time spent executing each individual build command; the total build time (time SCons ran from beginning to end); the total time spent reading and executing SConscript files; the total time spent SCons itself spend running (that is, not counting reading and executing SConscript files); and both the total time spent executing all build commands and the elapsed wall\-clock time spent executing those build commands\&. (When
+\fBscons\fR
+is executed without the
+\fB\-j\fR
+option, the elapsed wall\-clock time will typically be slightly longer than the total time spent executing all the build commands, due to the SCons processing that takes place in between executing each command\&. When
+\fBscons\fR
+is executed
+\fIwith\fR
+the
+\fB\-j\fR
+option, and your build configuration allows good parallelization, the elapsed wall\-clock time should be significantly smaller than the total time spent executing all the build commands, since multiple build commands and intervening SCons processing should take place in parallel\&.)
+.RE
+.PP
+\-\-debug=tree
+.RS 4
+A synonym for the newer
+\fB\-\-tree=all\fR
+option\&. This will be deprecated in some future release and ultimately removed\&.
+.RE
+.PP
+\-\-diskcheck=\fItypes\fR
+.RS 4
+Enable specific checks for whether or not there is a file on disk where the SCons configuration expects a directory (or vice versa), and whether or not RCS or SCCS sources exist when searching for source and include files\&. The
+\fItypes\fR
+argument can be set to:
+\fBall\fR, to enable all checks explicitly (the default behavior);
+\fBnone\fR, to disable all such checks;
+\fBmatch\fR, to check that files and directories on disk match SCons\*(Aq expected configuration;
+\fBrcs\fR, to check for the existence of an RCS source for any missing source or include files;
+\fBsccs\fR, to check for the existence of an SCCS source for any missing source or include files\&. Multiple checks can be specified separated by commas; for example,
+\fB\-\-diskcheck=sccs,rcs\fR
+would still check for SCCS and RCS sources, but disable the check for on\-disk matches of files and directories\&. Disabling some or all of these checks can provide a performance boost for large configurations, or when the configuration will check for files and/or directories across networked or shared file systems, at the slight increased risk of an incorrect build or of not handling errors gracefully (if include files really should be found in SCCS or RCS, for example, or if a file really does exist where the SCons configuration expects a directory)\&.
+.RE
+.PP
+\-\-duplicate=\fIORDER\fR
+.RS 4
+There are three ways to duplicate files in a build tree: hard links, soft (symbolic) links and copies\&. The default behaviour of SCons is to prefer hard links to soft links to copies\&. You can specify different behaviours with this option\&.
+\fIORDER\fR
+must be one of
+\fIhard\-soft\-copy\fR
+(the default),
+\fIsoft\-hard\-copy\fR,
+\fIhard\-copy\fR,
+\fIsoft\-copy\fR
+or
+\fIcopy\fR\&. SCons will attempt to duplicate files using the mechanisms in the specified order\&.
+.RE
+.PP
+\-f\fI file\fR, \-\-file=\fIfile\fR, \-\-makefile=\fIfile\fR, \-\-sconstruct=\fIfile\fR
+.RS 4
+Use
+\fIfile\fR
+as the initial SConscript file\&. Multiple
+\fB\-f\fR
+options may be specified, in which case
+\fBscons\fR
+will read all of the specified files\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Print a local help message for this build, if one is defined in the SConscript file(s), plus a line that describes the
+\fB\-H\fR
+option for command\-line option help\&. If no local help message is defined, prints the standard help message about command\-line options\&. Exits after displaying the appropriate message\&.
+.RE
+.PP
+\-H, \-\-help\-options
+.RS 4
+Print the standard help message about command\-line options and exit\&.
+.RE
+.PP
+\-i, \-\-ignore\-errors
+.RS 4
+Ignore all errors from commands executed to rebuild files\&.
+.RE
+.PP
+\-I\fI directory\fR, \-\-include\-dir=\fIdirectory\fR
+.RS 4
+Specifies a
+\fIdirectory\fR
+to search for imported Python modules\&. If several
+\fB\-I\fR
+options are used, the directories are searched in the order specified\&.
+.RE
+.PP
+\-\-implicit\-cache
+.RS 4
+Cache implicit dependencies\&. This causes
+\fBscons\fR
+to use the implicit (scanned) dependencies from the last time it was run instead of scanning the files for implicit dependencies\&. This can significantly speed up SCons, but with the following limitations:
+.RE
+.PP
+\fBscons\fR
+will not detect changes to implicit dependency search paths (e\&.g\&.
+\fBCPPPATH\fR,
+\fBLIBPATH\fR) that would ordinarily cause different versions of same\-named files to be used\&.
+.PP
+\fBscons\fR
+will miss changes in the implicit dependencies in cases where a new implicit dependency is added earlier in the implicit dependency search path (e\&.g\&.
+\fBCPPPATH\fR,
+\fBLIBPATH\fR) than a current implicit dependency with the same name\&.
+.PP
+\-\-implicit\-deps\-changed
+.RS 4
+Forces SCons to ignore the cached implicit dependencies\&. This causes the implicit dependencies to be rescanned and recached\&. This implies
+\fB\-\-implicit\-cache\fR\&.
+.RE
+.PP
+\-\-implicit\-deps\-unchanged
+.RS 4
+Force SCons to ignore changes in the implicit dependencies\&. This causes cached implicit dependencies to always be used\&. This implies
+\fB\-\-implicit\-cache\fR\&.
+.RE
+.PP
+\-\-interactive
+.RS 4
+Starts SCons in interactive mode\&. The SConscript files are read once and a
+\fBscons>>>\fR
+prompt is printed\&. Targets may now be rebuilt by typing commands at interactive prompt without having to re\-read the SConscript files and re\-initialize the dependency graph from scratch\&.
+.sp
+SCons interactive mode supports the following commands:
+.PP
+\fBbuild\fR\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR
+.RS 4
+Builds the specified
+\fITARGETS\fR
+(and their dependencies) with the specified SCons command\-line
+\fIOPTIONS\fR\&.
+\fBb\fR
+and
+\fBscons\fR
+are synonyms\&.
+.sp
+The following SCons command\-line options affect the
+\fBbuild\fR
+command:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\-\-cache\-debug=FILE
+\-\-cache\-disable, \-\-no\-cache
+\-\-cache\-force, \-\-cache\-populate
+\-\-cache\-readonly
+\-\-cache\-show
+\-\-debug=TYPE
+\-i, \-\-ignore\-errors
+\-j N, \-\-jobs=N
+\-k, \-\-keep\-going
+\-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run, \-\-recon
+\-Q
+\-s, \-\-silent, \-\-quiet
+\-\-taskmastertrace=FILE
+\-\-tree=OPTIONS
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+Any other SCons command\-line options that are specified do not cause errors but have no effect on the
+\fBbuild\fR
+command (mainly because they affect how the SConscript files are read, which only happens once at the beginning of interactive mode)\&.
+.PP
+\fBclean\fR\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR
+.RS 4
+Cleans the specified
+\fITARGETS\fR
+(and their dependencies) with the specified options\&.
+\fBc\fR
+is a synonym\&. This command is itself a synonym for
+\fBbuild \-\-clean\fR
+.RE
+.PP
+\fBexit\fR
+.RS 4
+Exits SCons interactive mode\&. You can also exit by terminating input (CTRL+D on UNIX or Linux systems, CTRL+Z on Windows systems)\&.
+.RE
+.PP
+\fBhelp\fR\fI[COMMAND]\fR
+.RS 4
+Provides a help message about the commands available in SCons interactive mode\&. If
+\fICOMMAND\fR
+is specified,
+\fBh\fR
+and
+\fB?\fR
+are synonyms\&.
+.RE
+.PP
+\fBshell\fR\fI[COMMANDLINE]\fR
+.RS 4
+Executes the specified
+\fICOMMANDLINE\fR
+in a subshell\&. If no
+\fICOMMANDLINE\fR
+is specified, executes the interactive command interpreter specified in the
+\fBSHELL\fR
+environment variable (on UNIX and Linux systems) or the
+\fBCOMSPEC\fR
+environment variable (on Windows systems)\&.
+\fBsh\fR
+and
+\fB!\fR
+are synonyms\&.
+.RE
+.PP
+\fBversion\fR
+.RS 4
+Prints SCons version information\&.
+.RE
+.RE
+.PP
+An empty line repeats the last typed command\&. Command\-line editing can be used if the
+\fBreadline\fR
+module is available\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons \-\-interactive
+scons: Reading SConscript files \&.\&.\&.
+scons: done reading SConscript files\&.
+scons>>> build \-n prog
+scons>>> exit
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\-j\fI N\fR, \-\-jobs=\fIN\fR
+.RS 4
+Specifies the number of jobs (commands) to run simultaneously\&. If there is more than one
+\fB\-j\fR
+option, the last one is effective\&.
+.RE
+.PP
+\-k, \-\-keep\-going
+.RS 4
+Continue as much as possible after an error\&. The target that failed and those that depend on it will not be remade, but other targets specified on the command line will still be processed\&.
+.RE
+.PP
+\-m
+.RS 4
+Ignored for compatibility with non\-GNU versions of
+\fBmake\fR\&.
+.RE
+.PP
+\-\-max\-drift=\fISECONDS\fR
+.RS 4
+Set the maximum expected drift in the modification time of files to
+\fISECONDS\fR\&. This value determines how long a file must be unmodified before its cached content signature will be used instead of calculating a new content signature (MD5 checksum) of the file\*(Aqs contents\&. The default value is 2 days, which means a file must have a modification time of at least two days ago in order to have its cached content signature used\&. A negative value means to never cache the content signature and to ignore the cached value if there already is one\&. A value of 0 means to always use the cached signature, no matter how old the file is\&.
+.RE
+.PP
+\-\-md5\-chunksize=\fIKILOBYTES\fR
+.RS 4
+Set the block size used to compute MD5 signatures to
+\fIKILOBYTES\fR\&. This value determines the size of the chunks which are read in at once when computing MD5 signatures\&. Files below that size are fully stored in memory before performing the signature computation while bigger files are read in block\-by\-block\&. A huge block\-size leads to high memory consumption while a very small block\-size slows down the build considerably\&.
+.sp
+The default value is to use a chunk size of 64 kilobytes, which should be appropriate for most uses\&.
+.RE
+.PP
+\-n, \-\-just\-print, \-\-dry\-run, \-\-recon
+.RS 4
+No execute\&. Print the commands that would be executed to build any out\-of\-date target files, but do not execute the commands\&.
+.RE
+.PP
+\-\-no\-site\-dir
+.RS 4
+Prevents the automatic addition of the standard
+\fIsite_scons\fR
+dirs to
+\fIsys\&.path\fR\&. Also prevents loading the
+\fIsite_scons/site_init\&.py\fR
+modules if they exist, and prevents adding their
+\fIsite_scons/site_tools\fR
+dirs to the toolpath\&.
+.RE
+.PP
+\-\-profile=\fIfile\fR
+.RS 4
+Run SCons under the Python profiler and save the results in the specified
+\fIfile\fR\&. The results may be analyzed using the Python pstats module\&.
+.RE
+.PP
+\-q, \-\-question
+.RS 4
+Do not run any commands, or print anything\&. Just return an exit status that is zero if the specified targets are already up to date, non\-zero otherwise\&.
+.RE
+.PP
+\-Q
+.RS 4
+Quiets SCons status messages about reading SConscript files, building targets and entering directories\&. Commands that are executed to rebuild target files are still printed\&.
+.RE
+.PP
+\-\-random
+.RS 4
+Build dependencies in a random order\&. This is useful when building multiple trees simultaneously with caching enabled, to prevent multiple builds from simultaneously trying to build or retrieve the same target files\&.
+.RE
+.PP
+\-s, \-\-silent, \-\-quiet
+.RS 4
+Silent\&. Do not print commands that are executed to rebuild target files\&. Also suppresses SCons status messages\&.
+.RE
+.PP
+\-S, \-\-no\-keep\-going, \-\-stop
+.RS 4
+Ignored for compatibility with GNU
+\fBmake\fR\&.
+.RE
+.PP
+\-\-site\-dir=\fIdir\fR
+.RS 4
+Uses the named dir as the site dir rather than the default
+\fIsite_scons\fR
+dirs\&. This dir will get prepended to
+\fIsys\&.path\fR, the module
+\fIdir\fR/site_init\&.py will get loaded if it exists, and
+\fIdir\fR/site_tools will get added to the default toolpath\&.
+.sp
+The default set of
+\fIsite_scons\fR
+dirs used when
+\fB\-\-site\-dir\fR
+is not specified depends on the system platform, as follows\&. Note that the directories are examined in the order given, from most generic to most specific, so the last\-executed site_init\&.py file is the most specific one (which gives it the chance to override everything else), and the dirs are prepended to the paths, again so the last dir examined comes first in the resulting path\&.
+.RE
+.PP
+Windows:
+.RS 4
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+%ALLUSERSPROFILE/Application Data/scons/site_scons
+%USERPROFILE%/Local Settings/Application Data/scons/site_scons
+%APPDATA%/scons/site_scons
+%HOME%/\&.scons/site_scons
+\&./site_scons
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Mac OS X:
+.RS 4
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+/Library/Application Support/SCons/site_scons
+/opt/local/share/scons/site_scons (for MacPorts)
+/sw/share/scons/site_scons (for Fink)
+$HOME/Library/Application Support/SCons/site_scons
+$HOME/\&.scons/site_scons
+\&./site_scons
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Solaris:
+.RS 4
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+/opt/sfw/scons/site_scons
+/usr/share/scons/site_scons
+$HOME/\&.scons/site_scons
+\&./site_scons
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Linux, HPUX, and other Posix\-like systems:
+.RS 4
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+/usr/share/scons/site_scons
+$HOME/\&.scons/site_scons
+\&./site_scons
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\-\-stack\-size=\fIKILOBYTES\fR
+.RS 4
+Set the size stack used to run threads to
+\fIKILOBYTES\fR\&. This value determines the stack size of the threads used to run jobs\&. These are the threads that execute the actions of the builders for the nodes that are out\-of\-date\&. Note that this option has no effect unless the
+\fBnum_jobs\fR
+option, which corresponds to \-j and \-\-jobs, is larger than one\&. Using a stack size that is too small may cause stack overflow errors\&. This usually shows up as segmentation faults that cause scons to abort before building anything\&. Using a stack size that is too large will cause scons to use more memory than required and may slow down the entire build process\&.
+.sp
+The default value is to use a stack size of 256 kilobytes, which should be appropriate for most uses\&. You should not need to increase this value unless you encounter stack overflow errors\&.
+.RE
+.PP
+\-t, \-\-touch
+.RS 4
+Ignored for compatibility with GNU
+\fBmake\fR\&. (Touching a file to make it appear up\-to\-date is unnecessary when using
+\fBscons\fR\&.)
+.RE
+.PP
+\-\-taskmastertrace=\fIfile\fR
+.RS 4
+Prints trace information to the specified
+\fIfile\fR
+about how the internal Taskmaster object evaluates and controls the order in which Nodes are built\&. A file name of
+\fB\-\fR
+may be used to specify the standard output\&.
+.RE
+.PP
+\-tree=\fIoptions\fR
+.RS 4
+Prints a tree of the dependencies after each top\-level target is built\&. This prints out some or all of the tree, in various formats, depending on the
+\fIoptions\fR
+specified:
+.RE
+.PP
+\-\-tree=all
+.RS 4
+Print the entire dependency tree after each top\-level target is built\&. This prints out the complete dependency tree, including implicit dependencies and ignored dependencies\&.
+.RE
+.PP
+\-\-tree=derived
+.RS 4
+Restricts the tree output to only derived (target) files, not source files\&.
+.RE
+.PP
+\-\-tree=status
+.RS 4
+Prints status information for each displayed node\&.
+.RE
+.PP
+\-\-tree=prune
+.RS 4
+Prunes the tree to avoid repeating dependency information for nodes that have already been displayed\&. Any node that has already been displayed will have its name printed in
+\fB[square brackets]\fR, as an indication that the dependencies for that node can be found by searching for the relevant output higher up in the tree\&.
+.RE
+.PP
+Multiple options may be specified, separated by commas:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Prints only derived files, with status information:
+scons \-\-tree=derived,status
+
+# Prints all dependencies of target, with status information
+# and pruning dependencies of already\-visited Nodes:
+scons \-\-tree=all,prune,status target
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\-u, \-\-up, \-\-search\-up
+.RS 4
+Walks up the directory structure until an
+\fISConstruct ,\fR
+\fISconstruct\fR
+or
+\fIsconstruct\fR
+file is found, and uses that as the top of the directory tree\&. If no targets are specified on the command line, only targets at or below the current directory will be built\&.
+.RE
+.PP
+\-U
+.RS 4
+Works exactly the same way as the
+\fB\-u\fR
+option except for the way default targets are handled\&. When this option is used and no targets are specified on the command line, all default targets that are defined in the SConscript(s) in the current directory are built, regardless of what directory the resultant targets end up in\&.
+.RE
+.PP
+\-v, \-\-version
+.RS 4
+Print the
+\fBscons\fR
+version, copyright information, list of authors, and any other relevant information\&. Then exit\&.
+.RE
+.PP
+\-w, \-\-print\-directory
+.RS 4
+Print a message containing the working directory before and after other processing\&.
+.RE
+.PP
+\-\-no\-print\-directory
+.RS 4
+Turn off \-w, even if it was turned on implicitly\&.
+.RE
+.PP
+\-\-warn=\fItype\fR, \-\-warn=no\-\fItype\fR
+.RS 4
+Enable or disable warnings\&.
+\fItype\fR
+specifies the type of warnings to be enabled or disabled:
+.RE
+.PP
+\-\-warn=all, \-\-warn=no\-all
+.RS 4
+Enables or disables all warnings\&.
+.RE
+.PP
+\-\-warn=cache\-write\-error, \-\-warn=no\-cache\-write\-error
+.RS 4
+Enables or disables warnings about errors trying to write a copy of a built file to a specified
+\fBCacheDir\fR()\&. These warnings are disabled by default\&.
+.RE
+.PP
+\-\-warn=corrupt\-sconsign, \-\-warn=no\-corrupt\-sconsign
+.RS 4
+Enables or disables warnings about unfamiliar signature data in
+\fB\&.sconsign\fR
+files\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=dependency, \-\-warn=no\-dependency
+.RS 4
+Enables or disables warnings about dependencies\&. These warnings are disabled by default\&.
+.RE
+.PP
+\-\-warn=deprecated, \-\-warn=no\-deprecated
+.RS 4
+Enables or disables all warnings about use of currently deprecated features\&. These warnings are enabled by default\&. Note that the
+\fB\-\-warn=no\-deprecated\fR
+option does not disable warnings about absolutely all deprecated features\&. Warnings for some deprecated features that have already been through several releases with deprecation warnings may be mandatory for a release or two before they are officially no longer supported by SCons\&. Warnings for some specific deprecated features may be enabled or disabled individually; see below\&.
+.PP
+\-\-warn=deprecated\-copy, \-\-warn=no\-deprecated\-copy
+.RS 4
+Enables or disables warnings about use of the deprecated
+\fBenv\&.Copy()\fR
+method\&.
+.RE
+.PP
+\-\-warn=deprecated\-source\-signatures, \-\-warn=no\-deprecated\-source\-signatures
+.RS 4
+Enables or disables warnings about use of the deprecated
+\fBSourceSignatures()\fR
+function or
+\fBenv\&.SourceSignatures()\fR
+method\&.
+.RE
+.PP
+\-\-warn=deprecated\-target\-signatures, \-\-warn=no\-deprecated\-target\-signatures
+.RS 4
+Enables or disables warnings about use of the deprecated
+\fBTargetSignatures()\fR
+function or
+\fBenv\&.TargetSignatures()\fR
+method\&.
+.RE
+.RE
+.PP
+\-\-warn=duplicate\-environment, \-\-warn=no\-duplicate\-environment
+.RS 4
+Enables or disables warnings about attempts to specify a build of a target with two different construction environments that use the same action\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=fortran\-cxx\-mix, \-\-warn=no\-fortran\-cxx\-mix
+.RS 4
+Enables or disables the specific warning about linking Fortran and C++ object files in a single executable, which can yield unpredictable behavior with some compilers\&.
+.RE
+.PP
+\-\-warn=future\-deprecated, \-\-warn=no\-future\-deprecated
+.RS 4
+Enables or disables warnings about features that will be deprecated in the future\&. These warnings are disabled by default\&. Enabling this warning is especially recommended for projects that redistribute SCons configurations for other users to build, so that the project can be warned as soon as possible about to\-be\-deprecated features that may require changes to the configuration\&.
+.RE
+.PP
+\-\-warn=link, \-\-warn=no\-link
+.RS 4
+Enables or disables warnings about link steps\&.
+.RE
+.PP
+\-\-warn=misleading\-keywords, \-\-warn=no\-misleading\-keywords
+.RS 4
+Enables or disables warnings about use of the misspelled keywords
+\fBtargets\fR
+and
+\fBsources\fR
+when calling Builders\&. (Note the last
+\fBs\fR
+characters, the correct spellings are
+\fBtarget\fR
+and
+\fBsource\&.)\fR
+These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=missing\-sconscript, \-\-warn=no\-missing\-sconscript
+.RS 4
+Enables or disables warnings about missing SConscript files\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=no\-md5\-module, \-\-warn=no\-no\-md5\-module
+.RS 4
+Enables or disables warnings about the version of Python not having an MD5 checksum module available\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=no\-metaclass\-support, \-\-warn=no\-no\-metaclass\-support
+.RS 4
+Enables or disables warnings about the version of Python not supporting metaclasses when the
+\fB\-\-debug=memoizer\fR
+option is used\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=no\-object\-count, \-\-warn=no\-no\-object\-count
+.RS 4
+Enables or disables warnings about the
+\fB\-\-debug=object\fR
+feature not working when
+\fBscons\fR
+is run with the python
+\fB\-O\fR
+option or from optimized Python (\&.pyo) modules\&.
+.RE
+.PP
+\-\-warn=no\-parallel\-support, \-\-warn=no\-no\-parallel\-support
+.RS 4
+Enables or disables warnings about the version of Python not being able to support parallel builds when the
+\fB\-j\fR
+option is used\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=python\-version, \-\-warn=no\-python\-version
+.RS 4
+Enables or disables the warning about running SCons with a deprecated version of Python\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=reserved\-variable, \-\-warn=no\-reserved\-variable
+.RS 4
+Enables or disables warnings about attempts to set the reserved construction variable names
+\fBCHANGED_SOURCES\fR,
+\fBCHANGED_TARGETS\fR,
+\fBTARGET\fR,
+\fBTARGETS\fR,
+\fBSOURCE\fR,
+\fBSOURCES\fR,
+\fBUNCHANGED_SOURCES\fR
+or
+\fBUNCHANGED_TARGETS\fR\&. These warnings are disabled by default\&.
+.RE
+.PP
+\-\-warn=stack\-size, \-\-warn=no\-stack\-size
+.RS 4
+Enables or disables warnings about requests to set the stack size that could not be honored\&. These warnings are enabled by default\&.
+.RE
+.PP
+\-\-warn=target_not_build, \-\-warn=no\-target_not_built
+.RS 4
+Enables or disables warnings about a build rule not building the expected targets\&. These warnings are not currently enabled by default\&.
+.RE
+.PP
+\-Y\fI repository\fR, \-\-repository=\fIrepository\fR, \-\-srcdir=\fIrepository\fR
+.RS 4
+Search the specified repository for any input and target files not found in the local directory hierarchy\&. Multiple
+\fB\-Y\fR
+options may be specified, in which case the repositories are searched in the order specified\&.
+.RE
+.SH "CONFIGURATION FILE REFERENCE"
+.SS "Construction Environments"
+.PP
+A construction environment is the basic means by which the SConscript files communicate build information to
+\fBscons\fR\&. A new construction environment is created using the
+\fBEnvironment\fR
+function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Variables, called
+\fIconstruction\fR
+\fIvariables\fR, may be set in a construction environment either by specifying them as keywords when the object is created or by assigning them a value after the object is created:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(FOO = \*(Aqfoo\*(Aq)
+env[\*(AqBAR\*(Aq] = \*(Aqbar\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+As a convenience, construction variables may also be set or modified by the
+\fIparse_flags\fR
+keyword argument, which applies the
+\fBParseFlags\fR
+method (described below) to the argument value after all other processing is completed\&. This is useful either if the exact content of the flags is unknown (for example, read from a control file) or if the flags are distributed to a number of construction variables\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(parse_flags = \*(Aq\-Iinclude \-DEBUG \-lm\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+This example adds \*(Aqinclude\*(Aq to
+\fBCPPPATH\fR, \*(AqEBUG\*(Aq to
+\fBCPPDEFINES\fR, and \*(Aqm\*(Aq to
+\fBLIBS\fR\&.
+.PP
+By default, a new construction environment is initialized with a set of builder methods and construction variables that are appropriate for the current platform\&. An optional platform keyword argument may be used to specify that an environment should be initialized for a different platform:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(platform = \*(Aqcygwin\*(Aq)
+env = Environment(platform = \*(Aqos2\*(Aq)
+env = Environment(platform = \*(Aqposix\*(Aq)
+env = Environment(platform = \*(Aqwin32\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Specifying a platform initializes the appropriate construction variables in the environment to use and generate file names with prefixes and suffixes appropriate for the platform\&.
+.PP
+Note that the
+\fBwin32\fR
+platform adds the
+\fBSystemDrive\fR
+and
+\fBSystemRoot\fR
+variables from the user\*(Aqs external environment to the construction environment\*(Aqs
+\fBENV\fR
+dictionary\&. This is so that any executed commands that use sockets to connect with other systems (such as fetching source files from external CVS repository specifications like
+\fB:pserver:anonymous@cvs\&.sourceforge\&.net:/cvsroot/scons\fR) will work on Windows systems\&.
+.PP
+The platform argument may be function or callable object, in which case the Environment() method will call the specified argument to update the new construction environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_platform(env):
+ env[\*(AqVAR\*(Aq] = \*(Aqxyzzy\*(Aq
+
+env = Environment(platform = my_platform)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Additionally, a specific set of tools with which to initialize the environment may be specified as an optional keyword argument:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools = [\*(Aqmsvc\*(Aq, \*(Aqlex\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Non\-built\-in tools may be specified using the toolpath argument:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools = [\*(Aqdefault\*(Aq, \*(Aqfoo\*(Aq], toolpath = [\*(Aqtools\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+This looks for a tool specification in tools/foo\&.py (as well as using the ordinary default tools for the platform)\&. foo\&.py should have two functions: generate(env, **kw) and exists(env)\&. The
+\fBgenerate()\fR
+function modifies the passed\-in environment to set up variables so that the tool can be executed; it may use any keyword arguments that the user supplies (see below) to vary its initialization\&. The
+\fBexists()\fR
+function should return a true value if the tool is available\&. Tools in the toolpath are used before any of the built\-in ones\&. For example, adding gcc\&.py to the toolpath would override the built\-in gcc tool\&. Also note that the toolpath is stored in the environment for use by later calls to
+\fBClone\fR() and
+\fBTool\fR() methods:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+base = Environment(toolpath=[\*(Aqcustom_path\*(Aq])
+derived = base\&.Clone(tools=[\*(Aqcustom_tool\*(Aq])
+derived\&.CustomBuilder()
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The elements of the tools list may also be functions or callable objects, in which case the Environment() method will call the specified elements to update the new construction environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_tool(env):
+ env[\*(AqXYZZY\*(Aq] = \*(Aqxyzzy\*(Aq
+
+env = Environment(tools = [my_tool])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The individual elements of the tools list may also themselves be two\-element lists of the form (\fItoolname\fR,
+\fIkw_dict\fR)\&. SCons searches for the
+\fItoolname\fR
+specification file as described above, and passes
+\fIkw_dict\fR, which must be a dictionary, as keyword arguments to the tool\*(Aqs
+\fBgenerate\fR
+function\&. The
+\fBgenerate\fR
+function can use the arguments to modify the tool\*(Aqs behavior by setting up the environment in different ways or otherwise changing its initialization\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# in tools/my_tool\&.py:
+def generate(env, **kw):
+ # Sets MY_TOOL to the value of keyword argument \*(Aqarg1\*(Aq or 1\&.
+ env[\*(AqMY_TOOL\*(Aq] = kw\&.get(\*(Aqarg1\*(Aq, \*(Aq1\*(Aq)
+def exists(env):
+ return 1
+
+# in SConstruct:
+env = Environment(tools = [\*(Aqdefault\*(Aq, (\*(Aqmy_tool\*(Aq, {\*(Aqarg1\*(Aq: \*(Aqabc\*(Aq})],
+ toolpath=[\*(Aqtools\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The tool definition (i\&.e\&. my_tool()) can use the PLATFORM variable from the environment it receives to customize the tool for different platforms\&.
+.PP
+If no tool list is specified, then SCons will auto\-detect the installed tools using the PATH variable in the ENV construction variable and the platform name when the Environment is constructed\&. Changing the PATH variable after the Environment is constructed will not cause the tools to be redetected\&.
+.PP
+SCons supports the following tool specifications out of the box:
+.PP
+386asm
+.RS 4
+Sets construction variables for the 386ASM assembler for the Phar Lap ETS embedded operating system\&.
+.sp
+Sets:
+\fB$AS\fR,
+\fB$ASCOM\fR,
+\fB$ASFLAGS\fR,
+\fB$ASPPCOM\fR,
+\fB$ASPPFLAGS\fR\&.
+.sp
+Uses:
+\fB$CC\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_CPPINCFLAGS\fR\&.
+.RE
+.PP
+aixc++
+.RS 4
+Sets construction variables for the IMB xlc / Visual Age C++ compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$CXXVERSION\fR,
+\fB$SHCXX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+aixcc
+.RS 4
+Sets construction variables for the IBM xlc / Visual Age C compiler\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCVERSION\fR,
+\fB$SHCC\fR\&.
+.RE
+.PP
+aixf77
+.RS 4
+Sets construction variables for the IBM Visual Age f77 Fortran compiler\&.
+.sp
+Sets:
+\fB$F77\fR,
+\fB$SHF77\fR\&.
+.RE
+.PP
+aixlink
+.RS 4
+Sets construction variables for the IBM Visual Age linker\&.
+.sp
+Sets:
+\fB$LINKFLAGS\fR,
+\fB$SHLIBSUFFIX\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+applelink
+.RS 4
+Sets construction variables for the Apple linker (similar to the GNU linker)\&.
+.sp
+Sets:
+\fB$FRAMEWORKPATHPREFIX\fR,
+\fB$LDMODULECOM\fR,
+\fB$LDMODULEFLAGS\fR,
+\fB$LDMODULEPREFIX\fR,
+\fB$LDMODULESUFFIX\fR,
+\fB$LINKCOM\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR,
+\fB$_FRAMEWORKPATH\fR,
+\fB$_FRAMEWORKS\fR\&.
+.sp
+Uses:
+\fB$FRAMEWORKSFLAGS\fR\&.
+.RE
+.PP
+ar
+.RS 4
+Sets construction variables for the
+ar
+library archiver\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOM\fR,
+\fB$ARFLAGS\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR,
+\fB$RANLIB\fR,
+\fB$RANLIBCOM\fR,
+\fB$RANLIBFLAGS\fR\&.
+.RE
+.PP
+as
+.RS 4
+Sets construction variables for the
+as
+assembler\&.
+.sp
+Sets:
+\fB$AS\fR,
+\fB$ASCOM\fR,
+\fB$ASFLAGS\fR,
+\fB$ASPPCOM\fR,
+\fB$ASPPFLAGS\fR\&.
+.sp
+Uses:
+\fB$CC\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_CPPINCFLAGS\fR\&.
+.RE
+.PP
+bcc32
+.RS 4
+Sets construction variables for the bcc32 compiler\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCCOM\fR,
+\fB$CCFLAGS\fR,
+\fB$CFILESUFFIX\fR,
+\fB$CFLAGS\fR,
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR,
+\fB$SHCC\fR,
+\fB$SHCCCOM\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHCFLAGS\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.sp
+Uses:
+\fB$_CPPDEFFLAGS\fR,
+\fB$_CPPINCFLAGS\fR\&.
+.RE
+.PP
+BitKeeper
+.RS 4
+Sets construction variables for the BitKeeper source code control system\&.
+.sp
+Sets:
+\fB$BITKEEPER\fR,
+\fB$BITKEEPERCOM\fR,
+\fB$BITKEEPERGET\fR,
+\fB$BITKEEPERGETFLAGS\fR\&.
+.sp
+Uses:
+\fB$BITKEEPERCOMSTR\fR\&.
+.RE
+.PP
+cc
+.RS 4
+Sets construction variables for generic POSIX C copmilers\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCCOM\fR,
+\fB$CCFLAGS\fR,
+\fB$CFILESUFFIX\fR,
+\fB$CFLAGS\fR,
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$FRAMEWORKPATH\fR,
+\fB$FRAMEWORKS\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR,
+\fB$SHCC\fR,
+\fB$SHCCCOM\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHCFLAGS\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.sp
+Uses:
+\fB$PLATFORM\fR\&.
+.RE
+.PP
+cvf
+.RS 4
+Sets construction variables for the Compaq Visual Fortran compiler\&.
+.sp
+Sets:
+\fB$FORTRAN\fR,
+\fB$FORTRANCOM\fR,
+\fB$FORTRANMODDIR\fR,
+\fB$FORTRANMODDIRPREFIX\fR,
+\fB$FORTRANMODDIRSUFFIX\fR,
+\fB$FORTRANPPCOM\fR,
+\fB$OBJSUFFIX\fR,
+\fB$SHFORTRANCOM\fR,
+\fB$SHFORTRANPPCOM\fR\&.
+.sp
+Uses:
+\fB$CPPFLAGS\fR,
+\fB$FORTRANFLAGS\fR,
+\fB$SHFORTRANFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_FORTRANINCFLAGS\fR,
+\fB$_FORTRANMODFLAG\fR\&.
+.RE
+.PP
+CVS
+.RS 4
+Sets construction variables for the CVS source code management system\&.
+.sp
+Sets:
+\fB$CVS\fR,
+\fB$CVSCOFLAGS\fR,
+\fB$CVSCOM\fR,
+\fB$CVSFLAGS\fR\&.
+.sp
+Uses:
+\fB$CVSCOMSTR\fR\&.
+.RE
+.PP
+cXX
+.RS 4
+Sets construction variables for generic POSIX C++ compilers\&.
+.sp
+Sets:
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$CXX\fR,
+\fB$CXXCOM\fR,
+\fB$CXXFILESUFFIX\fR,
+\fB$CXXFLAGS\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR,
+\fB$OBJSUFFIX\fR,
+\fB$SHCXX\fR,
+\fB$SHCXXCOM\fR,
+\fB$SHCXXFLAGS\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.sp
+Uses:
+\fB$CXXCOMSTR\fR\&.
+.RE
+.PP
+default
+.RS 4
+Sets variables by calling a default list of Tool modules for the platform on which SCons is running\&.
+.RE
+.PP
+dmd
+.RS 4
+Sets construction variables for D language compiler DMD\&.
+.sp
+Sets:
+\fB$DC\fR,
+\fB$DCOM\fR,
+\fB$DDEBUG\fR,
+\fB$DDEBUGPREFIX\fR,
+\fB$DDEBUGSUFFIX\fR,
+\fB$DFILESUFFIX\fR,
+\fB$DFLAGPREFIX\fR,
+\fB$DFLAGS\fR,
+\fB$DFLAGSUFFIX\fR,
+\fB$DINCPREFIX\fR,
+\fB$DINCSUFFIX\fR,
+\fB$DLIB\fR,
+\fB$DLIBCOM\fR,
+\fB$DLIBDIRPREFIX\fR,
+\fB$DLIBDIRSUFFIX\fR,
+\fB$DLIBFLAGPREFIX\fR,
+\fB$DLIBFLAGSUFFIX\fR,
+\fB$DLIBLINKPREFIX\fR,
+\fB$DLIBLINKSUFFIX\fR,
+\fB$DLINK\fR,
+\fB$DLINKCOM\fR,
+\fB$DLINKFLAGS\fR,
+\fB$DPATH\fR,
+\fB$DVERPREFIX\fR,
+\fB$DVERSIONS\fR,
+\fB$DVERSUFFIX\fR,
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHDC\fR,
+\fB$SHDCOM\fR,
+\fB$SHDLINK\fR,
+\fB$SHDLINKCOM\fR,
+\fB$SHDLINKFLAGS\fR,
+\fB$_DDEBUGFLAGS\fR,
+\fB$_DFLAGS\fR,
+\fB$_DINCFLAGS\fR,
+\fB$_DLIBDIRFLAGS\fR,
+\fB$_DLIBFLAGS\fR,
+\fB$_DLIBFLAGS\fR,
+\fB$_DVERFLAGS\fR,
+\fB$_RPATH\fR\&.
+.RE
+.PP
+docbook
+.RS 4
+This tool tries to make working with Docbook in SCons a little easier\&. It provides several toolchains for creating different output formats, like HTML or PDF\&. Contained in the package is a distribution of the Docbook XSL stylesheets as of version 1\&.76\&.1\&. As long as you don\*(Aqt specify your own stylesheets for customization, these official versions are picked as default\&.\&.\&.which should reduce the inevitable setup hassles for you\&.
+.sp
+Implicit dependencies to images and XIncludes are detected automatically if you meet the HTML requirements\&. The additional stylesheet
+utils/xmldepend\&.xsl
+by Paul DuBois is used for this purpose\&.
+.sp
+Note, that there is no support for XML catalog resolving offered! This tool calls the XSLT processors and PDF renderers with the stylesheets you specified, that\*(Aqs it\&. The rest lies in your hands and you still have to know what you\*(Aqre doing when resolving names via a catalog\&.
+.sp
+For activating the tool "docbook", you have to add its name to the Environment constructor, like this
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+On its startup, the Docbook tool tries to find a required
+xsltproc
+processor, and a PDF renderer, e\&.g\&.
+fop\&. So make sure that these are added to your system\*(Aqs environment
+PATH
+and can be called directly, without specifying their full path\&.
+.sp
+For the most basic processing of Docbook to HTML, you need to have installed
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the Python
+lxml
+binding to
+libxml2, or
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the direct Python bindings for
+libxml2/libxslt, or
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+a standalone XSLT processor, currently detected are
+xsltproc,
+saxon,
+saxon\-xslt
+and
+xalan\&.
+.RE
+.sp
+Rendering to PDF requires you to have one of the applications
+fop
+or
+xep
+installed\&.
+.sp
+Creating a HTML or PDF document is very simple and straightforward\&. Say
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+to get both outputs from your XML source
+manual\&.xml\&. As a shortcut, you can give the stem of the filenames alone, like this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml(\*(Aqmanual\*(Aq)
+env\&.DocbookPdf(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+and get the same result\&. Target and source lists are also supported:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml([\*(Aqmanual\&.html\*(Aq,\*(Aqreference\&.html\*(Aq], [\*(Aqmanual\&.xml\*(Aq,\*(Aqreference\&.xml\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or even
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml([\*(Aqmanual\*(Aq,\*(Aqreference\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBImportant\fR
+.ps -1
+.br
+Whenever you leave out the list of sources, you may not specify a file extension! The Tool uses the given names as file stems, and adds the suffixes for target and source files accordingly\&.
+.sp .5v
+.RE
+The rules given above are valid for the Builders
+\fBDocbookHtml\fR,
+\fBDocbookPdf\fR,
+\fBDocbookEpub\fR,
+\fBDocbookSlidesPdf\fR
+and
+\fBDocbookXInclude\fR\&. For the
+\fBDocbookMan\fR
+transformation you can specify a target name, but the actual output names are automatically set from the
+refname
+entries in your XML source\&.
+.sp
+The Builders
+\fBDocbookHtmlChunked\fR,
+\fBDocbookHtmlhelp\fR
+and
+\fBDocbookSlidesHtml\fR
+are special, in that:
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 1." 4.2
+.\}
+they create a large set of files, where the exact names and their number depend on the content of the source file, and
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 2." 4.2
+.\}
+the main target is always named
+index\&.html, i\&.e\&. the output name for the XSL transformation is not picked up by the stylesheets\&.
+.RE
+.sp
+As a result, there is simply no use in specifying a target HTML name\&. So the basic syntax for these builders is always:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If you want to use a specific XSL file, you can set the additional
+xsl
+parameter to your Builder call as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.DocbookHtml(\*(Aqother\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqhtml\&.xsl\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Since this may get tedious if you always use the same local naming for your customized XSL files, e\&.g\&.
+html\&.xsl
+for HTML and
+pdf\&.xsl
+for PDF output, a set of variables for setting the default XSL name is provided\&. These are:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+DOCBOOK_DEFAULT_XSL_HTML
+DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
+DOCBOOK_DEFAULT_XSL_HTMLHELP
+DOCBOOK_DEFAULT_XSL_PDF
+DOCBOOK_DEFAULT_XSL_EPUB
+DOCBOOK_DEFAULT_XSL_MAN
+DOCBOOK_DEFAULT_XSL_SLIDESPDF
+DOCBOOK_DEFAULT_XSL_SLIDESHTML
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+and you can set them when constructing your environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq],
+ DOCBOOK_DEFAULT_XSL_HTML=\*(Aqhtml\&.xsl\*(Aq,
+ DOCBOOK_DEFAULT_XSL_PDF=\*(Aqpdf\&.xsl\*(Aq)
+env\&.DocbookHtml(\*(Aqmanual\*(Aq) # now uses html\&.xsl
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Sets:
+\fB$DOCBOOK_DEFAULT_XSL_EPUB\fR,
+\fB$DOCBOOK_DEFAULT_XSL_HTML\fR,
+\fB$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED\fR,
+\fB$DOCBOOK_DEFAULT_XSL_HTMLHELP\fR,
+\fB$DOCBOOK_DEFAULT_XSL_MAN\fR,
+\fB$DOCBOOK_DEFAULT_XSL_PDF\fR,
+\fB$DOCBOOK_DEFAULT_XSL_SLIDESHTML\fR,
+\fB$DOCBOOK_DEFAULT_XSL_SLIDESPDF\fR,
+\fB$DOCBOOK_FOP\fR,
+\fB$DOCBOOK_FOPCOM\fR,
+\fB$DOCBOOK_FOPFLAGS\fR,
+\fB$DOCBOOK_XMLLINT\fR,
+\fB$DOCBOOK_XMLLINTCOM\fR,
+\fB$DOCBOOK_XMLLINTFLAGS\fR,
+\fB$DOCBOOK_XSLTPROC\fR,
+\fB$DOCBOOK_XSLTPROCCOM\fR,
+\fB$DOCBOOK_XSLTPROCFLAGS\fR,
+\fB$DOCBOOK_XSLTPROCPARAMS\fR\&.
+.sp
+Uses:
+\fB$DOCBOOK_FOPCOMSTR\fR,
+\fB$DOCBOOK_XMLLINTCOMSTR\fR,
+\fB$DOCBOOK_XSLTPROCCOMSTR\fR\&.
+.RE
+.PP
+dvi
+.RS 4
+Attaches the
+\fBDVI\fR
+builder to the construction environment\&.
+.RE
+.PP
+dvipdf
+.RS 4
+Sets construction variables for the dvipdf utility\&.
+.sp
+Sets:
+\fB$DVIPDF\fR,
+\fB$DVIPDFCOM\fR,
+\fB$DVIPDFFLAGS\fR\&.
+.sp
+Uses:
+\fB$DVIPDFCOMSTR\fR\&.
+.RE
+.PP
+dvips
+.RS 4
+Sets construction variables for the dvips utility\&.
+.sp
+Sets:
+\fB$DVIPS\fR,
+\fB$DVIPSFLAGS\fR,
+\fB$PSCOM\fR,
+\fB$PSPREFIX\fR,
+\fB$PSSUFFIX\fR\&.
+.sp
+Uses:
+\fB$PSCOMSTR\fR\&.
+.RE
+.PP
+f03
+.RS 4
+Set construction variables for generic POSIX Fortran 03 compilers\&.
+.sp
+Sets:
+\fB$F03\fR,
+\fB$F03COM\fR,
+\fB$F03FLAGS\fR,
+\fB$F03PPCOM\fR,
+\fB$SHF03\fR,
+\fB$SHF03COM\fR,
+\fB$SHF03FLAGS\fR,
+\fB$SHF03PPCOM\fR,
+\fB$_F03INCFLAGS\fR\&.
+.sp
+Uses:
+\fB$F03COMSTR\fR,
+\fB$F03PPCOMSTR\fR,
+\fB$SHF03COMSTR\fR,
+\fB$SHF03PPCOMSTR\fR\&.
+.RE
+.PP
+f08
+.RS 4
+Set construction variables for generic POSIX Fortran 08 compilers\&.
+.sp
+Sets:
+\fB$F08\fR,
+\fB$F08COM\fR,
+\fB$F08FLAGS\fR,
+\fB$F08PPCOM\fR,
+\fB$SHF08\fR,
+\fB$SHF08COM\fR,
+\fB$SHF08FLAGS\fR,
+\fB$SHF08PPCOM\fR,
+\fB$_F08INCFLAGS\fR\&.
+.sp
+Uses:
+\fB$F08COMSTR\fR,
+\fB$F08PPCOMSTR\fR,
+\fB$SHF08COMSTR\fR,
+\fB$SHF08PPCOMSTR\fR\&.
+.RE
+.PP
+f77
+.RS 4
+Set construction variables for generic POSIX Fortran 77 compilers\&.
+.sp
+Sets:
+\fB$F77\fR,
+\fB$F77COM\fR,
+\fB$F77FILESUFFIXES\fR,
+\fB$F77FLAGS\fR,
+\fB$F77PPCOM\fR,
+\fB$F77PPFILESUFFIXES\fR,
+\fB$FORTRAN\fR,
+\fB$FORTRANCOM\fR,
+\fB$FORTRANFLAGS\fR,
+\fB$SHF77\fR,
+\fB$SHF77COM\fR,
+\fB$SHF77FLAGS\fR,
+\fB$SHF77PPCOM\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANCOM\fR,
+\fB$SHFORTRANFLAGS\fR,
+\fB$SHFORTRANPPCOM\fR,
+\fB$_F77INCFLAGS\fR\&.
+.sp
+Uses:
+\fB$F77COMSTR\fR,
+\fB$F77PPCOMSTR\fR,
+\fB$FORTRANCOMSTR\fR,
+\fB$FORTRANPPCOMSTR\fR,
+\fB$SHF77COMSTR\fR,
+\fB$SHF77PPCOMSTR\fR,
+\fB$SHFORTRANCOMSTR\fR,
+\fB$SHFORTRANPPCOMSTR\fR\&.
+.RE
+.PP
+f90
+.RS 4
+Set construction variables for generic POSIX Fortran 90 compilers\&.
+.sp
+Sets:
+\fB$F90\fR,
+\fB$F90COM\fR,
+\fB$F90FLAGS\fR,
+\fB$F90PPCOM\fR,
+\fB$SHF90\fR,
+\fB$SHF90COM\fR,
+\fB$SHF90FLAGS\fR,
+\fB$SHF90PPCOM\fR,
+\fB$_F90INCFLAGS\fR\&.
+.sp
+Uses:
+\fB$F90COMSTR\fR,
+\fB$F90PPCOMSTR\fR,
+\fB$SHF90COMSTR\fR,
+\fB$SHF90PPCOMSTR\fR\&.
+.RE
+.PP
+f95
+.RS 4
+Set construction variables for generic POSIX Fortran 95 compilers\&.
+.sp
+Sets:
+\fB$F95\fR,
+\fB$F95COM\fR,
+\fB$F95FLAGS\fR,
+\fB$F95PPCOM\fR,
+\fB$SHF95\fR,
+\fB$SHF95COM\fR,
+\fB$SHF95FLAGS\fR,
+\fB$SHF95PPCOM\fR,
+\fB$_F95INCFLAGS\fR\&.
+.sp
+Uses:
+\fB$F95COMSTR\fR,
+\fB$F95PPCOMSTR\fR,
+\fB$SHF95COMSTR\fR,
+\fB$SHF95PPCOMSTR\fR\&.
+.RE
+.PP
+fortran
+.RS 4
+Set construction variables for generic POSIX Fortran compilers\&.
+.sp
+Sets:
+\fB$FORTRAN\fR,
+\fB$FORTRANCOM\fR,
+\fB$FORTRANFLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANCOM\fR,
+\fB$SHFORTRANFLAGS\fR,
+\fB$SHFORTRANPPCOM\fR\&.
+.sp
+Uses:
+\fB$FORTRANCOMSTR\fR,
+\fB$FORTRANPPCOMSTR\fR,
+\fB$SHFORTRANCOMSTR\fR,
+\fB$SHFORTRANPPCOMSTR\fR\&.
+.RE
+.PP
+g++
+.RS 4
+Set construction variables for the
+gXX
+C++ compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$CXXVERSION\fR,
+\fB$SHCXXFLAGS\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+g77
+.RS 4
+Set construction variables for the
+g77
+Fortran compiler\&. Calls the
+f77
+Tool module to set variables\&.
+.RE
+.PP
+gas
+.RS 4
+Sets construction variables for the
+gas
+assembler\&. Calls the
+as
+module\&.
+.sp
+Sets:
+\fB$AS\fR\&.
+.RE
+.PP
+gcc
+.RS 4
+Set construction variables for the
+gcc
+C compiler\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCVERSION\fR,
+\fB$SHCCFLAGS\fR\&.
+.RE
+.PP
+gdc
+.RS 4
+Sets construction variables for the D language compiler GDC\&.
+.sp
+Sets:
+\fB$DC\fR,
+\fB$DCOM\fR,
+\fB$DDEBUG\fR,
+\fB$DDEBUGPREFIX\fR,
+\fB$DDEBUGSUFFIX\fR,
+\fB$DFILESUFFIX\fR,
+\fB$DFLAGPREFIX\fR,
+\fB$DFLAGS\fR,
+\fB$DFLAGSUFFIX\fR,
+\fB$DINCPREFIX\fR,
+\fB$DINCSUFFIX\fR,
+\fB$DLIB\fR,
+\fB$DLIBCOM\fR,
+\fB$DLIBFLAGPREFIX\fR,
+\fB$DLIBFLAGSUFFIX\fR,
+\fB$DLINK\fR,
+\fB$DLINKCOM\fR,
+\fB$DLINKFLAGPREFIX\fR,
+\fB$DLINKFLAGS\fR,
+\fB$DLINKFLAGSUFFIX\fR,
+\fB$DPATH\fR,
+\fB$DVERPREFIX\fR,
+\fB$DVERSIONS\fR,
+\fB$DVERSUFFIX\fR,
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHDC\fR,
+\fB$SHDCOM\fR,
+\fB$SHDLINK\fR,
+\fB$SHDLINKCOM\fR,
+\fB$SHDLINKFLAGS\fR,
+\fB$_DDEBUGFLAGS\fR,
+\fB$_DFLAGS\fR,
+\fB$_DINCFLAGS\fR,
+\fB$_DLIBFLAGS\fR,
+\fB$_DVERFLAGS\fR,
+\fB$_RPATH\fR\&.
+.RE
+.PP
+gettext
+.RS 4
+This is actually a toolset, which supports internationalization and localization of sofware being constructed with SCons\&. The toolset loads following tools:
+.sp
+
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+
+xgettext
+\- to extract internationalized messages from source code to
+POT
+file(s),
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+
+msginit
+\- may be optionally used to initialize
+PO
+files,
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+
+msgmerge
+\- to update
+PO
+files, that already contain translated messages,
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+
+msgfmt
+\- to compile textual
+PO
+file to binary installable
+MO
+file\&.
+.RE
+.sp
+When you enable
+gettext, it internally loads all abovementioned tools, so you\*(Aqre encouraged to see their individual documentation\&.
+.sp
+Each of the above tools provides its own builder(s) which may be used to perform particular activities related to software internationalization\&. You may be however interested in
+\fItop\-level\fR
+builder
+\fBTranslate\fR
+described few paragraphs later\&.
+.sp
+To use
+gettext
+tools add
+\*(Aqgettext\*(Aq
+tool to your environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqgettext\*(Aq] )
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+gfortran
+.RS 4
+Sets construction variables for the GNU F95/F2003 GNU compiler\&.
+.sp
+Sets:
+\fB$F77\fR,
+\fB$F90\fR,
+\fB$F95\fR,
+\fB$FORTRAN\fR,
+\fB$SHF77\fR,
+\fB$SHF77FLAGS\fR,
+\fB$SHF90\fR,
+\fB$SHF90FLAGS\fR,
+\fB$SHF95\fR,
+\fB$SHF95FLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANFLAGS\fR\&.
+.RE
+.PP
+gnulink
+.RS 4
+Set construction variables for GNU linker/loader\&.
+.sp
+Sets:
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+gs
+.RS 4
+This Tool sets the required construction variables for working with the Ghostscript command\&. It also registers an appropriate Action with the PDF Builder (\fBPDF\fR), such that the conversion from PS/EPS to PDF happens automatically for the TeX/LaTeX toolchain\&. Finally, it adds an explicit Ghostscript Builder (\fBGs\fR) to the environment\&.
+.sp
+Sets:
+\fB$GS\fR,
+\fB$GSCOM\fR,
+\fB$GSFLAGS\fR\&.
+.sp
+Uses:
+\fB$GSCOMSTR\fR\&.
+.RE
+.PP
+hpc++
+.RS 4
+Set construction variables for the compilers aCC on HP/UX systems\&.
+.RE
+.PP
+hpcc
+.RS 4
+Set construction variables for the
+aCC
+on HP/UX systems\&. Calls the
+cXX
+tool for additional variables\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$CXXVERSION\fR,
+\fB$SHCXXFLAGS\fR\&.
+.RE
+.PP
+hplink
+.RS 4
+Sets construction variables for the linker on HP/UX systems\&.
+.sp
+Sets:
+\fB$LINKFLAGS\fR,
+\fB$SHLIBSUFFIX\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+icc
+.RS 4
+Sets construction variables for the
+icc
+compiler on OS/2 systems\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCCOM\fR,
+\fB$CFILESUFFIX\fR,
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$CXXCOM\fR,
+\fB$CXXFILESUFFIX\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR\&.
+.sp
+Uses:
+\fB$CCFLAGS\fR,
+\fB$CFLAGS\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_CPPINCFLAGS\fR\&.
+.RE
+.PP
+icl
+.RS 4
+Sets construction variables for the Intel C/C++ compiler\&. Calls the
+intelc
+Tool module to set its variables\&.
+.RE
+.PP
+ifl
+.RS 4
+Sets construction variables for the Intel Fortran compiler\&.
+.sp
+Sets:
+\fB$FORTRAN\fR,
+\fB$FORTRANCOM\fR,
+\fB$FORTRANPPCOM\fR,
+\fB$SHFORTRANCOM\fR,
+\fB$SHFORTRANPPCOM\fR\&.
+.sp
+Uses:
+\fB$CPPFLAGS\fR,
+\fB$FORTRANFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_FORTRANINCFLAGS\fR\&.
+.RE
+.PP
+ifort
+.RS 4
+Sets construction variables for newer versions of the Intel Fortran compiler for Linux\&.
+.sp
+Sets:
+\fB$F77\fR,
+\fB$F90\fR,
+\fB$F95\fR,
+\fB$FORTRAN\fR,
+\fB$SHF77\fR,
+\fB$SHF77FLAGS\fR,
+\fB$SHF90\fR,
+\fB$SHF90FLAGS\fR,
+\fB$SHF95\fR,
+\fB$SHF95FLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANFLAGS\fR\&.
+.RE
+.PP
+ilink
+.RS 4
+Sets construction variables for the
+ilink
+linker on OS/2 systems\&.
+.sp
+Sets:
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$LINKFLAGS\fR\&.
+.RE
+.PP
+ilink32
+.RS 4
+Sets construction variables for the Borland
+ilink32
+linker\&.
+.sp
+Sets:
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$LINKFLAGS\fR\&.
+.RE
+.PP
+install
+.RS 4
+Sets construction variables for file and directory installation\&.
+.sp
+Sets:
+\fB$INSTALL\fR,
+\fB$INSTALLSTR\fR\&.
+.RE
+.PP
+intelc
+.RS 4
+Sets construction variables for the Intel C/C++ compiler (Linux and Windows, version 7 and later)\&. Calls the
+gcc
+or
+msvc
+(on Linux and Windows, respectively) to set underlying variables\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$CC\fR,
+\fB$CXX\fR,
+\fB$INTEL_C_COMPILER_VERSION\fR,
+\fB$LINK\fR\&.
+.RE
+.PP
+jar
+.RS 4
+Sets construction variables for the
+jar
+utility\&.
+.sp
+Sets:
+\fB$JAR\fR,
+\fB$JARCOM\fR,
+\fB$JARFLAGS\fR,
+\fB$JARSUFFIX\fR\&.
+.sp
+Uses:
+\fB$JARCOMSTR\fR\&.
+.RE
+.PP
+javac
+.RS 4
+Sets construction variables for the
+javac
+compiler\&.
+.sp
+Sets:
+\fB$JAVABOOTCLASSPATH\fR,
+\fB$JAVAC\fR,
+\fB$JAVACCOM\fR,
+\fB$JAVACFLAGS\fR,
+\fB$JAVACLASSPATH\fR,
+\fB$JAVACLASSSUFFIX\fR,
+\fB$JAVASOURCEPATH\fR,
+\fB$JAVASUFFIX\fR\&.
+.sp
+Uses:
+\fB$JAVACCOMSTR\fR\&.
+.RE
+.PP
+javah
+.RS 4
+Sets construction variables for the
+javah
+tool\&.
+.sp
+Sets:
+\fB$JAVACLASSSUFFIX\fR,
+\fB$JAVAH\fR,
+\fB$JAVAHCOM\fR,
+\fB$JAVAHFLAGS\fR\&.
+.sp
+Uses:
+\fB$JAVACLASSPATH\fR,
+\fB$JAVAHCOMSTR\fR\&.
+.RE
+.PP
+latex
+.RS 4
+Sets construction variables for the
+latex
+utility\&.
+.sp
+Sets:
+\fB$LATEX\fR,
+\fB$LATEXCOM\fR,
+\fB$LATEXFLAGS\fR\&.
+.sp
+Uses:
+\fB$LATEXCOMSTR\fR\&.
+.RE
+.PP
+ldc
+.RS 4
+Sets construction variables for the D language compiler LDC2\&.
+.sp
+Sets:
+\fB$DC\fR,
+\fB$DCOM\fR,
+\fB$DDEBUG\fR,
+\fB$DDEBUGPREFIX\fR,
+\fB$DDEBUGSUFFIX\fR,
+\fB$DFILESUFFIX\fR,
+\fB$DFLAGPREFIX\fR,
+\fB$DFLAGS\fR,
+\fB$DFLAGSUFFIX\fR,
+\fB$DINCPREFIX\fR,
+\fB$DINCSUFFIX\fR,
+\fB$DLIB\fR,
+\fB$DLIBCOM\fR,
+\fB$DLIBDIRPREFIX\fR,
+\fB$DLIBDIRSUFFIX\fR,
+\fB$DLIBFLAGPREFIX\fR,
+\fB$DLIBFLAGSUFFIX\fR,
+\fB$DLIBLINKPREFIX\fR,
+\fB$DLIBLINKSUFFIX\fR,
+\fB$DLINK\fR,
+\fB$DLINKCOM\fR,
+\fB$DLINKFLAGPREFIX\fR,
+\fB$DLINKFLAGS\fR,
+\fB$DLINKFLAGSUFFIX\fR,
+\fB$DPATH\fR,
+\fB$DVERPREFIX\fR,
+\fB$DVERSIONS\fR,
+\fB$DVERSUFFIX\fR,
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHDC\fR,
+\fB$SHDCOM\fR,
+\fB$SHDLINK\fR,
+\fB$SHDLINKCOM\fR,
+\fB$SHDLINKFLAGS\fR,
+\fB$_DDEBUGFLAGS\fR,
+\fB$_DFLAGS\fR,
+\fB$_DINCFLAGS\fR,
+\fB$_DLIBDIRFLAGS\fR,
+\fB$_DLIBFLAGS\fR,
+\fB$_DLIBFLAGS\fR,
+\fB$_DVERFLAGS\fR,
+\fB$_RPATH\fR\&.
+.RE
+.PP
+lex
+.RS 4
+Sets construction variables for the
+lex
+lexical analyser\&.
+.sp
+Sets:
+\fB$LEX\fR,
+\fB$LEXCOM\fR,
+\fB$LEXFLAGS\fR\&.
+.sp
+Uses:
+\fB$LEXCOMSTR\fR\&.
+.RE
+.PP
+link
+.RS 4
+Sets construction variables for generic POSIX linkers\&.
+.sp
+Sets:
+\fB$LDMODULE\fR,
+\fB$LDMODULECOM\fR,
+\fB$LDMODULEFLAGS\fR,
+\fB$LDMODULEPREFIX\fR,
+\fB$LDMODULESUFFIX\fR,
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$LINKFLAGS\fR,
+\fB$SHLIBSUFFIX\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR\&.
+.sp
+Uses:
+\fB$LDMODULECOMSTR\fR,
+\fB$LINKCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+linkloc
+.RS 4
+Sets construction variables for the
+LinkLoc
+linker for the Phar Lap ETS embedded operating system\&.
+.sp
+Sets:
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$LINKFLAGS\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR\&.
+.sp
+Uses:
+\fB$LINKCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+m4
+.RS 4
+Sets construction variables for the
+m4
+macro processor\&.
+.sp
+Sets:
+\fB$M4\fR,
+\fB$M4COM\fR,
+\fB$M4FLAGS\fR\&.
+.sp
+Uses:
+\fB$M4COMSTR\fR\&.
+.RE
+.PP
+masm
+.RS 4
+Sets construction variables for the Microsoft assembler\&.
+.sp
+Sets:
+\fB$AS\fR,
+\fB$ASCOM\fR,
+\fB$ASFLAGS\fR,
+\fB$ASPPCOM\fR,
+\fB$ASPPFLAGS\fR\&.
+.sp
+Uses:
+\fB$ASCOMSTR\fR,
+\fB$ASPPCOMSTR\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_CPPINCFLAGS\fR\&.
+.RE
+.PP
+midl
+.RS 4
+Sets construction variables for the Microsoft IDL compiler\&.
+.sp
+Sets:
+\fB$MIDL\fR,
+\fB$MIDLCOM\fR,
+\fB$MIDLFLAGS\fR\&.
+.sp
+Uses:
+\fB$MIDLCOMSTR\fR\&.
+.RE
+.PP
+mingw
+.RS 4
+Sets construction variables for MinGW (Minimal Gnu on Windows)\&.
+.sp
+Sets:
+\fB$AS\fR,
+\fB$CC\fR,
+\fB$CXX\fR,
+\fB$LDMODULECOM\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR,
+\fB$OBJSUFFIX\fR,
+\fB$RC\fR,
+\fB$RCCOM\fR,
+\fB$RCFLAGS\fR,
+\fB$RCINCFLAGS\fR,
+\fB$RCINCPREFIX\fR,
+\fB$RCINCSUFFIX\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHCXXFLAGS\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR,
+\fB$SHOBJSUFFIX\fR,
+\fB$WINDOWSDEFPREFIX\fR,
+\fB$WINDOWSDEFSUFFIX\fR\&.
+.sp
+Uses:
+\fB$RCCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+msgfmt
+.RS 4
+This scons tool is a part of scons
+gettext
+toolset\&. It provides scons interface to
+\fBmsgfmt(1)\fR
+command, which generates binary message catalog (MO) from a textual translation description (PO)\&.
+.sp
+Sets:
+\fB$MOSUFFIX\fR,
+\fB$MSGFMT\fR,
+\fB$MSGFMTCOM\fR,
+\fB$MSGFMTCOMSTR\fR,
+\fB$MSGFMTFLAGS\fR,
+\fB$POSUFFIX\fR\&.
+.sp
+Uses:
+\fB$LINGUAS_FILE\fR\&.
+.RE
+.PP
+msginit
+.RS 4
+This scons tool is a part of scons
+gettext
+toolset\&. It provides scons interface to
+\fBmsginit(1)\fR
+program, which creates new
+PO
+file, initializing the meta information with values from user\*(Aqs environment (or options)\&.
+.sp
+Sets:
+\fB$MSGINIT\fR,
+\fB$MSGINITCOM\fR,
+\fB$MSGINITCOMSTR\fR,
+\fB$MSGINITFLAGS\fR,
+\fB$POAUTOINIT\fR,
+\fB$POCREATE_ALIAS\fR,
+\fB$POSUFFIX\fR,
+\fB$POTSUFFIX\fR,
+\fB$_MSGINITLOCALE\fR\&.
+.sp
+Uses:
+\fB$LINGUAS_FILE\fR,
+\fB$POAUTOINIT\fR,
+\fB$POTDOMAIN\fR\&.
+.RE
+.PP
+msgmerge
+.RS 4
+This scons tool is a part of scons
+gettext
+toolset\&. It provides scons interface to
+\fBmsgmerge(1)\fR
+command, which merges two Uniform style
+\&.po
+files together\&.
+.sp
+Sets:
+\fB$MSGMERGE\fR,
+\fB$MSGMERGECOM\fR,
+\fB$MSGMERGECOMSTR\fR,
+\fB$MSGMERGEFLAGS\fR,
+\fB$POSUFFIX\fR,
+\fB$POTSUFFIX\fR,
+\fB$POUPDATE_ALIAS\fR\&.
+.sp
+Uses:
+\fB$LINGUAS_FILE\fR,
+\fB$POAUTOINIT\fR,
+\fB$POTDOMAIN\fR\&.
+.RE
+.PP
+mslib
+.RS 4
+Sets construction variables for the Microsoft
+mslib
+library archiver\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOM\fR,
+\fB$ARFLAGS\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR\&.
+.sp
+Uses:
+\fB$ARCOMSTR\fR\&.
+.RE
+.PP
+mslink
+.RS 4
+Sets construction variables for the Microsoft linker\&.
+.sp
+Sets:
+\fB$LDMODULE\fR,
+\fB$LDMODULECOM\fR,
+\fB$LDMODULEFLAGS\fR,
+\fB$LDMODULEPREFIX\fR,
+\fB$LDMODULESUFFIX\fR,
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$LINKFLAGS\fR,
+\fB$REGSVR\fR,
+\fB$REGSVRCOM\fR,
+\fB$REGSVRFLAGS\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR,
+\fB$WIN32DEFPREFIX\fR,
+\fB$WIN32DEFSUFFIX\fR,
+\fB$WIN32EXPPREFIX\fR,
+\fB$WIN32EXPSUFFIX\fR,
+\fB$WINDOWSDEFPREFIX\fR,
+\fB$WINDOWSDEFSUFFIX\fR,
+\fB$WINDOWSEXPPREFIX\fR,
+\fB$WINDOWSEXPSUFFIX\fR,
+\fB$WINDOWSPROGMANIFESTPREFIX\fR,
+\fB$WINDOWSPROGMANIFESTSUFFIX\fR,
+\fB$WINDOWSSHLIBMANIFESTPREFIX\fR,
+\fB$WINDOWSSHLIBMANIFESTSUFFIX\fR,
+\fB$WINDOWS_INSERT_DEF\fR\&.
+.sp
+Uses:
+\fB$LDMODULECOMSTR\fR,
+\fB$LINKCOMSTR\fR,
+\fB$REGSVRCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+mssdk
+.RS 4
+Sets variables for Microsoft Platform SDK and/or Windows SDK\&. Note that unlike most other Tool modules, mssdk does not set construction variables, but sets the
+\fIenvironment variables\fR
+in the environment
+SCons
+uses to execute the Microsoft toolchain:
+%INCLUDE%,
+%LIB%,
+%LIBPATH%
+and
+%PATH%\&.
+.sp
+Uses:
+\fB$MSSDK_DIR\fR,
+\fB$MSSDK_VERSION\fR,
+\fB$MSVS_VERSION\fR\&.
+.RE
+.PP
+msvc
+.RS 4
+Sets construction variables for the Microsoft Visual C/C++ compiler\&.
+.sp
+Sets:
+\fB$BUILDERS\fR,
+\fB$CC\fR,
+\fB$CCCOM\fR,
+\fB$CCFLAGS\fR,
+\fB$CCPCHFLAGS\fR,
+\fB$CCPDBFLAGS\fR,
+\fB$CFILESUFFIX\fR,
+\fB$CFLAGS\fR,
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$CXX\fR,
+\fB$CXXCOM\fR,
+\fB$CXXFILESUFFIX\fR,
+\fB$CXXFLAGS\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR,
+\fB$OBJPREFIX\fR,
+\fB$OBJSUFFIX\fR,
+\fB$PCHCOM\fR,
+\fB$PCHPDBFLAGS\fR,
+\fB$RC\fR,
+\fB$RCCOM\fR,
+\fB$RCFLAGS\fR,
+\fB$SHCC\fR,
+\fB$SHCCCOM\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHCFLAGS\fR,
+\fB$SHCXX\fR,
+\fB$SHCXXCOM\fR,
+\fB$SHCXXFLAGS\fR,
+\fB$SHOBJPREFIX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.sp
+Uses:
+\fB$CCCOMSTR\fR,
+\fB$CXXCOMSTR\fR,
+\fB$PCH\fR,
+\fB$PCHSTOP\fR,
+\fB$PDB\fR,
+\fB$SHCCCOMSTR\fR,
+\fB$SHCXXCOMSTR\fR\&.
+.RE
+.PP
+msvs
+.RS 4
+Sets construction variables for Microsoft Visual Studio\&.
+.sp
+Sets:
+\fB$MSVSBUILDCOM\fR,
+\fB$MSVSCLEANCOM\fR,
+\fB$MSVSENCODING\fR,
+\fB$MSVSPROJECTCOM\fR,
+\fB$MSVSREBUILDCOM\fR,
+\fB$MSVSSCONS\fR,
+\fB$MSVSSCONSCOM\fR,
+\fB$MSVSSCONSCRIPT\fR,
+\fB$MSVSSCONSFLAGS\fR,
+\fB$MSVSSOLUTIONCOM\fR\&.
+.RE
+.PP
+mwcc
+.RS 4
+Sets construction variables for the Metrowerks CodeWarrior compiler\&.
+.sp
+Sets:
+\fB$CC\fR,
+\fB$CCCOM\fR,
+\fB$CFILESUFFIX\fR,
+\fB$CPPDEFPREFIX\fR,
+\fB$CPPDEFSUFFIX\fR,
+\fB$CXX\fR,
+\fB$CXXCOM\fR,
+\fB$CXXFILESUFFIX\fR,
+\fB$INCPREFIX\fR,
+\fB$INCSUFFIX\fR,
+\fB$MWCW_VERSION\fR,
+\fB$MWCW_VERSIONS\fR,
+\fB$SHCC\fR,
+\fB$SHCCCOM\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHCFLAGS\fR,
+\fB$SHCXX\fR,
+\fB$SHCXXCOM\fR,
+\fB$SHCXXFLAGS\fR\&.
+.sp
+Uses:
+\fB$CCCOMSTR\fR,
+\fB$CXXCOMSTR\fR,
+\fB$SHCCCOMSTR\fR,
+\fB$SHCXXCOMSTR\fR\&.
+.RE
+.PP
+mwld
+.RS 4
+Sets construction variables for the Metrowerks CodeWarrior linker\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOM\fR,
+\fB$LIBDIRPREFIX\fR,
+\fB$LIBDIRSUFFIX\fR,
+\fB$LIBLINKPREFIX\fR,
+\fB$LIBLINKSUFFIX\fR,
+\fB$LINK\fR,
+\fB$LINKCOM\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+nasm
+.RS 4
+Sets construction variables for the
+nasm
+Netwide Assembler\&.
+.sp
+Sets:
+\fB$AS\fR,
+\fB$ASCOM\fR,
+\fB$ASFLAGS\fR,
+\fB$ASPPCOM\fR,
+\fB$ASPPFLAGS\fR\&.
+.sp
+Uses:
+\fB$ASCOMSTR\fR,
+\fB$ASPPCOMSTR\fR\&.
+.RE
+.PP
+packaging
+.RS 4
+A framework for building binary and source packages\&.
+.RE
+.PP
+Packaging
+.RS 4
+Sets construction variables for the
+\fBPackage\fR
+Builder\&.
+.RE
+.PP
+pdf
+.RS 4
+Sets construction variables for the Portable Document Format builder\&.
+.sp
+Sets:
+\fB$PDFPREFIX\fR,
+\fB$PDFSUFFIX\fR\&.
+.RE
+.PP
+pdflatex
+.RS 4
+Sets construction variables for the
+pdflatex
+utility\&.
+.sp
+Sets:
+\fB$LATEXRETRIES\fR,
+\fB$PDFLATEX\fR,
+\fB$PDFLATEXCOM\fR,
+\fB$PDFLATEXFLAGS\fR\&.
+.sp
+Uses:
+\fB$PDFLATEXCOMSTR\fR\&.
+.RE
+.PP
+pdftex
+.RS 4
+Sets construction variables for the
+pdftex
+utility\&.
+.sp
+Sets:
+\fB$LATEXRETRIES\fR,
+\fB$PDFLATEX\fR,
+\fB$PDFLATEXCOM\fR,
+\fB$PDFLATEXFLAGS\fR,
+\fB$PDFTEX\fR,
+\fB$PDFTEXCOM\fR,
+\fB$PDFTEXFLAGS\fR\&.
+.sp
+Uses:
+\fB$PDFLATEXCOMSTR\fR,
+\fB$PDFTEXCOMSTR\fR\&.
+.RE
+.PP
+Perforce
+.RS 4
+Sets construction variables for interacting with the Perforce source code management system\&.
+.sp
+Sets:
+\fB$P4\fR,
+\fB$P4COM\fR,
+\fB$P4FLAGS\fR\&.
+.sp
+Uses:
+\fB$P4COMSTR\fR\&.
+.RE
+.PP
+qt
+.RS 4
+Sets construction variables for building Qt applications\&.
+.sp
+Sets:
+\fB$QTDIR\fR,
+\fB$QT_AUTOSCAN\fR,
+\fB$QT_BINPATH\fR,
+\fB$QT_CPPPATH\fR,
+\fB$QT_LIB\fR,
+\fB$QT_LIBPATH\fR,
+\fB$QT_MOC\fR,
+\fB$QT_MOCCXXPREFIX\fR,
+\fB$QT_MOCCXXSUFFIX\fR,
+\fB$QT_MOCFROMCXXCOM\fR,
+\fB$QT_MOCFROMCXXFLAGS\fR,
+\fB$QT_MOCFROMHCOM\fR,
+\fB$QT_MOCFROMHFLAGS\fR,
+\fB$QT_MOCHPREFIX\fR,
+\fB$QT_MOCHSUFFIX\fR,
+\fB$QT_UIC\fR,
+\fB$QT_UICCOM\fR,
+\fB$QT_UICDECLFLAGS\fR,
+\fB$QT_UICDECLPREFIX\fR,
+\fB$QT_UICDECLSUFFIX\fR,
+\fB$QT_UICIMPLFLAGS\fR,
+\fB$QT_UICIMPLPREFIX\fR,
+\fB$QT_UICIMPLSUFFIX\fR,
+\fB$QT_UISUFFIX\fR\&.
+.RE
+.PP
+RCS
+.RS 4
+Sets construction variables for the interaction with the Revision Control System\&.
+.sp
+Sets:
+\fB$RCS\fR,
+\fB$RCS_CO\fR,
+\fB$RCS_COCOM\fR,
+\fB$RCS_COFLAGS\fR\&.
+.sp
+Uses:
+\fB$RCS_COCOMSTR\fR\&.
+.RE
+.PP
+rmic
+.RS 4
+Sets construction variables for the
+rmic
+utility\&.
+.sp
+Sets:
+\fB$JAVACLASSSUFFIX\fR,
+\fB$RMIC\fR,
+\fB$RMICCOM\fR,
+\fB$RMICFLAGS\fR\&.
+.sp
+Uses:
+\fB$RMICCOMSTR\fR\&.
+.RE
+.PP
+rpcgen
+.RS 4
+Sets construction variables for building with RPCGEN\&.
+.sp
+Sets:
+\fB$RPCGEN\fR,
+\fB$RPCGENCLIENTFLAGS\fR,
+\fB$RPCGENFLAGS\fR,
+\fB$RPCGENHEADERFLAGS\fR,
+\fB$RPCGENSERVICEFLAGS\fR,
+\fB$RPCGENXDRFLAGS\fR\&.
+.RE
+.PP
+SCCS
+.RS 4
+Sets construction variables for interacting with the Source Code Control System\&.
+.sp
+Sets:
+\fB$SCCS\fR,
+\fB$SCCSCOM\fR,
+\fB$SCCSFLAGS\fR,
+\fB$SCCSGETFLAGS\fR\&.
+.sp
+Uses:
+\fB$SCCSCOMSTR\fR\&.
+.RE
+.PP
+sgiar
+.RS 4
+Sets construction variables for the SGI library archiver\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOMSTR\fR,
+\fB$ARFLAGS\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKFLAGS\fR\&.
+.sp
+Uses:
+\fB$ARCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+sgic++
+.RS 4
+Sets construction variables for the SGI C++ compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$CXXFLAGS\fR,
+\fB$SHCXX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+sgicc
+.RS 4
+Sets construction variables for the SGI C compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+sgilink
+.RS 4
+Sets construction variables for the SGI linker\&.
+.sp
+Sets:
+\fB$LINK\fR,
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+sunar
+.RS 4
+Sets construction variables for the Sun library archiver\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOM\fR,
+\fB$ARFLAGS\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR,
+\fB$SHLINK\fR,
+\fB$SHLINKCOM\fR,
+\fB$SHLINKFLAGS\fR\&.
+.sp
+Uses:
+\fB$ARCOMSTR\fR,
+\fB$SHLINKCOMSTR\fR\&.
+.RE
+.PP
+sunc++
+.RS 4
+Sets construction variables for the Sun C++ compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$CXXVERSION\fR,
+\fB$SHCXX\fR,
+\fB$SHCXXFLAGS\fR,
+\fB$SHOBJPREFIX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+suncc
+.RS 4
+Sets construction variables for the Sun C compiler\&.
+.sp
+Sets:
+\fB$CXX\fR,
+\fB$SHCCFLAGS\fR,
+\fB$SHOBJPREFIX\fR,
+\fB$SHOBJSUFFIX\fR\&.
+.RE
+.PP
+sunf77
+.RS 4
+Set construction variables for the Sun
+f77
+Fortran compiler\&.
+.sp
+Sets:
+\fB$F77\fR,
+\fB$FORTRAN\fR,
+\fB$SHF77\fR,
+\fB$SHF77FLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANFLAGS\fR\&.
+.RE
+.PP
+sunf90
+.RS 4
+Set construction variables for the Sun
+f90
+Fortran compiler\&.
+.sp
+Sets:
+\fB$F90\fR,
+\fB$FORTRAN\fR,
+\fB$SHF90\fR,
+\fB$SHF90FLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANFLAGS\fR\&.
+.RE
+.PP
+sunf95
+.RS 4
+Set construction variables for the Sun
+f95
+Fortran compiler\&.
+.sp
+Sets:
+\fB$F95\fR,
+\fB$FORTRAN\fR,
+\fB$SHF95\fR,
+\fB$SHF95FLAGS\fR,
+\fB$SHFORTRAN\fR,
+\fB$SHFORTRANFLAGS\fR\&.
+.RE
+.PP
+sunlink
+.RS 4
+Sets construction variables for the Sun linker\&.
+.sp
+Sets:
+\fB$RPATHPREFIX\fR,
+\fB$RPATHSUFFIX\fR,
+\fB$SHLINKFLAGS\fR\&.
+.RE
+.PP
+swig
+.RS 4
+Sets construction variables for the SWIG interface generator\&.
+.sp
+Sets:
+\fB$SWIG\fR,
+\fB$SWIGCFILESUFFIX\fR,
+\fB$SWIGCOM\fR,
+\fB$SWIGCXXFILESUFFIX\fR,
+\fB$SWIGDIRECTORSUFFIX\fR,
+\fB$SWIGFLAGS\fR,
+\fB$SWIGINCPREFIX\fR,
+\fB$SWIGINCSUFFIX\fR,
+\fB$SWIGPATH\fR,
+\fB$SWIGVERSION\fR,
+\fB$_SWIGINCFLAGS\fR\&.
+.sp
+Uses:
+\fB$SWIGCOMSTR\fR\&.
+.RE
+.PP
+tar
+.RS 4
+Sets construction variables for the
+tar
+archiver\&.
+.sp
+Sets:
+\fB$TAR\fR,
+\fB$TARCOM\fR,
+\fB$TARFLAGS\fR,
+\fB$TARSUFFIX\fR\&.
+.sp
+Uses:
+\fB$TARCOMSTR\fR\&.
+.RE
+.PP
+tex
+.RS 4
+Sets construction variables for the TeX formatter and typesetter\&.
+.sp
+Sets:
+\fB$BIBTEX\fR,
+\fB$BIBTEXCOM\fR,
+\fB$BIBTEXFLAGS\fR,
+\fB$LATEX\fR,
+\fB$LATEXCOM\fR,
+\fB$LATEXFLAGS\fR,
+\fB$MAKEINDEX\fR,
+\fB$MAKEINDEXCOM\fR,
+\fB$MAKEINDEXFLAGS\fR,
+\fB$TEX\fR,
+\fB$TEXCOM\fR,
+\fB$TEXFLAGS\fR\&.
+.sp
+Uses:
+\fB$BIBTEXCOMSTR\fR,
+\fB$LATEXCOMSTR\fR,
+\fB$MAKEINDEXCOMSTR\fR,
+\fB$TEXCOMSTR\fR\&.
+.RE
+.PP
+textfile
+.RS 4
+Set construction variables for the
+\fBTextfile\fR
+and
+\fBSubstfile\fR
+builders\&.
+.sp
+Sets:
+\fB$LINESEPARATOR\fR,
+\fB$SUBSTFILEPREFIX\fR,
+\fB$SUBSTFILESUFFIX\fR,
+\fB$TEXTFILEPREFIX\fR,
+\fB$TEXTFILESUFFIX\fR\&.
+.sp
+Uses:
+\fB$SUBST_DICT\fR\&.
+.RE
+.PP
+tlib
+.RS 4
+Sets construction variables for the Borlan
+tib
+library archiver\&.
+.sp
+Sets:
+\fB$AR\fR,
+\fB$ARCOM\fR,
+\fB$ARFLAGS\fR,
+\fB$LIBPREFIX\fR,
+\fB$LIBSUFFIX\fR\&.
+.sp
+Uses:
+\fB$ARCOMSTR\fR\&.
+.RE
+.PP
+xgettext
+.RS 4
+This scons tool is a part of scons
+gettext
+toolset\&. It provides scons interface to
+\fBxgettext(1)\fR
+program, which extracts internationalized messages from source code\&. The tool provides
+\fBPOTUpdate\fR
+builder to make
+PO
+\fITemplate\fR
+files\&.
+.sp
+Sets:
+\fB$POTSUFFIX\fR,
+\fB$POTUPDATE_ALIAS\fR,
+\fB$XGETTEXTCOM\fR,
+\fB$XGETTEXTCOMSTR\fR,
+\fB$XGETTEXTFLAGS\fR,
+\fB$XGETTEXTFROM\fR,
+\fB$XGETTEXTFROMPREFIX\fR,
+\fB$XGETTEXTFROMSUFFIX\fR,
+\fB$XGETTEXTPATH\fR,
+\fB$XGETTEXTPATHPREFIX\fR,
+\fB$XGETTEXTPATHSUFFIX\fR,
+\fB$_XGETTEXTDOMAIN\fR,
+\fB$_XGETTEXTFROMFLAGS\fR,
+\fB$_XGETTEXTPATHFLAGS\fR\&.
+.sp
+Uses:
+\fB$POTDOMAIN\fR\&.
+.RE
+.PP
+yacc
+.RS 4
+Sets construction variables for the
+yacc
+parse generator\&.
+.sp
+Sets:
+\fB$YACC\fR,
+\fB$YACCCOM\fR,
+\fB$YACCFLAGS\fR,
+\fB$YACCHFILESUFFIX\fR,
+\fB$YACCHXXFILESUFFIX\fR,
+\fB$YACCVCGFILESUFFIX\fR\&.
+.sp
+Uses:
+\fB$YACCCOMSTR\fR\&.
+.RE
+.PP
+zip
+.RS 4
+Sets construction variables for the
+zip
+archiver\&.
+.sp
+Sets:
+\fB$ZIP\fR,
+\fB$ZIPCOM\fR,
+\fB$ZIPCOMPRESSION\fR,
+\fB$ZIPFLAGS\fR,
+\fB$ZIPSUFFIX\fR\&.
+.sp
+Uses:
+\fB$ZIPCOMSTR\fR\&.
+.RE
+.PP
+Additionally, there is a "tool" named
+\fBdefault\fR
+which configures the environment with a default set of tools for the current platform\&.
+.PP
+On posix and cygwin platforms the GNU tools (e\&.g\&. gcc) are preferred by SCons, on Windows the Microsoft tools (e\&.g\&. msvc) followed by MinGW are preferred by SCons, and in OS/2 the IBM tools (e\&.g\&. icc) are preferred by SCons\&.
+.SS "Builder Methods"
+.PP
+Build rules are specified by calling a construction environment\*(Aqs builder methods\&. The arguments to the builder methods are
+\fBtarget\fR
+(a list of targets to be built, usually file names) and
+\fBsource\fR
+(a list of sources to be built, usually file names)\&.
+.PP
+Because long lists of file names can lead to a lot of quoting,
+\fBscons\fR
+supplies a
+\fBSplit()\fR
+global function and a same\-named environment method that split a single string into a list, separated on strings of white\-space characters\&. (These are similar to the split() member function of Python strings but work even if the input isn\*(Aqt a string\&.)
+.PP
+Like all Python arguments, the target and source arguments to a builder method can be specified either with or without the "target" and "source" keywords\&. When the keywords are omitted, the target is first, followed by the source\&. The following are equivalent examples of calling the Program builder method:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Program(\*(Aqbar\*(Aq, [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq])
+env\&.Program(\*(Aqbar\*(Aq, Split(\*(Aqbar\&.c foo\&.c\*(Aq))
+env\&.Program(\*(Aqbar\*(Aq, env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq))
+env\&.Program(source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq], target = \*(Aqbar\*(Aq)
+env\&.Program(target = \*(Aqbar\*(Aq, Split(\*(Aqbar\&.c foo\&.c\*(Aq))
+env\&.Program(target = \*(Aqbar\*(Aq, env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq))
+env\&.Program(\*(Aqbar\*(Aq, source = \*(Aqbar\&.c foo\&.c\*(Aq\&.split())
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Target and source file names that are not absolute path names (that is, do not begin with
+\fB/\fR
+on POSIX systems or
+\fB\efR on Windows systems, with or without an optional drive letter) are interpreted relative to the directory containing the SConscript\fR
+file being read\&. An initial
+\fB#\fR
+(hash mark) on a path name means that the rest of the file name is interpreted relative to the directory containing the top\-level
+\fBSConstruct\fR
+file, even if the
+\fB#\fR
+is followed by a directory separator character (slash or backslash)\&.
+.PP
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# The comments describing the targets that will be built
+# assume these calls are in a SConscript file in the
+# a subdirectory named "subdir"\&.
+
+# Builds the program "subdir/foo" from "subdir/foo\&.c":
+env\&.Program(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
+
+# Builds the program "/tmp/bar" from "subdir/bar\&.c":
+env\&.Program(\*(Aq/tmp/bar\*(Aq, \*(Aqbar\&.c\*(Aq)
+
+# An initial \*(Aq#\*(Aq or \*(Aq#/\*(Aq are equivalent; the following
+# calls build the programs "foo" and "bar" (in the
+# top\-level SConstruct directory) from "subdir/foo\&.c" and
+# "subdir/bar\&.c", respectively:
+env\&.Program(\*(Aq#foo\*(Aq, \*(Aqfoo\&.c\*(Aq)
+env\&.Program(\*(Aq#/bar\*(Aq, \*(Aqbar\&.c\*(Aq)
+
+# Builds the program "other/foo" (relative to the top\-level
+# SConstruct directory) from "subdir/foo\&.c":
+env\&.Program(\*(Aq#other/foo\*(Aq, \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+When the target shares the same base name as the source and only the suffix varies, and if the builder method has a suffix defined for the target file type, then the target argument may be omitted completely, and
+\fBscons\fR
+will deduce the target file name from the source file name\&. The following examples all build the executable program
+\fBbar\fR
+(on POSIX systems) or
+\fBbar\&.exe\fR
+(on Windows systems) from the bar\&.c source file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Program(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
+env\&.Program(\*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
+env\&.Program(source = \*(Aqbar\&.c\*(Aq)
+env\&.Program(\*(Aqbar\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+As a convenience, a
+\fBsrcdir\fR
+keyword argument may be specified when calling a Builder\&. When specified, all source file strings that are not absolute paths will be interpreted relative to the specified
+\fBsrcdir\fR\&. The following example will build the
+\fBbuild/prog\fR
+(or
+\fBbuild/prog\&.exe\fR
+on Windows) program from the files
+\fBsrc/f1\&.c\fR
+and
+\fBsrc/f2\&.c\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Program(\*(Aqbuild/prog\*(Aq, [\*(Aqf1\&.c\*(Aq, \*(Aqf2\&.c\*(Aq], srcdir=\*(Aqsrc\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+It is possible to override or add construction variables when calling a builder method by passing additional keyword arguments\&. These overridden or added variables will only be in effect when building the target, so they will not affect other parts of the build\&. For example, if you want to add additional libraries for just one program:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, LIBS=[\*(Aqgl\*(Aq, \*(Aqglut\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or generate a shared library with a non\-standard suffix:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq,
+ SHLIBSUFFIX=\*(Aq\&.ocx\*(Aq,
+ LIBSUFFIXES=[\*(Aq\&.ocx\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+(Note that both the $SHLIBSUFFIX and $LIBSUFFIXES variables must be set if you want SCons to search automatically for dependencies on the non\-standard library names; see the descriptions of these variables, below, for more information\&.)
+.PP
+It is also possible to use the
+\fIparse_flags\fR
+keyword argument in an override:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, parse_flags = \*(Aq\-Iinclude \-DEBUG \-lm\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+This example adds \*(Aqinclude\*(Aq to
+\fBCPPPATH\fR, \*(AqEBUG\*(Aq to
+\fBCPPDEFINES\fR, and \*(Aqm\*(Aq to
+\fBLIBS\fR\&.
+.PP
+Although the builder methods defined by
+\fBscons\fR
+are, in fact, methods of a construction environment object, they may also be called without an explicit environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)
+SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+In this case, the methods are called internally using a default construction environment that consists of the tools and values that
+\fBscons\fR
+has determined are appropriate for the local system\&.
+.PP
+Builder methods that can be called without an explicit environment may be called from custom Python modules that you import into an SConscript file by adding the following to the Python module:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+from SCons\&.Script import *
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+All builder methods return a list\-like object containing Nodes that represent the target or targets that will be built\&. A
+\fINode\fR
+is an internal SCons object which represents build targets or sources\&.
+.PP
+The returned Node\-list object can be passed to other builder methods as source(s) or passed to any SCons function or method where a filename would normally be accepted\&. For example, if it were necessary to add a specific
+\fB\-D\fR
+flag when compiling one specific object file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq)
+env\&.Program(source = [\*(Aqfoo\&.c\*(Aq, bar_obj_list, \*(Aqmain\&.c\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Using a Node in this way makes for a more portable build by avoiding having to specify a platform\-specific object suffix when calling the Program() builder method\&.
+.PP
+Note that Builder calls will automatically "flatten" the source and target file lists, so it\*(Aqs all right to have the bar_obj list return by the StaticObject() call in the middle of the source file list\&. If you need to manipulate a list of lists returned by Builders directly using Python, you can either build the list by hand:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = Object(\*(Aqfoo\&.c\*(Aq)
+bar = Object(\*(Aqbar\&.c\*(Aq)
+objects = [\*(Aqbegin\&.o\*(Aq] + foo + [\*(Aqmiddle\&.o\*(Aq] + bar + [\*(Aqend\&.o\*(Aq]
+for object in objects:
+ print str(object)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Or you can use the
+\fBFlatten\fR() function supplied by scons to create a list containing just the Nodes, which may be more convenient:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = Object(\*(Aqfoo\&.c\*(Aq)
+bar = Object(\*(Aqbar\&.c\*(Aq)
+objects = Flatten([\*(Aqbegin\&.o\*(Aq, foo, \*(Aqmiddle\&.o\*(Aq, bar, \*(Aqend\&.o\*(Aq])
+for object in objects:
+ print str(object)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note also that because Builder calls return a list\-like object, not an actual Python list, you should
+\fInot\fR
+use the Python
+\fB+=\fR
+operator to append Builder results to a Python list\&. Because the list and the object are different types, Python will not update the original list in place, but will instead create a new Node\-list object containing the concatenation of the list elements and the Builder results\&. This will cause problems for any other Python variables in your SCons configuration that still hold on to a reference to the original list\&. Instead, use the Python
+\fB\&.extend()\fR
+method to make sure the list is updated in\-place\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+object_files = []
+
+# Do NOT use += as follows:
+#
+# object_files += Object(\*(Aqbar\&.c\*(Aq)
+#
+# It will not update the object_files list in place\&.
+#
+# Instead, use the \&.extend() method:
+object_files\&.extend(Object(\*(Aqbar\&.c\*(Aq))
+
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The path name for a Node\*(Aqs file may be used by passing the Node to the Python\-builtin
+\fBstr()\fR
+function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq)
+print "The path to bar_obj is:", str(bar_obj_list[0])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note again that because the Builder call returns a list, we have to access the first element in the list
+\fB(bar_obj_list[0])\fR
+to get at the Node that actually represents the object file\&.
+.PP
+Builder calls support a
+\fBchdir\fR
+keyword argument that specifies that the Builder\*(Aqs action(s) should be executed after changing directory\&. If the
+\fBchdir\fR
+argument is a string or a directory Node, scons will change to the specified directory\&. If the
+\fBchdir\fR
+is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# scons will change to the "sub" subdirectory
+# before executing the "cp" command\&.
+env\&.Command(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq,
+ "cp dir/foo\&.in dir/foo\&.out",
+ chdir=\*(Aqsub\*(Aq)
+
+# Because chdir is not a string, scons will change to the
+# target\*(Aqs directory ("sub/dir") before executing the
+# "cp" command\&.
+env\&.Command(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq,
+ "cp foo\&.in foo\&.out",
+ chdir=1)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note that scons will
+\fInot\fR
+automatically modify its expansion of construction variables like
+\fB$TARGET\fR
+and
+\fB$SOURCE\fR
+when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. If you use the chdir keyword argument, you will typically need to supply a different command line using expansions like
+\fB${TARGET\&.file}\fR
+and
+\fB${SOURCE\&.file}\fR
+to use just the filename portion of the targets and source\&.
+.PP
+\fBscons\fR
+provides the following builder methods:
+.PP
+\fBCFile()\fR, \fBenv\&.CFile()\fR
+.RS 4
+Builds a C source file given a lex (\&.l) or yacc (\&.y) input file\&. The suffix specified by the
+\fB$CFILESUFFIX\fR
+construction variable (\&.c
+by default) is automatically added to the target if it is not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds foo\&.c
+env\&.CFile(target = \*(Aqfoo\&.c\*(Aq, source = \*(Aqfoo\&.l\*(Aq)
+# builds bar\&.c
+env\&.CFile(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.y\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBCommand()\fR, \fBenv\&.Command()\fR
+.RS 4
+The
+\fBCommand\fR
+"Builder" is actually implemented as a function that looks like a Builder, but actually takes an additional argument of the action from which the Builder should be made\&. See the
+\fBCommand\fR
+function description for the calling syntax and details\&.
+.RE
+.PP
+\fBCXXFile()\fR, \fBenv\&.CXXFile()\fR
+.RS 4
+Builds a C++ source file given a lex (\&.ll) or yacc (\&.yy) input file\&. The suffix specified by the
+\fB$CXXFILESUFFIX\fR
+construction variable (\&.cc
+by default) is automatically added to the target if it is not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds foo\&.cc
+env\&.CXXFile(target = \*(Aqfoo\&.cc\*(Aq, source = \*(Aqfoo\&.ll\*(Aq)
+# builds bar\&.cc
+env\&.CXXFile(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.yy\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookEpub()\fR, \fBenv\&.DocbookEpub()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for EPUB output\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookEpub(\*(Aqmanual\&.epub\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or simply
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookEpub(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookHtml()\fR, \fBenv\&.DocbookHtml()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for HTML output\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or simply
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtml(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookHtmlChunked()\fR, \fBenv\&.DocbookHtmlChunked()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for chunked HTML output\&. It supports the
+base\&.dir
+parameter\&. The
+chunkfast\&.xsl
+file (requires "EXSLT") is used as the default stylesheet\&. Basic syntax:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+where
+manual\&.xml
+is the input file\&.
+.sp
+If you use the
+root\&.filename
+parameter in your own stylesheets you have to specify the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
+\(lqscons \-c\(rq:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlChunked(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Some basic support for the
+base\&.dir
+is provided\&. You can add the
+base_dir
+keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
+.RE
+.PP
+\fBDocbookHtmlhelp()\fR, \fBenv\&.DocbookHtmlhelp()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for HTMLHELP output\&. Its basic syntax is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+where
+manual\&.xml
+is the input file\&.
+.sp
+If you use the
+root\&.filename
+parameter in your own stylesheets you have to specify the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
+\(lqscons \-c\(rq:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlhelp(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Some basic support for the
+base\&.dir
+parameter is provided\&. You can add the
+base_dir
+keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
+.RE
+.PP
+\fBDocbookMan()\fR, \fBenv\&.DocbookMan()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for Man page output\&. Its basic syntax is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookMan(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+where
+manual\&.xml
+is the input file\&. Note, that you can specify a target name, but the actual output names are automatically set from the
+refname
+entries in your XML source\&.
+.RE
+.PP
+\fBDocbookPdf()\fR, \fBenv\&.DocbookPdf()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for PDF output\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or simply
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookPdf(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookSlidesHtml()\fR, \fBenv\&.DocbookSlidesHtml()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for HTML slides output\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If you use the
+titlefoil\&.html
+parameter in your own stylesheets you have to give the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
+\(lqscons \-c\(rq:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookSlidesHtml(\*(Aqmymanual\&.html\*(Aq,\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Some basic support for the
+base\&.dir
+parameter is provided\&. You can add the
+base_dir
+keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
+.RE
+.PP
+\fBDocbookSlidesPdf()\fR, \fBenv\&.DocbookSlidesPdf()\fR
+.RS 4
+A pseudo\-Builder, providing a Docbook toolchain for PDF slides output\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookSlidesPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or simply
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookSlidesPdf(\*(Aqmanual\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookXInclude()\fR, \fBenv\&.DocbookXInclude()\fR
+.RS 4
+A pseudo\-Builder, for resolving XIncludes in a separate processing step\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookXInclude(\*(Aqmanual_xincluded\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBDocbookXslt()\fR, \fBenv\&.DocbookXslt()\fR
+.RS 4
+A pseudo\-Builder, applying a given XSL transformation to the input file\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdocbook\*(Aq])
+env\&.DocbookXslt(\*(Aqmanual_transformed\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqtransform\&.xslt\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note, that this builder requires the
+xsl
+parameter to be set\&.
+.RE
+.PP
+\fBDVI()\fR, \fBenv\&.DVI()\fR
+.RS 4
+Builds a
+\&.dvi
+file from a
+\&.tex,
+\&.ltx
+or
+\&.latex
+input file\&. If the source file suffix is
+\&.tex,
+scons
+will examine the contents of the file; if the string
+\edocumentclass
+or
+\edocumentstyle
+is found, the file is assumed to be a LaTeX file and the target is built by invoking the
+\fB$LATEXCOM\fR
+command line; otherwise, the
+\fB$TEXCOM\fR
+command line is used\&. If the file is a LaTeX file, the
+\fBDVI\fR
+builder method will also examine the contents of the
+\&.aux
+file and invoke the
+\fB$BIBTEX\fR
+command line if the string
+bibdata
+is found, start
+\fB$MAKEINDEX\fR
+to generate an index if a
+\&.ind
+file is found and will examine the contents
+\&.log
+file and re\-run the
+\fB$LATEXCOM\fR
+command if the log file says it is necessary\&.
+.sp
+The suffix
+\&.dvi
+(hard\-coded within TeX itself) is automatically added to the target if it is not already present\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds from aaa\&.tex
+env\&.DVI(target = \*(Aqaaa\&.dvi\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
+# builds bbb\&.dvi
+env\&.DVI(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.ltx\*(Aq)
+# builds from ccc\&.latex
+env\&.DVI(target = \*(Aqccc\&.dvi\*(Aq, source = \*(Aqccc\&.latex\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBGs()\fR, \fBenv\&.Gs()\fR
+.RS 4
+A Builder for explicitly calling the
+gs
+executable\&. Depending on the underlying OS, the different names
+gs,
+gsos2
+and
+gswin32c
+are tried\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqgs\*(Aq])
+env\&.Gs(\*(Aqcover\&.jpg\*(Aq,\*(Aqscons\-scons\&.pdf\*(Aq,
+ GSFLAGS=\*(Aq\-dNOPAUSE \-dBATCH \-sDEVICE=jpeg \-dFirstPage=1 \-dLastPage=1 \-q\*(Aq)
+ )
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBInstall()\fR, \fBenv\&.Install()\fR
+.RS 4
+Installs one or more source files or directories in the specified target, which must be a directory\&. The names of the specified source files or directories remain the same within the destination directory\&. The sources may be given as a string or as a node returned by a builder\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Install(\*(Aq/usr/local/bin\*(Aq, source = [\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBInstallAs()\fR, \fBenv\&.InstallAs()\fR
+.RS 4
+Installs one or more source files or directories to specific names, allowing changing a file or directory name as part of the installation\&. It is an error if the target and source arguments list different numbers of files or directories\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.InstallAs(target = \*(Aq/usr/local/bin/foo\*(Aq,
+ source = \*(Aqfoo_debug\*(Aq)
+env\&.InstallAs(target = [\*(Aq\&.\&./lib/libfoo\&.a\*(Aq, \*(Aq\&.\&./lib/libbar\&.a\*(Aq],
+ source = [\*(AqlibFOO\&.a\*(Aq, \*(AqlibBAR\&.a\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBInstallVersionedLib()\fR, \fBenv\&.InstallVersionedLib()\fR
+.RS 4
+Installs a versioned shared library\&. The
+\fB$SHLIBVERSION\fR
+construction variable should be defined in the environment to confirm the version number in the library name\&. If
+\fB$SHLIBVERSION\fR
+is not defined a warning will be issued and the name of the library will be parsed to derive the version\&. The symlinks appropriate to the architecture will be generated\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.InstallVersionedLib(target = \*(Aq/usr/local/bin/foo\*(Aq,
+ source = \*(Aqlibxyz\&.1\&.5\&.2\&.so\*(Aq)
+env\&.InstallVersionedLib(target = \*(Aq/usr/local/bin/foo\*(Aq,
+ source = \*(Aqlibxyz\&.1\&.5\&.2\&.so\*(Aq,
+ SHLIBVERSION=\*(Aq1\&.5\&.2\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBJar()\fR, \fBenv\&.Jar()\fR
+.RS 4
+Builds a Java archive (\&.jar) file from the specified list of sources\&. Any directories in the source list will be searched for
+\&.class
+files)\&. Any
+\&.java
+files in the source list will be compiled to
+\&.class
+files by calling the
+\fBJava\fR
+Builder\&.
+.sp
+If the
+\fB$JARCHDIR\fR
+value is set, the
+jar
+command will change to the specified directory using the
+\fB\-C\fR
+option\&. If
+\fB$JARCHDIR\fR
+is not set explicitly,
+SCons
+will use the top of any subdirectory tree in which Java
+\&.class
+were built by the
+\fBJava\fR
+Builder\&.
+.sp
+If the contents any of the source files begin with the string
+Manifest\-Version, the file is assumed to be a manifest and is passed to the
+jar
+command with the
+\fBm\fR
+option set\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Jar(target = \*(Aqfoo\&.jar\*(Aq, source = \*(Aqclasses\*(Aq)
+
+env\&.Jar(target = \*(Aqbar\&.jar\*(Aq,
+ source = [\*(Aqbar1\&.java\*(Aq, \*(Aqbar2\&.java\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBJava()\fR, \fBenv\&.Java()\fR
+.RS 4
+Builds one or more Java class files\&. The sources may be any combination of explicit
+\&.java
+files, or directory trees which will be scanned for
+\&.java
+files\&.
+.sp
+SCons will parse each source
+\&.java
+file to find the classes (including inner classes) defined within that file, and from that figure out the target
+\&.class
+files that will be created\&. The class files will be placed underneath the specified target directory\&.
+.sp
+SCons will also search each Java file for the Java package name, which it assumes can be found on a line beginning with the string
+package
+in the first column; the resulting
+\&.class
+files will be placed in a directory reflecting the specified package name\&. For example, the file
+Foo\&.java
+defining a single public
+Foo
+class and containing a package name of
+sub\&.dir
+will generate a corresponding
+sub/dir/Foo\&.class
+class file\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Java(target = \*(Aqclasses\*(Aq, source = \*(Aqsrc\*(Aq)
+env\&.Java(target = \*(Aqclasses\*(Aq, source = [\*(Aqsrc1\*(Aq, \*(Aqsrc2\*(Aq])
+env\&.Java(target = \*(Aqclasses\*(Aq, source = [\*(AqFile1\&.java\*(Aq, \*(AqFile2\&.java\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Java source files can use the native encoding for the underlying OS\&. Since SCons compiles in simple ASCII mode by default, the compiler will generate warnings about unmappable characters, which may lead to errors as the file is processed further\&. In this case, the user must specify the
+LANG
+environment variable to tell the compiler what encoding is used\&. For portibility, it\*(Aqs best if the encoding is hard\-coded so that the compile will work if it is done on a system with a different encoding\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env[\*(AqENV\*(Aq][\*(AqLANG\*(Aq] = \*(Aqen_GB\&.UTF\-8\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBJavaH()\fR, \fBenv\&.JavaH()\fR
+.RS 4
+Builds C header and source files for implementing Java native methods\&. The target can be either a directory in which the header files will be written, or a header file name which will contain all of the definitions\&. The source can be the names of
+\&.class
+files, the names of
+\&.java
+files to be compiled into
+\&.class
+files by calling the
+\fBJava\fR
+builder method, or the objects returned from the
+\fBJava\fR
+builder method\&.
+.sp
+If the construction variable
+\fB$JAVACLASSDIR\fR
+is set, either in the environment or in the call to the
+\fBJavaH\fR
+builder method itself, then the value of the variable will be stripped from the beginning of any
+\&.class
+file names\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds java_native\&.h
+classes = env\&.Java(target = \*(Aqclassdir\*(Aq, source = \*(Aqsrc\*(Aq)
+env\&.JavaH(target = \*(Aqjava_native\&.h\*(Aq, source = classes)
+
+# builds include/package_foo\&.h and include/package_bar\&.h
+env\&.JavaH(target = \*(Aqinclude\*(Aq,
+ source = [\*(Aqpackage/foo\&.class\*(Aq, \*(Aqpackage/bar\&.class\*(Aq])
+
+# builds export/foo\&.h and export/bar\&.h
+env\&.JavaH(target = \*(Aqexport\*(Aq,
+ source = [\*(Aqclasses/foo\&.class\*(Aq, \*(Aqclasses/bar\&.class\*(Aq],
+ JAVACLASSDIR = \*(Aqclasses\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBLibrary()\fR, \fBenv\&.Library()\fR
+.RS 4
+A synonym for the
+\fBStaticLibrary\fR
+builder method\&.
+.RE
+.PP
+\fBLoadableModule()\fR, \fBenv\&.LoadableModule()\fR
+.RS 4
+On most systems, this is the same as
+\fBSharedLibrary\fR\&. On Mac OS X (Darwin) platforms, this creates a loadable module bundle\&.
+.RE
+.PP
+\fBM4()\fR, \fBenv\&.M4()\fR
+.RS 4
+Builds an output file from an M4 input file\&. This uses a default
+\fB$M4FLAGS\fR
+value of
+\fB\-E\fR, which considers all warnings to be fatal and stops on the first warning when using the GNU version of m4\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.M4(target = \*(Aqfoo\&.c\*(Aq, source = \*(Aqfoo\&.c\&.m4\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBMoc()\fR, \fBenv\&.Moc()\fR
+.RS 4
+Builds an output file from a moc input file\&. Moc input files are either header files or cxx files\&. This builder is only available after using the tool \*(Aqqt\*(Aq\&. See the
+\fB$QTDIR\fR
+variable for more information\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Moc(\*(Aqfoo\&.h\*(Aq) # generates moc_foo\&.cc
+env\&.Moc(\*(Aqfoo\&.cpp\*(Aq) # generates foo\&.moc
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBMOFiles()\fR, \fBenv\&.MOFiles()\fR
+.RS 4
+This builder belongs to
+msgfmt
+tool\&. The builder compiles
+PO
+files to
+MO
+files\&.
+.sp
+
+\fIExample 1\fR\&. Create
+pl\&.mo
+and
+en\&.mo
+by compiling
+pl\&.po
+and
+en\&.po:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 2\fR\&. Compile files for languages defined in
+LINGUAS
+file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.MOFiles(LINGUAS_FILE = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 3\fR\&. Create
+pl\&.mo
+and
+en\&.mo
+by compiling
+pl\&.po
+and
+en\&.po
+plus files for languages defined in
+LINGUAS
+file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq], LINGUAS_FILE = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 4\fR\&. Compile files for languages defined in
+LINGUAS
+file (another version):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env[\*(AqLINGUAS_FILE\*(Aq] = 1
+ env\&.MOFiles()
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBMSVSProject()\fR, \fBenv\&.MSVSProject()\fR
+.RS 4
+Builds a Microsoft Visual Studio project file, and by default builds a solution file as well\&.
+.sp
+This builds a Visual Studio project file, based on the version of Visual Studio that is configured (either the latest installed version, or the version specified by
+\fB$MSVS_VERSION\fR
+in the Environment constructor)\&. For Visual Studio 6, it will generate a
+\&.dsp
+file\&. For Visual Studio 7 (\&.NET) and later versions, it will generate a
+\&.vcproj
+file\&.
+.sp
+By default, this also generates a solution file for the specified project, a
+\&.dsw
+file for Visual Studio 6 or a
+\&.sln
+file for Visual Studio 7 (\&.NET)\&. This behavior may be disabled by specifying
+auto_build_solution=0
+when you call
+\fBMSVSProject\fR, in which case you presumably want to build the solution file(s) by calling the
+\fBMSVSSolution\fR
+Builder (see below)\&.
+.sp
+The
+\fBMSVSProject\fR
+builder takes several lists of filenames to be placed into the project file\&. These are currently limited to
+srcs,
+incs,
+localincs,
+resources, and
+misc\&. These are pretty self\-explanatory, but it should be noted that these lists are added to the
+\fB$SOURCES\fR
+construction variable as strings, NOT as SCons File Nodes\&. This is because they represent file names to be added to the project file, not the source files used to build the project file\&.
+.sp
+The above filename lists are all optional, although at least one must be specified for the resulting project file to be non\-empty\&.
+.sp
+In addition to the above lists of values, the following values may be specified:
+.PP
+target
+.RS 4
+The name of the target
+\&.dsp
+or
+\&.vcproj
+file\&. The correct suffix for the version of Visual Studio must be used, but the
+\fB$MSVSPROJECTSUFFIX\fR
+construction variable will be defined to the correct value (see example below)\&.
+.RE
+.PP
+variant
+.RS 4
+The name of this particular variant\&. For Visual Studio 7 projects, this can also be a list of variant names\&. These are typically things like "Debug" or "Release", but really can be anything you want\&. For Visual Studio 7 projects, they may also specify a target platform separated from the variant name by a
+|
+(vertical pipe) character:
+Debug|Xbox\&. The default target platform is Win32\&. Multiple calls to
+\fBMSVSProject\fR
+with different variants are allowed; all variants will be added to the project file with their appropriate build targets and sources\&.
+.RE
+.PP
+cmdargs
+.RS 4
+Additional command line arguments for the different variants\&. The number of
+cmdargs
+entries must match the number of
+variant
+entries, or be empty (not specified)\&. If you give only one, it will automatically be propagated to all variants\&.
+.RE
+.PP
+buildtarget
+.RS 4
+An optional string, node, or list of strings or nodes (one per build variant), to tell the Visual Studio debugger what output target to use in what build variant\&. The number of
+buildtarget
+entries must match the number of
+variant
+entries\&.
+.RE
+.PP
+runfile
+.RS 4
+The name of the file that Visual Studio 7 and later will run and debug\&. This appears as the value of the
+Output
+field in the resulting Visual Studio project file\&. If this is not specified, the default is the same as the specified
+buildtarget
+value\&.
+.RE
+.sp
+Note that because
+SCons
+always executes its build commands from the directory in which the
+SConstruct
+file is located, if you generate a project file in a different directory than the
+SConstruct
+directory, users will not be able to double\-click on the file name in compilation error messages displayed in the Visual Studio console output window\&. This can be remedied by adding the Visual C/C++
+/FC
+compiler option to the
+\fB$CCFLAGS\fR
+variable so that the compiler will print the full path name of any files that cause compilation errors\&.
+.sp
+Example usage:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+barsrcs = [\*(Aqbar\&.cpp\*(Aq],
+barincs = [\*(Aqbar\&.h\*(Aq],
+barlocalincs = [\*(AqStdAfx\&.h\*(Aq]
+barresources = [\*(Aqbar\&.rc\*(Aq,\*(Aqresource\&.h\*(Aq]
+barmisc = [\*(Aqbar_readme\&.txt\*(Aq]
+
+dll = env\&.SharedLibrary(target = \*(Aqbar\&.dll\*(Aq,
+ source = barsrcs)
+
+env\&.MSVSProject(target = \*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq],
+ srcs = barsrcs,
+ incs = barincs,
+ localincs = barlocalincs,
+ resources = barresources,
+ misc = barmisc,
+ buildtarget = dll,
+ variant = \*(AqRelease\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Starting with version 2\&.4 of SCons it\*(Aqs also possible to specify the optional argument
+\fIDebugSettings\fR, which creates files for debugging under Visual Studio:
+.PP
+DebugSettings
+.RS 4
+A dictionary of debug settings that get written to the
+\&.vcproj\&.user
+or the
+\&.vcxproj\&.user
+file, depending on the version installed\&. As it is done for cmdargs (see above), you can specify a
+\fIDebugSettings\fR
+dictionary per variant\&. If you give only one, it will be propagated to all variants\&.
+.RE
+.sp
+Currently, only Visual Studio v9\&.0 and Visual Studio version v11 are implemented, for other versions no file is generated\&. To generate the user file, you just need to add a
+\fIDebugSettings\fR
+dictionary to the environment with the right parameters for your MSVS version\&. If the dictionary is empty, or does not contain any good value, no file will be generated\&.
+.sp
+Following is a more contrived example, involving the setup of a project for variants and DebugSettings:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Assuming you store your defaults in a file
+vars = Variables(\*(Aqvariables\&.py\*(Aq)
+msvcver = vars\&.args\&.get(\*(Aqvc\*(Aq, \*(Aq9\*(Aq)
+
+# Check command args to force one Microsoft Visual Studio version
+if msvcver == \*(Aq9\*(Aq or msvcver == \*(Aq11\*(Aq:
+ env = Environment(MSVC_VERSION=msvcver+\*(Aq\&.0\*(Aq, MSVC_BATCH=False)
+else:
+ env = Environment()
+
+AddOption(\*(Aq\-\-userfile\*(Aq, action=\*(Aqstore_true\*(Aq, dest=\*(Aquserfile\*(Aq, default=False,
+ help="Create Visual Studio Project user file")
+
+#
+# 1\&. Configure your Debug Setting dictionary with options you want in the list
+# of allowed options, for instance if you want to create a user file to launch
+# a specific application for testing your dll with Microsoft Visual Studio 2008 (v9):
+#
+V9DebugSettings = {
+ \*(AqCommand\*(Aq:\*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq,
+ \*(AqWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq,
+ \*(AqCommandArguments\*(Aq: \*(Aq\-p password\*(Aq,
+# \*(AqAttach\*(Aq:\*(Aqfalse\*(Aq,
+# \*(AqDebuggerType\*(Aq:\*(Aq3\*(Aq,
+# \*(AqRemote\*(Aq:\*(Aq1\*(Aq,
+# \*(AqRemoteMachine\*(Aq: None,
+# \*(AqRemoteCommand\*(Aq: None,
+# \*(AqHttpUrl\*(Aq: None,
+# \*(AqPDBPath\*(Aq: None,
+# \*(AqSQLDebugging\*(Aq: None,
+# \*(AqEnvironment\*(Aq: \*(Aq\*(Aq,
+# \*(AqEnvironmentMerge\*(Aq:\*(Aqtrue\*(Aq,
+# \*(AqDebuggerFlavor\*(Aq: None,
+# \*(AqMPIRunCommand\*(Aq: None,
+# \*(AqMPIRunArguments\*(Aq: None,
+# \*(AqMPIRunWorkingDirectory\*(Aq: None,
+# \*(AqApplicationCommand\*(Aq: None,
+# \*(AqApplicationArguments\*(Aq: None,
+# \*(AqShimCommand\*(Aq: None,
+# \*(AqMPIAcceptMode\*(Aq: None,
+# \*(AqMPIAcceptFilter\*(Aq: None,
+}
+
+#
+# 2\&. Because there are a lot of different options depending on the Microsoft
+# Visual Studio version, if you use more than one version you have to
+# define a dictionary per version, for instance if you want to create a user
+# file to launch a specific application for testing your dll with Microsoft
+# Visual Studio 2012 (v11):
+#
+V10DebugSettings = {
+ \*(AqLocalDebuggerCommand\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq,
+ \*(AqLocalDebuggerWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq,
+ \*(AqLocalDebuggerCommandArguments\*(Aq: \*(Aq\-p password\*(Aq,
+# \*(AqLocalDebuggerEnvironment\*(Aq: None,
+# \*(AqDebuggerFlavor\*(Aq: \*(AqWindowsLocalDebugger\*(Aq,
+# \*(AqLocalDebuggerAttach\*(Aq: None,
+# \*(AqLocalDebuggerDebuggerType\*(Aq: None,
+# \*(AqLocalDebuggerMergeEnvironment\*(Aq: None,
+# \*(AqLocalDebuggerSQLDebugging\*(Aq: None,
+# \*(AqRemoteDebuggerCommand\*(Aq: None,
+# \*(AqRemoteDebuggerCommandArguments\*(Aq: None,
+# \*(AqRemoteDebuggerWorkingDirectory\*(Aq: None,
+# \*(AqRemoteDebuggerServerName\*(Aq: None,
+# \*(AqRemoteDebuggerConnection\*(Aq: None,
+# \*(AqRemoteDebuggerDebuggerType\*(Aq: None,
+# \*(AqRemoteDebuggerAttach\*(Aq: None,
+# \*(AqRemoteDebuggerSQLDebugging\*(Aq: None,
+# \*(AqDeploymentDirectory\*(Aq: None,
+# \*(AqAdditionalFiles\*(Aq: None,
+# \*(AqRemoteDebuggerDeployDebugCppRuntime\*(Aq: None,
+# \*(AqWebBrowserDebuggerHttpUrl\*(Aq: None,
+# \*(AqWebBrowserDebuggerDebuggerType\*(Aq: None,
+# \*(AqWebServiceDebuggerHttpUrl\*(Aq: None,
+# \*(AqWebServiceDebuggerDebuggerType\*(Aq: None,
+# \*(AqWebServiceDebuggerSQLDebugging\*(Aq: None,
+}
+
+#
+# 3\&. Select the dictionary you want depending on the version of visual Studio
+# Files you want to generate\&.
+#
+if not env\&.GetOption(\*(Aquserfile\*(Aq):
+ dbgSettings = None
+elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq9\&.0\*(Aq:
+ dbgSettings = V9DebugSettings
+elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq11\&.0\*(Aq:
+ dbgSettings = V10DebugSettings
+else:
+ dbgSettings = None
+
+#
+# 4\&. Add the dictionary to the DebugSettings keyword\&.
+#
+barsrcs = [\*(Aqbar\&.cpp\*(Aq, \*(Aqdllmain\&.cpp\*(Aq, \*(Aqstdafx\&.cpp\*(Aq]
+barincs = [\*(Aqtargetver\&.h\*(Aq]
+barlocalincs = [\*(AqStdAfx\&.h\*(Aq]
+barresources = [\*(Aqbar\&.rc\*(Aq,\*(Aqresource\&.h\*(Aq]
+barmisc = [\*(AqReadMe\&.txt\*(Aq]
+
+dll = env\&.SharedLibrary(target = \*(Aqbar\&.dll\*(Aq,
+ source = barsrcs)
+
+env\&.MSVSProject(target = \*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq],
+ srcs = barsrcs,
+ incs = barincs,
+ localincs = barlocalincs,
+ resources = barresources,
+ misc = barmisc,
+ buildtarget = [dll[0]] * 2,
+ variant = (\*(AqDebug|Win32\*(Aq, \*(AqRelease|Win32\*(Aq),
+ cmdargs = \*(Aqvc=%s\*(Aq % msvcver,
+ DebugSettings = (dbgSettings, {}))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBMSVSSolution()\fR, \fBenv\&.MSVSSolution()\fR
+.RS 4
+Builds a Microsoft Visual Studio solution file\&.
+.sp
+This builds a Visual Studio solution file, based on the version of Visual Studio that is configured (either the latest installed version, or the version specified by
+\fB$MSVS_VERSION\fR
+in the construction environment)\&. For Visual Studio 6, it will generate a
+\&.dsw
+file\&. For Visual Studio 7 (\&.NET), it will generate a
+\&.sln
+file\&.
+.sp
+The following values must be specified:
+.PP
+target
+.RS 4
+The name of the target \&.dsw or \&.sln file\&. The correct suffix for the version of Visual Studio must be used, but the value
+\fB$MSVSSOLUTIONSUFFIX\fR
+will be defined to the correct value (see example below)\&.
+.RE
+.PP
+variant
+.RS 4
+The name of this particular variant, or a list of variant names (the latter is only supported for MSVS 7 solutions)\&. These are typically things like "Debug" or "Release", but really can be anything you want\&. For MSVS 7 they may also specify target platform, like this "Debug|Xbox"\&. Default platform is Win32\&.
+.RE
+.PP
+projects
+.RS 4
+A list of project file names, or Project nodes returned by calls to the
+\fBMSVSProject\fR
+Builder, to be placed into the solution file\&. It should be noted that these file names are NOT added to the $SOURCES environment variable in form of files, but rather as strings\&. This is because they represent file names to be added to the solution file, not the source files used to build the solution file\&.
+.RE
+.sp
+Example Usage:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.MSVSSolution(target = \*(AqBar\*(Aq + env[\*(AqMSVSSOLUTIONSUFFIX\*(Aq], projects = [\*(Aqbar\*(Aq
++ env[\*(AqMSVSPROJECTSUFFIX\*(Aq]], variant = \*(AqRelease\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBObject()\fR, \fBenv\&.Object()\fR
+.RS 4
+A synonym for the
+\fBStaticObject\fR
+builder method\&.
+.RE
+.PP
+\fBPackage()\fR, \fBenv\&.Package()\fR
+.RS 4
+Builds a Binary Package of the given source files\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Package(source = FindInstalledFiles())
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Builds software distribution packages\&. Packages consist of files to install and packaging information\&. The former may be specified with the
+\fIsource\fR
+parameter and may be left out, in which case the
+\fBFindInstalledFiles\fR
+function will collect all files that have an
+\fBInstall\fR
+or
+\fBInstallAs\fR
+Builder attached\&. If the
+\fItarget\fR
+is not specified it will be deduced from additional information given to this Builder\&.
+.sp
+The packaging information is specified with the help of construction variables documented below\&. This information is called a tag to stress that some of them can also be attached to files with the
+\fBTag\fR
+function\&. The mandatory ones will complain if they were not specified\&. They vary depending on chosen target packager\&.
+.sp
+The target packager may be selected with the "PACKAGETYPE" command line option or with the
+\fB$PACKAGETYPE\fR
+construction variable\&. Currently the following packagers available:
+.sp
+* msi \- Microsoft Installer * rpm \- Redhat Package Manger * ipkg \- Itsy Package Management System * tarbz2 \- compressed tar * targz \- compressed tar * zip \- zip file * src_tarbz2 \- compressed tar source * src_targz \- compressed tar source * src_zip \- zip file source
+.sp
+An updated list is always available under the "package_type" option when running "scons \-\-help" on a project that has packaging activated\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqpackaging\*(Aq])
+env\&.Install(\*(Aq/bin/\*(Aq, \*(Aqmy_program\*(Aq)
+env\&.Package( NAME = \*(Aqfoo\*(Aq,
+ VERSION = \*(Aq1\&.2\&.3\*(Aq,
+ PACKAGEVERSION = 0,
+ PACKAGETYPE = \*(Aqrpm\*(Aq,
+ LICENSE = \*(Aqgpl\*(Aq,
+ SUMMARY = \*(Aqbalalalalal\*(Aq,
+ DESCRIPTION = \*(Aqthis should be really really long\*(Aq,
+ X_RPM_GROUP = \*(AqApplication/fu\*(Aq,
+ SOURCE_URL = \*(Aqhttp://foo\&.org/foo\-1\&.2\&.3\&.tar\&.gz\*(Aq
+ )
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBPCH()\fR, \fBenv\&.PCH()\fR
+.RS 4
+Builds a Microsoft Visual C++ precompiled header\&. Calling this builder method returns a list of two targets: the PCH as the first element, and the object file as the second element\&. Normally the object file is ignored\&. This builder method is only provided when Microsoft Visual C++ is being used as the compiler\&. The PCH builder method is generally used in conjuction with the PCH construction variable to force object files to use the precompiled header:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqPCH\*(Aq] = env\&.PCH(\*(AqStdAfx\&.cpp\*(Aq)[0]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBPDF()\fR, \fBenv\&.PDF()\fR
+.RS 4
+Builds a
+\&.pdf
+file from a
+\&.dvi
+input file (or, by extension, a
+\&.tex,
+\&.ltx, or
+\&.latex
+input file)\&. The suffix specified by the
+\fB$PDFSUFFIX\fR
+construction variable (\&.pdf
+by default) is added automatically to the target if it is not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds from aaa\&.tex
+env\&.PDF(target = \*(Aqaaa\&.pdf\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
+# builds bbb\&.pdf from bbb\&.dvi
+env\&.PDF(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBPOInit()\fR, \fBenv\&.POInit()\fR
+.RS 4
+This builder belongs to
+msginit
+tool\&. The builder initializes missing
+PO
+file(s) if
+\fB$POAUTOINIT\fR
+is set\&. If
+\fB$POAUTOINIT\fR
+is not set (default),
+\fBPOInit\fR
+prints instruction for user (that is supposed to be a translator), telling how the
+PO
+file should be initialized\&. In normal projects
+\fIyou should not use \fR\fI\fBPOInit\fR\fR\fI and use \fR\fI\fBPOUpdate\fR\fR\fI instead\fR\&.
+\fBPOUpdate\fR
+chooses intelligently between
+\fBmsgmerge(1)\fR
+and
+\fBmsginit(1)\fR\&.
+\fBPOInit\fR
+always uses
+\fBmsginit(1)\fR
+and should be regarded as builder for special purposes or for temporary use (e\&.g\&. for quick, one time initialization of a bunch of
+PO
+files) or for tests\&.
+.sp
+Target nodes defined through
+\fBPOInit\fR
+are not built by default (they\*(Aqre
+Ignored from
+\*(Aq\&.\*(Aq
+node) but are added to special
+Alias
+(\*(Aqpo\-create\*(Aq
+by default)\&. The alias name may be changed through the
+\fB$POCREATE_ALIAS\fR
+construction variable\&. All
+PO
+files defined through
+\fBPOInit\fR
+may be easily initialized by
+\fBscons po\-create\fR\&.
+.sp
+
+\fIExample 1\fR\&. Initialize
+en\&.po
+and
+pl\&.po
+from
+messages\&.pot:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 2\fR\&. Initialize
+en\&.po
+and
+pl\&.po
+from
+foo\&.pot:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.po]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 3\fR\&. Initialize
+en\&.po
+and
+pl\&.po
+from
+foo\&.pot
+but using
+\fB$POTDOMAIN\fR
+construction variable:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\-> [en\&.po, pl\&.po]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 4\fR\&. Initialize
+PO
+files for languages defined in
+LINGUAS
+file\&. The files will be initialized from template
+messages\&.pot:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit(LINGUAS_FILE = 1) # needs \*(AqLINGUAS\*(Aq file
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 5\fR\&. Initialize
+en\&.po
+and
+pl\&.pl
+PO
+files plus files for languages defined in
+LINGUAS
+file\&. The files will be initialized from template
+messages\&.pot:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], LINGUAS_FILE = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 6\fR\&. You may preconfigure your environment first, and then initialize
+PO
+files:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env[\*(AqPOAUTOINIT\*(Aq] = 1
+ env[\*(AqLINGUAS_FILE\*(Aq] = 1
+ env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq
+ env\&.POInit()
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+which has same efect as:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POInit(POAUTOINIT = 1, LINGUAS_FILE = 1, POTDOMAIN = \*(Aqfoo\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBPostScript()\fR, \fBenv\&.PostScript()\fR
+.RS 4
+Builds a
+\&.ps
+file from a
+\&.dvi
+input file (or, by extension, a
+\&.tex,
+\&.ltx, or
+\&.latex
+input file)\&. The suffix specified by the
+\fB$PSSUFFIX\fR
+construction variable (\&.ps
+by default) is added automatically to the target if it is not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds from aaa\&.tex
+env\&.PostScript(target = \*(Aqaaa\&.ps\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
+# builds bbb\&.ps from bbb\&.dvi
+env\&.PostScript(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBPOTUpdate()\fR, \fBenv\&.POTUpdate()\fR
+.RS 4
+The builder belongs to
+xgettext
+tool\&. The builder updates target
+POT
+file if exists or creates one if it doesn\*(Aqt\&. The node is not built by default (i\&.e\&. it is
+Ignored from
+\*(Aq\&.\*(Aq), but only on demand (i\&.e\&. when given
+POT
+file is required or when special alias is invoked)\&. This builder adds its targe node (messages\&.pot, say) to a special alias (pot\-update
+by default, see
+\fB$POTUPDATE_ALIAS\fR) so you can update/create them easily with
+\fBscons pot\-update\fR\&. The file is not written until there is no real change in internationalized messages (or in comments that enter
+POT
+file)\&.
+.sp
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBNote\fR
+.ps -1
+.br
+You may see
+\fBxgettext(1)\fR
+being invoked by the
+xgettext
+tool even if there is no real change in internationalized messages (so the
+POT
+file is not being updated)\&. This happens every time a source file has changed\&. In such case we invoke
+\fBxgettext(1)\fR
+and compare its output with the content of
+POT
+file to decide whether the file should be updated or not\&.
+.sp .5v
+.RE
+.sp
+
+\fIExample 1\&.\fR
+Let\*(Aqs create
+po/
+directory and place following
+SConstruct
+script there:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # SConstruct in \*(Aqpo/\*(Aq subdir
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env\&.POTUpdate([\*(Aqfoo\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq, \*(Aq\&.\&./b\&.cpp\*(Aq])
+ env\&.POTUpdate([\*(Aqbar\*(Aq], [\*(Aq\&.\&./c\&.cpp\*(Aq, \*(Aq\&.\&./d\&.cpp\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Then invoke scons few times:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ user@host:$ scons # Does not create foo\&.pot nor bar\&.pot
+ user@host:$ scons foo\&.pot # Updates or creates foo\&.pot
+ user@host:$ scons pot\-update # Updates or creates foo\&.pot and bar\&.pot
+ user@host:$ scons \-c # Does not clean foo\&.pot nor bar\&.pot\&.
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+the results shall be as the comments above say\&.
+.sp
+
+\fIExample 2\&.\fR
+The
+\fBPOTUpdate\fR
+builder may be used with no target specified, in which case default target
+messages\&.pot
+will be used\&. The default target may also be overriden by setting
+\fB$POTDOMAIN\fR
+construction variable or providing it as an override to
+\fBPOTUpdate\fR
+builder:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+
+ # SConstruct script
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env[\*(AqPOTDOMAIN\*(Aq] = "foo"
+ env\&.POTUpdate(source = ["a\&.cpp", "b\&.cpp"]) # Creates foo\&.pot \&.\&.\&.
+ env\&.POTUpdate(POTDOMAIN = "bar", source = ["c\&.cpp", "d\&.cpp"]) # and bar\&.pot
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 3\&.\fR
+The sources may be specified within separate file, for example
+POTFILES\&.in:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+
+ # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory
+ \&.\&./a\&.cpp
+ \&.\&./b\&.cpp
+ # end of file
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The name of the file (POTFILES\&.in) containing the list of sources is provided via
+\fB$XGETTEXTFROM\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+
+ # SConstruct file in \*(Aqpo/\*(Aq subdirectory
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 4\&.\fR
+You may use
+\fB$XGETTEXTPATH\fR
+to define source search path\&. Assume, for example, that you have files
+a\&.cpp,
+b\&.cpp,
+po/SConstruct,
+po/POTFILES\&.in\&. Then your
+POT\-related files could look as below:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory
+ a\&.cpp
+ b\&.cpp
+ # end of file
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # SConstruct file in \*(Aqpo/\*(Aq subdirectory
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=\*(Aq\&.\&./\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 5\&.\fR
+Multiple search directories may be defined within a list, i\&.e\&.
+XGETTEXTPATH = [\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq, \&.\&.\&.]\&. The order in the list determines the search order of source files\&. The path to the first file found is used\&.
+.sp
+Let\*(Aqs create
+0/1/po/SConstruct
+script:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq, \*(Aq\&.\&./\&.\&./\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+and
+0/1/po/POTFILES\&.in:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # POTFILES\&.in in \*(Aq0/1/po/\*(Aq subdirectory
+ a\&.cpp
+ # end of file
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Write two
+*\&.cpp
+files, the first one is
+0/a\&.cpp:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ /* 0/a\&.cpp */
+ gettext("Hello from \&.\&./\&.\&./a\&.cpp")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+and the second is
+0/1/a\&.cpp:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ /* 0/1/a\&.cpp */
+ gettext("Hello from \&.\&./a\&.cpp")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+then run scons\&. You\*(Aqll obtain
+0/1/po/messages\&.pot
+with the message
+"Hello from \&.\&./a\&.cpp"\&. When you reverse order in
+\fI$XGETTEXTFOM\fR, i\&.e\&. when you write SConscript as
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory
+ env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
+ env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\&.\&./\*(Aq, \*(Aq\&.\&./\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+then the
+messages\&.pot
+will contain
+msgid "Hello from \&.\&./\&.\&./a\&.cpp"
+line and not
+msgid "Hello from \&.\&./a\&.cpp"\&.
+.RE
+.PP
+\fBPOUpdate()\fR, \fBenv\&.POUpdate()\fR
+.RS 4
+The builder belongs to
+msgmerge
+tool\&. The builder updates
+PO
+files with
+\fBmsgmerge(1)\fR, or initializes missing
+PO
+files as described in documentation of
+msginit
+tool and
+\fBPOInit\fR
+builder (see also
+\fB$POAUTOINIT\fR)\&. Note, that
+\fBPOUpdate\fR
+\fIdoes not add its targets to \fR\fIpo\-create\fR\fI alias\fR
+as
+\fBPOInit\fR
+does\&.
+.sp
+Target nodes defined through
+\fBPOUpdate\fR
+are not built by default (they\*(Aqre
+Ignored from
+\*(Aq\&.\*(Aq
+node)\&. Instead, they are added automatically to special
+Alias
+(\*(Aqpo\-update\*(Aq
+by default)\&. The alias name may be changed through the
+\fB$POUPDATE_ALIAS\fR
+construction variable\&. You can easilly update
+PO
+files in your project by
+\fBscons po\-update\fR\&.
+.sp
+
+\fIExample 1\&.\fR
+Update
+en\&.po
+and
+pl\&.po
+from
+messages\&.pot
+template (see also
+\fB$POTDOMAIN\fR), assuming that the later one exists or there is rule to build it (see
+\fBPOTUpdate\fR):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate([\*(Aqen\*(Aq,\*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 2\&.\fR
+Update
+en\&.po
+and
+pl\&.po
+from
+foo\&.pot
+template:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.pl]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 3\&.\fR
+Update
+en\&.po
+and
+pl\&.po
+from
+foo\&.pot
+(another version):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\- > [en\&.po, pl\&.pl]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 4\&.\fR
+Update files for languages defined in
+LINGUAS
+file\&. The files are updated from
+messages\&.pot
+template:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate(LINGUAS_FILE = 1) # needs \*(AqLINGUAS\*(Aq file
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 5\&.\fR
+Same as above, but update from
+foo\&.pot
+template:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate(LINGUAS_FILE = 1, source = [\*(Aqfoo\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 6\&.\fR
+Update
+en\&.po
+and
+pl\&.po
+plus files for languages defined in
+LINGUAS
+file\&. The files are updated from
+messages\&.pot
+template:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # produce \*(Aqen\&.po\*(Aq, \*(Aqpl\&.po\*(Aq + files defined in \*(AqLINGUAS\*(Aq:
+ env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq ], LINGUAS_FILE = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 7\&.\fR
+Use
+\fB$POAUTOINIT\fR
+to automatically initialize
+PO
+file if it doesn\*(Aqt exist:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env\&.POUpdate(LINGUAS_FILE = 1, POAUTOINIT = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 8\&.\fR
+Update
+PO
+files for languages defined in
+LINGUAS
+file\&. The files are updated from
+foo\&.pot
+template\&. All necessary settings are pre\-configured via environment\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # \&.\&.\&.
+ env[\*(AqPOAUTOINIT\*(Aq] = 1
+ env[\*(AqLINGUAS_FILE\*(Aq] = 1
+ env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq
+ env\&.POUpdate()
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBProgram()\fR, \fBenv\&.Program()\fR
+.RS 4
+Builds an executable given one or more object files or C, C++, D, or Fortran source files\&. If any C, C++, D or Fortran source files are specified, then they will be automatically compiled to object files using the
+\fBObject\fR
+builder method; see that builder method\*(Aqs description for a list of legal source file suffixes and how they are interpreted\&. The target executable file prefix (specified by the
+\fB$PROGPREFIX\fR
+construction variable; nothing by default) and suffix (specified by the
+\fB$PROGSUFFIX\fR
+construction variable; by default,
+\&.exe
+on Windows systems, nothing on POSIX systems) are automatically added to the target if not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Program(target = \*(Aqfoo\*(Aq, source = [\*(Aqfoo\&.o\*(Aq, \*(Aqbar\&.c\*(Aq, \*(Aqbaz\&.f\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRES()\fR, \fBenv\&.RES()\fR
+.RS 4
+Builds a Microsoft Visual C++ resource file\&. This builder method is only provided when Microsoft Visual C++ or MinGW is being used as the compiler\&. The
+\&.res
+(or
+\&.o
+for MinGW) suffix is added to the target name if no other suffix is given\&. The source file is scanned for implicit dependencies as though it were a C file\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.RES(\*(Aqresource\&.rc\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRMIC()\fR, \fBenv\&.RMIC()\fR
+.RS 4
+Builds stub and skeleton class files for remote objects from Java
+\&.class
+files\&. The target is a directory relative to which the stub and skeleton class files will be written\&. The source can be the names of
+\&.class
+files, or the objects return from the
+\fBJava\fR
+builder method\&.
+.sp
+If the construction variable
+\fB$JAVACLASSDIR\fR
+is set, either in the environment or in the call to the
+\fBRMIC\fR
+builder method itself, then the value of the variable will be stripped from the beginning of any
+\&.class
+file names\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+classes = env\&.Java(target = \*(Aqclassdir\*(Aq, source = \*(Aqsrc\*(Aq)
+env\&.RMIC(target = \*(Aqoutdir1\*(Aq, source = classes)
+
+env\&.RMIC(target = \*(Aqoutdir2\*(Aq,
+ source = [\*(Aqpackage/foo\&.class\*(Aq, \*(Aqpackage/bar\&.class\*(Aq])
+
+env\&.RMIC(target = \*(Aqoutdir3\*(Aq,
+ source = [\*(Aqclasses/foo\&.class\*(Aq, \*(Aqclasses/bar\&.class\*(Aq],
+ JAVACLASSDIR = \*(Aqclasses\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRPCGenClient()\fR, \fBenv\&.RPCGenClient()\fR
+.RS 4
+Generates an RPC client stub (_clnt\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Builds src/rpcif_clnt\&.c
+env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRPCGenHeader()\fR, \fBenv\&.RPCGenHeader()\fR
+.RS 4
+Generates an RPC header (\&.h) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Builds src/rpcif\&.h
+env\&.RPCGenHeader(\*(Aqsrc/rpcif\&.x\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRPCGenService()\fR, \fBenv\&.RPCGenService()\fR
+.RS 4
+Generates an RPC server\-skeleton (_svc\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Builds src/rpcif_svc\&.c
+env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBRPCGenXDR()\fR, \fBenv\&.RPCGenXDR()\fR
+.RS 4
+Generates an RPC XDR routine (_xdr\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Builds src/rpcif_xdr\&.c
+env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBSharedLibrary()\fR, \fBenv\&.SharedLibrary()\fR
+.RS 4
+Builds a shared library (\&.so
+on a POSIX system,
+\&.dll
+on Windows) given one or more object files or C, C++, D or Fortran source files\&. If any source files are given, then they will be automatically compiled to object files\&. The static library prefix and suffix (if any) are automatically added to the target\&. The target library file prefix (specified by the
+\fB$SHLIBPREFIX\fR
+construction variable; by default,
+lib
+on POSIX systems, nothing on Windows systems) and suffix (specified by the
+\fB$SHLIBSUFFIX\fR
+construction variable; by default,
+\&.dll
+on Windows systems,
+\&.so
+on POSIX systems) are automatically added to the target if not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+On Windows systems, the
+\fBSharedLibrary\fR
+builder method will always build an import (\&.lib) library in addition to the shared (\&.dll) library, adding a
+\&.lib
+library with the same basename if there is not already a
+\&.lib
+file explicitly listed in the targets\&.
+.sp
+On Cygwin systems, the
+\fBSharedLibrary\fR
+builder method will always build an import (\&.dll\&.a) library in addition to the shared (\&.dll) library, adding a
+\&.dll\&.a
+library with the same basename if there is not already a
+\&.dll\&.a
+file explicitly listed in the targets\&.
+.sp
+Any object files listed in the
+source
+must have been built for a shared library (that is, using the
+\fBSharedObject\fR
+builder method)\&.
+scons
+will raise an error if there is any mismatch\&.
+.sp
+On some platforms, there is a distinction between a shared library (loaded automatically by the system to resolve external references) and a loadable module (explicitly loaded by user action)\&. For maximum portability, use the
+\fBLoadableModule\fR
+builder for the latter\&.
+.sp
+When the
+\fB$SHLIBVERSION\fR
+construction variable is defined a versioned shared library is created\&. This modifies the
+\fB$SHLINKFLAGS\fR
+as required, adds the version number to the library name, and creates the symlinks that are needed\&.
+\fB$SHLIBVERSION\fR
+needs to be of the form X\&.Y\&.Z, where X and Y are numbers, and Z is a number but can also contain letters to designate alpha, beta, or release candidate patch levels\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq], SHLIBVERSION=\*(Aq1\&.5\&.2\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+This builder may create multiple links to the library\&. On a POSIX system, for the shared library libbar\&.so\&.2\&.3\&.1, the links created would be libbar\&.so and libbar\&.so\&.2; on a Darwin (OSX) system the library would be libbar\&.2\&.3\&.1\&.dylib and the link would be libbar\&.dylib\&.
+.sp
+On Windows systems, specifying
+register=1
+will cause the
+\&.dll
+to be registered after it is built using REGSVR32\&. The command that is run ("regsvr32" by default) is determined by
+\fB$REGSVR\fR
+construction variable, and the flags passed are determined by
+\fB$REGSVRFLAGS\fR\&. By default,
+\fB$REGSVRFLAGS\fR
+includes the
+\fB/s\fR
+option, to prevent dialogs from popping up and requiring user attention when it is run\&. If you change
+\fB$REGSVRFLAGS\fR, be sure to include the
+\fB/s\fR
+option\&. For example,
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SharedLibrary(target = \*(Aqbar\*(Aq,
+ source = [\*(Aqbar\&.cxx\*(Aq, \*(Aqfoo\&.obj\*(Aq],
+ register=1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+will register
+bar\&.dll
+as a COM object when it is done linking it\&.
+.RE
+.PP
+\fBSharedObject()\fR, \fBenv\&.SharedObject()\fR
+.RS 4
+Builds an object file for inclusion in a shared library\&. Source files must have one of the same set of extensions specified above for the
+\fBStaticObject\fR
+builder method\&. On some platforms building a shared object requires additional compiler option (e\&.g\&.
+\fB\-fPIC\fR
+for gcc) in addition to those needed to build a normal (static) object, but on some platforms there is no difference between a shared object and a normal (static) one\&. When there is a difference, SCons will only allow shared objects to be linked into a shared library, and will use a different suffix for shared objects\&. On platforms where there is no difference, SCons will allow both normal (static) and shared objects to be linked into a shared library, and will use the same suffix for shared and normal (static) objects\&. The target object file prefix (specified by the
+\fB$SHOBJPREFIX\fR
+construction variable; by default, the same as
+\fB$OBJPREFIX\fR) and suffix (specified by the
+\fB$SHOBJSUFFIX\fR
+construction variable) are automatically added to the target if not already present\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SharedObject(target = \*(Aqddd\*(Aq, source = \*(Aqddd\&.c\*(Aq)
+env\&.SharedObject(target = \*(Aqeee\&.o\*(Aq, source = \*(Aqeee\&.cpp\*(Aq)
+env\&.SharedObject(target = \*(Aqfff\&.obj\*(Aq, source = \*(Aqfff\&.for\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the source files will be scanned according to the suffix mappings in the
+SourceFileScanner
+object\&. See the section "Scanner Objects," below, for more information\&.
+.RE
+.PP
+\fBStaticLibrary()\fR, \fBenv\&.StaticLibrary()\fR
+.RS 4
+Builds a static library given one or more object files or C, C++, D or Fortran source files\&. If any source files are given, then they will be automatically compiled to object files\&. The static library prefix and suffix (if any) are automatically added to the target\&. The target library file prefix (specified by the
+\fB$LIBPREFIX\fR
+construction variable; by default,
+lib
+on POSIX systems, nothing on Windows systems) and suffix (specified by the
+\fB$LIBSUFFIX\fR
+construction variable; by default,
+\&.lib
+on Windows systems,
+\&.a
+on POSIX systems) are automatically added to the target if not already present\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.StaticLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Any object files listed in the
+source
+must have been built for a static library (that is, using the
+\fBStaticObject\fR
+builder method)\&.
+scons
+will raise an error if there is any mismatch\&.
+.RE
+.PP
+\fBStaticObject()\fR, \fBenv\&.StaticObject()\fR
+.RS 4
+Builds a static object file from one or more C, C++, D, or Fortran source files\&. Source files must have one of the following extensions:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ \&.asm assembly language file
+ \&.ASM assembly language file
+ \&.c C file
+ \&.C Windows: C file
+ POSIX: C++ file
+ \&.cc C++ file
+ \&.cpp C++ file
+ \&.cxx C++ file
+ \&.cxx C++ file
+ \&.c++ C++ file
+ \&.C++ C++ file
+ \&.d D file
+ \&.f Fortran file
+ \&.F Windows: Fortran file
+ POSIX: Fortran file + C pre\-processor
+ \&.for Fortran file
+ \&.FOR Fortran file
+ \&.fpp Fortran file + C pre\-processor
+ \&.FPP Fortran file + C pre\-processor
+ \&.m Object C file
+ \&.mm Object C++ file
+ \&.s assembly language file
+ \&.S Windows: assembly language file
+ ARM: CodeSourcery Sourcery Lite
+ \&.sx assembly language file + C pre\-processor
+ POSIX: assembly language file + C pre\-processor
+ \&.spp assembly language file + C pre\-processor
+ \&.SPP assembly language file + C pre\-processor
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The target object file prefix (specified by the
+\fB$OBJPREFIX\fR
+construction variable; nothing by default) and suffix (specified by the
+\fB$OBJSUFFIX\fR
+construction variable;
+\&.obj
+on Windows systems,
+\&.o
+on POSIX systems) are automatically added to the target if not already present\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.StaticObject(target = \*(Aqaaa\*(Aq, source = \*(Aqaaa\&.c\*(Aq)
+env\&.StaticObject(target = \*(Aqbbb\&.o\*(Aq, source = \*(Aqbbb\&.c++\*(Aq)
+env\&.StaticObject(target = \*(Aqccc\&.obj\*(Aq, source = \*(Aqccc\&.f\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the source files will be scanned according to the suffix mappings in
+SourceFileScanner
+object\&. See the section "Scanner Objects," below, for more information\&.
+.RE
+.PP
+\fBSubstfile()\fR, \fBenv\&.Substfile()\fR
+.RS 4
+The
+\fBSubstfile\fR
+builder creates a single text file from another file or set of files by concatenating them with
+\fB$LINESEPARATOR\fR
+and replacing text using the
+\fB$SUBST_DICT\fR
+construction variable\&. Nested lists of source files are flattened\&. See also
+\fBTextfile\fR\&.
+.sp
+If a single source file is present with an
+\&.in
+suffix, the suffix is stripped and the remainder is used as the default target name\&.
+.sp
+The prefix and suffix specified by the
+\fB$SUBSTFILEPREFIX\fR
+and
+\fB$SUBSTFILESUFFIX\fR
+construction variables (the null string by default in both cases) are automatically added to the target if they are not already present\&.
+.sp
+If a construction variable named
+\fB$SUBST_DICT\fR
+is present, it may be either a Python dictionary or a sequence of (key,value) tuples\&. If it is a dictionary it is converted into a list of tuples in an arbitrary order, so if one key is a prefix of another key or if one substitution could be further expanded by another subsitition, it is unpredictable whether the expansion will occur\&.
+.sp
+Any occurrences of a key in the source are replaced by the corresponding value, which may be a Python callable function or a string\&. If the value is a callable, it is called with no arguments to get a string\&. Strings are
+\fIsubst\fR\-expanded and the result replaces the key\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools = [\*(Aqdefault\*(Aq, \*(Aqtextfile\*(Aq])
+
+env[\*(Aqprefix\*(Aq] = \*(Aq/usr/bin\*(Aq
+script_dict = {\*(Aq@prefix@\*(Aq: \*(Aq/bin\*(Aq, @exec_prefix@: \*(Aq$prefix\*(Aq}
+env\&.Substfile(\*(Aqscript\&.in\*(Aq, SUBST_DICT = script_dict)
+
+conf_dict = {\*(Aq%VERSION%\*(Aq: \*(Aq1\&.2\&.3\*(Aq, \*(Aq%BASE%\*(Aq: \*(AqMyProg\*(Aq}
+env\&.Substfile(\*(Aqconfig\&.h\&.in\*(Aq, conf_dict, SUBST_DICT = conf_dict)
+
+# UNPREDICTABLE \- one key is a prefix of another
+bad_foo = {\*(Aq$foo\*(Aq: \*(Aq$foo\*(Aq, \*(Aq$foobar\*(Aq: \*(Aq$foobar\*(Aq}
+env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT = bad_foo)
+
+# PREDICTABLE \- keys are applied longest first
+good_foo = [(\*(Aq$foobar\*(Aq, \*(Aq$foobar\*(Aq), (\*(Aq$foo\*(Aq, \*(Aq$foo\*(Aq)]
+env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT = good_foo)
+
+# UNPREDICTABLE \- one substitution could be futher expanded
+bad_bar = {\*(Aq@bar@\*(Aq: \*(Aq@soap@\*(Aq, \*(Aq@soap@\*(Aq: \*(Aqlye\*(Aq}
+env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT = bad_bar)
+
+# PREDICTABLE \- substitutions are expanded in order
+good_bar = ((\*(Aq@bar@\*(Aq, \*(Aq@soap@\*(Aq), (\*(Aq@soap@\*(Aq, \*(Aqlye\*(Aq))
+env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT = good_bar)
+
+# the SUBST_DICT may be in common (and not an override)
+substutions = {}
+subst = Environment(tools = [\*(Aqtextfile\*(Aq], SUBST_DICT = substitutions)
+substitutions[\*(Aq@foo@\*(Aq] = \*(Aqfoo\*(Aq
+subst[\*(AqSUBST_DICT\*(Aq][\*(Aq@bar@\*(Aq] = \*(Aqbar\*(Aq
+subst\&.Substfile(\*(Aqpgm1\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq),
+ Value(\*(Aq#include "@bar@\&.h"\*(Aq),
+ "common\&.in",
+ "pgm1\&.in"
+ ])
+subst\&.Substfile(\*(Aqpgm2\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq),
+ Value(\*(Aq#include "@bar@\&.h"\*(Aq),
+ "common\&.in",
+ "pgm2\&.in"
+ ])
+
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBTar()\fR, \fBenv\&.Tar()\fR
+.RS 4
+Builds a tar archive of the specified files and/or directories\&. Unlike most builder methods, the
+\fBTar\fR
+builder method may be called multiple times for a given target; each additional call adds to the list of entries that will be built into the archive\&. Any source directories will be scanned for changes to any on\-disk files, regardless of whether or not
+scons
+knows about them from other Builder or function calls\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Tar(\*(Aqsrc\&.tar\*(Aq, \*(Aqsrc\*(Aq)
+
+# Create the stuff\&.tar file\&.
+env\&.Tar(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq])
+# Also add "another" to the stuff\&.tar file\&.
+env\&.Tar(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq)
+
+# Set TARFLAGS to create a gzip\-filtered archive\&.
+env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq)
+env\&.Tar(\*(Aqfoo\&.tar\&.gz\*(Aq, \*(Aqfoo\*(Aq)
+
+# Also set the suffix to \&.tgz\&.
+env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq,
+ TARSUFFIX = \*(Aq\&.tgz\*(Aq)
+env\&.Tar(\*(Aqfoo\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBTextfile()\fR, \fBenv\&.Textfile()\fR
+.RS 4
+The
+\fBTextfile\fR
+builder generates a single text file\&. The source strings constitute the lines; nested lists of sources are flattened\&.
+\fB$LINESEPARATOR\fR
+is used to separate the strings\&.
+.sp
+If present, the
+\fB$SUBST_DICT\fR
+construction variable is used to modify the strings before they are written; see the
+\fBSubstfile\fR
+description for details\&.
+.sp
+The prefix and suffix specified by the
+\fB$TEXTFILEPREFIX\fR
+and
+\fB$TEXTFILESUFFIX\fR
+construction variables (the null string and
+\&.txt
+by default, respectively) are automatically added to the target if they are not already present\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# builds/writes foo\&.txt
+env\&.Textfile(target = \*(Aqfoo\&.txt\*(Aq, source = [\*(AqGoethe\*(Aq, 42, \*(AqSchiller\*(Aq])
+
+# builds/writes bar\&.txt
+env\&.Textfile(target = \*(Aqbar\*(Aq,
+ source = [\*(Aqlalala\*(Aq, \*(Aqtanteratei\*(Aq],
+ LINESEPARATOR=\*(Aq|*\*(Aq)
+
+# nested lists are flattened automatically
+env\&.Textfile(target = \*(Aqblob\*(Aq,
+ source = [\*(Aqlalala\*(Aq, [\*(AqGoethe\*(Aq, 42 \*(AqSchiller\*(Aq], \*(Aqtanteratei\*(Aq])
+
+# files may be used as input by wraping them in File()
+env\&.Textfile(target = \*(Aqconcat\*(Aq, # concatenate files with a marker between
+ source = [File(\*(Aqconcat1\*(Aq), File(\*(Aqconcat2\*(Aq)],
+ LINESEPARATOR = \*(Aq====================\en\*(Aq)
+
+Results are:
+foo\&.txt
+ \&.\&.\&.\&.8<\-\-\-\-
+ Goethe
+ 42
+ Schiller
+ \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
+
+bar\&.txt:
+ \&.\&.\&.\&.8<\-\-\-\-
+ lalala|*tanteratei
+ \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
+
+blob\&.txt
+ \&.\&.\&.\&.8<\-\-\-\-
+ lalala
+ Goethe
+ 42
+ Schiller
+ tanteratei
+ \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBTranslate()\fR, \fBenv\&.Translate()\fR
+.RS 4
+This pseudo\-builder belongs to
+gettext
+toolset\&. The builder extracts internationalized messages from source files, updates
+POT
+template (if necessary) and then updates
+PO
+translations (if necessary)\&. If
+\fB$POAUTOINIT\fR
+is set, missing
+PO
+files will be automatically created (i\&.e\&. without translator person intervention)\&. The variables
+\fB$LINGUAS_FILE\fR
+and
+\fB$POTDOMAIN\fR
+are taken into acount too\&. All other construction variables used by
+\fBPOTUpdate\fR, and
+\fBPOUpdate\fR
+work here too\&.
+.sp
+
+\fIExample 1\fR\&. The simplest way is to specify input files and output languages inline in a SCons script when invoking
+\fBTranslate\fR
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# SConscript in \*(Aqpo/\*(Aq directory
+env = Environment( tools = ["default", "gettext"] )
+env[\*(AqPOAUTOINIT\*(Aq] = 1
+env\&.Translate([\*(Aqen\*(Aq,\*(Aqpl\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq,\*(Aq\&.\&./b\&.cpp\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIExample 2\fR\&. If you wish, you may also stick to conventional style known from
+autotools, i\&.e\&. using
+POTFILES\&.in
+and
+LINGUAS
+files
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# LINGUAS
+en pl
+#end
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# POTFILES\&.in
+a\&.cpp
+b\&.cpp
+# end
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# SConscript
+env = Environment( tools = ["default", "gettext"] )
+env[\*(AqPOAUTOINIT\*(Aq] = 1
+env[\*(AqXGETTEXTPATH\*(Aq] = [\*(Aq\&.\&./\*(Aq]
+env\&.Translate(LINGUAS_FILE = 1, XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The last approach is perhaps the recommended one\&. It allows easily split internationalization/localization onto separate SCons scripts, where a script in source tree is responsible for translations (from sources to
+PO
+files) and script(s) under variant directories are responsible for compilation of
+PO
+to
+MO
+files to and for installation of
+MO
+files\&. The "gluing factor" synchronizing these two scripts is then the content of
+LINGUAS
+file\&. Note, that the updated
+POT
+and
+PO
+files are usually going to be committed back to the repository, so they must be updated within the source directory (and not in variant directories)\&. Additionaly, the file listing of
+po/
+directory contains
+LINGUAS
+file, so the source tree looks familiar to translators, and they may work with the project in their usual way\&.
+.sp
+
+\fIExample 3\fR\&. Let\*(Aqs prepare a development tree as below
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ project/
+ + SConstruct
+ + build/
+ + src/
+ + po/
+ + SConscript
+ + SConscript\&.i18n
+ + POTFILES\&.in
+ + LINGUAS
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+with
+build
+being variant directory\&. Write the top\-level
+SConstruct
+script as follows
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # SConstruct
+ env = Environment( tools = ["default", "gettext"] )
+ VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate = 0)
+ env[\*(AqPOAUTOINIT\*(Aq] = 1
+ SConscript(\*(Aqsrc/po/SConscript\&.i18n\*(Aq, exports = \*(Aqenv\*(Aq)
+ SConscript(\*(Aqbuild/po/SConscript\*(Aq, exports = \*(Aqenv\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+the
+src/po/SConscript\&.i18n
+as
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # src/po/SConscript\&.i18n
+ Import(\*(Aqenv\*(Aq)
+ env\&.Translate(LINGUAS_FILE=1, XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+and the
+src/po/SConscript
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ # src/po/SConscript
+ Import(\*(Aqenv\*(Aq)
+ env\&.MOFiles(LINGUAS_FILE = 1)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Such setup produces
+POT
+and
+PO
+files under source tree in
+src/po/
+and binary
+MO
+files under variant tree in
+build/po/\&. This way the
+POT
+and
+PO
+files are separated from other output files, which must not be committed back to source repositories (e\&.g\&.
+MO
+files)\&.
+.sp
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBNote\fR
+.ps -1
+.br
+In above example, the
+PO
+files are not updated, nor created automatically when you issue
+\fBscons \*(Aq\&.\*(Aq\fR
+command\&. The files must be updated (created) by hand via
+\fBscons po\-update\fR
+and then
+MO
+files can be compiled by running
+\fBscons \*(Aq\&.\*(Aq\fR\&.
+.sp .5v
+.RE
+.RE
+.PP
+\fBTypeLibrary()\fR, \fBenv\&.TypeLibrary()\fR
+.RS 4
+Builds a Windows type library (\&.tlb) file from an input IDL file (\&.idl)\&. In addition, it will build the associated inteface stub and proxy source files, naming them according to the base name of the
+\&.idl
+file\&. For example,
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.TypeLibrary(source="foo\&.idl")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Will create
+foo\&.tlb,
+foo\&.h,
+foo_i\&.c,
+foo_p\&.c
+and
+foo_data\&.c
+files\&.
+.RE
+.PP
+\fBUic()\fR, \fBenv\&.Uic()\fR
+.RS 4
+Builds a header file, an implementation file and a moc file from an ui file\&. and returns the corresponding nodes in the above order\&. This builder is only available after using the tool \*(Aqqt\*(Aq\&. Note: you can specify
+\&.ui
+files directly as source files to the
+\fBProgram\fR,
+\fBLibrary\fR
+and
+\fBSharedLibrary\fR
+builders without using this builder\&. Using this builder lets you override the standard naming conventions (be careful: prefixes are always prepended to names of built files; if you don\*(Aqt want prefixes, you may set them to ``)\&. See the
+\fB$QTDIR\fR
+variable for more information\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Uic(\*(Aqfoo\&.ui\*(Aq) # \-> [\*(Aqfoo\&.h\*(Aq, \*(Aquic_foo\&.cc\*(Aq, \*(Aqmoc_foo\&.cc\*(Aq]
+env\&.Uic(target = Split(\*(Aqinclude/foo\&.h gen/uicfoo\&.cc gen/mocfoo\&.cc\*(Aq),
+ source = \*(Aqfoo\&.ui\*(Aq) # \-> [\*(Aqinclude/foo\&.h\*(Aq, \*(Aqgen/uicfoo\&.cc\*(Aq, \*(Aqgen/mocfoo\&.cc\*(Aq]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+\fBZip()\fR, \fBenv\&.Zip()\fR
+.RS 4
+Builds a zip archive of the specified files and/or directories\&. Unlike most builder methods, the
+\fBZip\fR
+builder method may be called multiple times for a given target; each additional call adds to the list of entries that will be built into the archive\&. Any source directories will be scanned for changes to any on\-disk files, regardless of whether or not
+scons
+knows about them from other Builder or function calls\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Zip(\*(Aqsrc\&.zip\*(Aq, \*(Aqsrc\*(Aq)
+
+# Create the stuff\&.zip file\&.
+env\&.Zip(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq])
+# Also add "another" to the stuff\&.tar file\&.
+env\&.Zip(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+All targets of builder methods automatically depend on their sources\&. An explicit dependency can be specified using the
+\fBDepends\fR
+method of a construction environment (see below)\&.
+.PP
+In addition,
+\fBscons\fR
+automatically scans source files for various programming languages, so the dependencies do not need to be specified explicitly\&. By default, SCons can C source files, C++ source files, Fortran source files with
+\fB\&.F\fR
+(POSIX systems only),
+\fB\&.fpp,\fR
+or
+\fB\&.FPP\fR
+file extensions, and assembly language files with
+\fB\&.S\fR
+(POSIX systems only),
+\fB\&.spp,\fR
+or
+\fB\&.SPP\fR
+files extensions for C preprocessor dependencies\&. SCons also has default support for scanning D source files, You can also write your own Scanners to add support for additional source file types\&. These can be added to the default Scanner object used by the
+\fBObject\fR(),
+\fBStaticObject\fR(), and
+\fBSharedObject\fR() Builders by adding them to the
+\fBSourceFileScanner\fR
+object\&. See the section "Scanner Objects" below, for more information about defining your own Scanner objects and using the
+\fBSourceFileScanner\fR
+object\&.
+.SS "Methods and Functions to Do Things"
+.PP
+In addition to Builder methods,
+\fBscons\fR
+provides a number of other construction environment methods and global functions to manipulate the build configuration\&.
+.PP
+Usually, a construction environment method and global function with the same name both exist so that you don\*(Aqt have to remember whether to a specific bit of functionality must be called with or without a construction environment\&. In the following list, if you call something as a global function it looks like:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Function(\fIarguments\fR)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+and if you call something through a construction environment it looks like:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Function(\fIarguments\fR)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+If you can call the functionality in both ways, then both forms are listed\&.
+.PP
+Global functions may be called from custom Python modules that you import into an SConscript file by adding the following to the Python module:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+from SCons\&.Script import *
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Except where otherwise noted, the same\-named construction environment method and global function provide the exact same functionality\&. The only difference is that, where appropriate, calling the functionality through a construction environment will substitute construction variables into any supplied strings\&. For example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(FOO = \*(Aqfoo\*(Aq)
+Default(\*(Aq$FOO\*(Aq)
+env\&.Default(\*(Aq$FOO\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+In the above example, the first call to the global
+\fBDefault()\fR
+function will actually add a target named
+\fB$FOO\fR
+to the list of default targets, while the second call to the
+\fBenv\&.Default()\fR
+construction environment method will expand the value and add a target named
+\fBfoo\fR
+to the list of default targets\&. For more on construction variable expansion, see the next section on construction variables\&.
+.PP
+Construction environment methods and global functions supported by
+\fBscons\fR
+include:
+.PP
+Action(action, [cmd/str/fun, [var, \&.\&.\&.]] [option=value, \&.\&.\&.]), env\&.Action(action, [cmd/str/fun, [var, \&.\&.\&.]] [option=value, \&.\&.\&.])
+.RS 4
+Creates an Action object for the specified
+\fIaction\fR\&. See the section "Action Objects," below, for a complete explanation of the arguments and behavior\&.
+.sp
+Note that the
+\fBenv\&.Action\fR() form of the invocation will expand construction variables in any argument strings, including the
+\fIaction\fR
+argument, at the time it is called using the construction variables in the
+\fIenv\fR
+construction environment through which
+\fBenv\&.Action\fR() was called\&. The
+\fBAction\fR() form delays all variable expansion until the Action object is actually used\&.
+.RE
+.PP
+AddMethod(object, function, [name]), env\&.AddMethod(function, [name])
+.RS 4
+When called with the
+\fBAddMethod\fR() form, adds the specified
+\fIfunction\fR
+to the specified
+\fIobject\fR
+as the specified method
+\fIname\fR\&. When called with the
+\fBenv\&.AddMethod\fR() form, adds the specified
+\fIfunction\fR
+to the construction environment
+\fIenv\fR
+as the specified method
+\fIname\fR\&. In both cases, if
+\fIname\fR
+is omitted or
+None, the name of the specified
+\fIfunction\fR
+itself is used for the method name\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Note that the first argument to the function to
+# be attached as a method must be the object through
+# which the method will be called; the Python
+# convention is to call it \*(Aqself\*(Aq\&.
+def my_method(self, arg):
+ print "my_method() got", arg
+
+# Use the global AddMethod() function to add a method
+# to the Environment class\&. This
+AddMethod(Environment, my_method)
+env = Environment()
+env\&.my_method(\*(Aqarg\*(Aq)
+
+# Add the function as a method, using the function
+# name for the method call\&.
+env = Environment()
+env\&.AddMethod(my_method, \*(Aqother_method_name\*(Aq)
+env\&.other_method_name(\*(Aqanother arg\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+AddOption(arguments)
+.RS 4
+This function adds a new command\-line option to be recognized\&. The specified
+\fIarguments\fR
+are the same as supported by the standard Python
+\fBoptparse\&.add_option\fR() method (with a few additional capabilities noted below); see the documentation for
+optparse
+for a thorough discussion of its option\-processing capabities\&.
+.sp
+In addition to the arguments and values supported by the
+\fBoptparse\&.add_option\fR() method, the SCons
+\fBAddOption\fR
+function allows you to set the
+nargs
+keyword value to
+\*(Aq?\*(Aq
+(a string with just the question mark) to indicate that the specified long option(s) take(s) an
+\fIoptional\fR
+argument\&. When
+nargs = \*(Aq?\*(Aq
+is passed to the
+\fBAddOption\fR
+function, the
+const
+keyword argument may be used to supply the "default" value that should be used when the option is specified on the command line without an explicit argument\&.
+.sp
+If no
+default=
+keyword argument is supplied when calling
+\fBAddOption\fR, the option will have a default value of
+None\&.
+.sp
+Once a new command\-line option has been added with
+\fBAddOption\fR, the option value may be accessed using
+\fBGetOption\fR
+or
+\fBenv\&.GetOption\fR()\&. The value may also be set, using
+\fBSetOption\fR
+or
+\fBenv\&.SetOption\fR(), if conditions in a
+SConscript
+require overriding any default value\&. Note, however, that a value specified on the command line will
+\fIalways\fR
+override a value set by any SConscript file\&.
+.sp
+Any specified
+help=
+strings for the new option(s) will be displayed by the
+\fB\-H\fR
+or
+\fB\-h\fR
+options (the latter only if no other help text is specified in the SConscript files)\&. The help text for the local options specified by
+\fBAddOption\fR
+will appear below the SCons options themselves, under a separate
+Local Options
+heading\&. The options will appear in the help text in the order in which the
+\fBAddOption\fR
+calls occur\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+AddOption(\*(Aq\-\-prefix\*(Aq,
+ dest=\*(Aqprefix\*(Aq,
+ nargs=1, type=\*(Aqstring\*(Aq,
+ action=\*(Aqstore\*(Aq,
+ metavar=\*(AqDIR\*(Aq,
+ help=\*(Aqinstallation prefix\*(Aq)
+env = Environment(PREFIX = GetOption(\*(Aqprefix\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+AddPostAction(target, action), env\&.AddPostAction(target, action)
+.RS 4
+Arranges for the specified
+\fIaction\fR
+to be performed after the specified
+\fItarget\fR
+has been built\&. The specified action(s) may be an Action object, or anything that can be converted into an Action object (see below)\&.
+.sp
+When multiple targets are supplied, the action may be called multiple times, once after each action that generates one or more targets in the list\&.
+.RE
+.PP
+AddPreAction(target, action), env\&.AddPreAction(target, action)
+.RS 4
+Arranges for the specified
+\fIaction\fR
+to be performed before the specified
+\fItarget\fR
+is built\&. The specified action(s) may be an Action object, or anything that can be converted into an Action object (see below)\&.
+.sp
+When multiple targets are specified, the action(s) may be called multiple times, once before each action that generates one or more targets in the list\&.
+.sp
+Note that if any of the targets are built in multiple steps, the action will be invoked just before the "final" action that specifically generates the specified target(s)\&. For example, when building an executable program from a specified source
+\&.c
+file via an intermediate object file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = Program(\*(Aqfoo\&.c\*(Aq)
+AddPreAction(foo, \*(Aqpre_action\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The specified
+pre_action
+would be executed before
+scons
+calls the link command that actually generates the executable program binary
+foo, not before compiling the
+foo\&.c
+file into an object file\&.
+.RE
+.PP
+Alias(alias, [targets, [action]]), env\&.Alias(alias, [targets, [action]])
+.RS 4
+Creates one or more phony targets that expand to one or more other targets\&. An optional
+\fIaction\fR
+(command) or list of actions can be specified that will be executed whenever the any of the alias targets are out\-of\-date\&. Returns the Node object representing the alias, which exists outside of any file system\&. This Node object, or the alias name, may be used as a dependency of any other target, including another alias\&.
+\fBAlias\fR
+can be called multiple times for the same alias to add additional targets to the alias, or additional actions to the list for this alias\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Alias(\*(Aqinstall\*(Aq)
+Alias(\*(Aqinstall\*(Aq, \*(Aq/usr/bin\*(Aq)
+Alias([\*(Aqinstall\*(Aq, \*(Aqinstall\-lib\*(Aq], \*(Aq/usr/local/lib\*(Aq)
+
+env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/bin\*(Aq, \*(Aq/usr/local/lib\*(Aq])
+env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/man\*(Aq])
+
+env\&.Alias(\*(Aqupdate\*(Aq, [\*(Aqfile1\*(Aq, \*(Aqfile2\*(Aq], "update_database $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+AllowSubstExceptions([exception, \&.\&.\&.])
+.RS 4
+Specifies the exceptions that will be allowed when expanding construction variables\&. By default, any construction variable expansions that generate a
+NameError
+or
+IndexError
+exception will expand to a
+\*(Aq\*(Aq
+(a null string) and not cause scons to fail\&. All exceptions not in the specified list will generate an error message and terminate processing\&.
+.sp
+If
+\fBAllowSubstExceptions\fR
+is called multiple times, each call completely overwrites the previous list of allowed exceptions\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Requires that all construction variable names exist\&.
+# (You may wish to do this if you want to enforce strictly
+# that all construction variables must be defined before use\&.)
+AllowSubstExceptions()
+
+# Also allow a string containing a zero\-division expansion
+# like \*(Aq${1 / 0}\*(Aq to evalute to \*(Aq\*(Aq\&.
+AllowSubstExceptions(IndexError, NameError, ZeroDivisionError)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+AlwaysBuild(target, \&.\&.\&.), env\&.AlwaysBuild(target, \&.\&.\&.)
+.RS 4
+Marks each given
+\fItarget\fR
+so that it is always assumed to be out of date, and will always be rebuilt if needed\&. Note, however, that
+\fBAlwaysBuild\fR
+does not add its target(s) to the default target list, so the targets will only be built if they are specified on the command line, or are a dependent of a target specified on the command line\-\-but they will
+\fIalways\fR
+be built if so specified\&. Multiple targets can be passed in to a single call to
+\fBAlwaysBuild\fR\&.
+.RE
+.PP
+env\&.Append(key=val, [\&.\&.\&.])
+.RS 4
+Appends the specified keyword arguments to the end of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the values of the construction variable and the keyword argument are the same type, then the two values will be simply added together\&. Otherwise, the construction variable and the value of the keyword argument are both coerced to lists, and the lists are added together\&. (See also the Prepend method, below\&.)
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Append(CCFLAGS = \*(Aq \-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.AppendENVPath(name, newpath, [envname, sep, delete_existing])
+.RS 4
+This appends new path elements to the given path in the specified external environment (ENV
+by default)\&. This will only add any particular path once (leaving the last one it encounters and ignoring the rest, to preserve path order), and to help assure this, will normalize all paths (using
+\fBos\&.path\&.normpath\fR
+and
+\fBos\&.path\&.normcase\fR)\&. This can also handle the case where the given old path variable is a list instead of a string, in which case a list will be returned instead of a string\&.
+.sp
+If
+\fIdelete_existing\fR
+is 0, then adding a path that already exists will not move it to the end; it will stay where it is in the list\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print \*(Aqbefore:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
+include_path = \*(Aq/foo/bar:/foo\*(Aq
+env\&.AppendENVPath(\*(AqINCLUDE\*(Aq, include_path)
+print \*(Aqafter:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
+
+yields:
+before: /foo:/biz
+after: /biz:/foo/bar:/foo
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.AppendUnique(key=val, [\&.\&.\&.], delete_existing=0)
+.RS 4
+Appends the specified keyword arguments to the end of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the construction variable being appended to is a list, then any value(s) that already exist in the construction variable will
+\fInot\fR
+be added again to the list\&. However, if delete_existing is 1, existing matching values are removed first, so existing values in the arg list move to the end of the list\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.AppendUnique(CCFLAGS = \*(Aq\-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.BitKeeper()
+.RS 4
+A factory function that returns a Builder object to be used to fetch source files using BitKeeper\&. The returned Builder is intended to be passed to the
+\fBSourceCode\fR
+function\&.
+.sp
+This function is deprecated\&. For details, see the entry for the
+\fBSourceCode\fR
+function\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.BitKeeper())
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+BuildDir(build_dir, src_dir, [duplicate]), env\&.BuildDir(build_dir, src_dir, [duplicate])
+.RS 4
+Deprecated synonyms for
+\fBVariantDir\fR
+and
+\fBenv\&.VariantDir\fR()\&. The
+\fIbuild_dir\fR
+argument becomes the
+\fIvariant_dir\fR
+argument of
+\fBVariantDir\fR
+or
+\fBenv\&.VariantDir\fR()\&.
+.RE
+.PP
+Builder(action, [arguments]), env\&.Builder(action, [arguments])
+.RS 4
+Creates a Builder object for the specified
+\fIaction\fR\&. See the section "Builder Objects," below, for a complete explanation of the arguments and behavior\&.
+.sp
+Note that the
+\fBenv\&.Builder\fR() form of the invocation will expand construction variables in any arguments strings, including the
+\fIaction\fR
+argument, at the time it is called using the construction variables in the
+\fIenv\fR
+construction environment through which
+\fBenv\&.Builder\fR() was called\&. The
+\fBBuilder\fR
+form delays all variable expansion until after the Builder object is actually called\&.
+.RE
+.PP
+CacheDir(cache_dir), env\&.CacheDir(cache_dir)
+.RS 4
+Specifies that
+scons
+will maintain a cache of derived files in
+\fIcache_dir\fR\&. The derived files in the cache will be shared among all the builds using the same
+\fBCacheDir\fR
+call\&. Specifying a
+\fIcache_dir\fR
+of
+None
+disables derived file caching\&.
+.sp
+Calling
+\fBenv\&.CacheDir\fR() will only affect targets built through the specified construction environment\&. Calling
+\fBCacheDir\fR
+sets a global default that will be used by all targets built through construction environments that do
+\fInot\fR
+have an
+\fBenv\&.CacheDir\fR() specified\&.
+.sp
+When a
+\fBCacheDir\fR() is being used and
+scons
+finds a derived file that needs to be rebuilt, it will first look in the cache to see if a derived file has already been built from identical input files and an identical build action (as incorporated into the MD5 build signature)\&. If so,
+scons
+will retrieve the file from the cache\&. If the derived file is not present in the cache,
+scons
+will rebuild it and then place a copy of the built file in the cache (identified by its MD5 build signature), so that it may be retrieved by other builds that need to build the same derived file from identical inputs\&.
+.sp
+Use of a specified
+\fBCacheDir\fR
+may be disabled for any invocation by using the
+\fB\-\-cache\-disable\fR
+option\&.
+.sp
+If the
+\fB\-\-cache\-force\fR
+option is used,
+scons
+will place a copy of
+\fIall\fR
+derived files in the cache, even if they already existed and were not built by this invocation\&. This is useful to populate a cache the first time
+\fBCacheDir\fR
+is added to a build, or after using the
+\fB\-\-cache\-disable\fR
+option\&.
+.sp
+When using
+\fBCacheDir\fR,
+scons
+will report, "Retrieved `file\*(Aq from cache," unless the
+\fB\-\-cache\-show\fR
+option is being used\&. When the
+\fB\-\-cache\-show\fR
+option is used,
+scons
+will print the action that
+\fIwould\fR
+have been used to build the file, without any indication that the file was actually retrieved from the cache\&. This is useful to generate build logs that are equivalent regardless of whether a given derived file has been built in\-place or retrieved from the cache\&.
+.sp
+The
+\fBNoCache\fR
+method can be used to disable caching of specific files\&. This can be useful if inputs and/or outputs of some tool are impossible to predict or prohibitively large\&.
+.RE
+.PP
+Clean(targets, files_or_dirs), env\&.Clean(targets, files_or_dirs)
+.RS 4
+This specifies a list of files or directories which should be removed whenever the targets are specified with the
+\fB\-c\fR
+command line option\&. The specified targets may be a list or an individual target\&. Multiple calls to
+\fBClean\fR
+are legal, and create new targets or add files and directories to the clean list for the specified targets\&.
+.sp
+Multiple files or directories should be specified either as separate arguments to the
+\fBClean\fR
+method, or as a list\&.
+\fBClean\fR
+will also accept the return value of any of the construction environment Builder methods\&. Examples:
+.sp
+The related
+\fBNoClean\fR
+function overrides calling
+\fBClean\fR
+for the same target, and any targets passed to both functions will
+\fInot\fR
+be removed by the
+\fB\-c\fR
+option\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Clean(\*(Aqfoo\*(Aq, [\*(Aqbar\*(Aq, \*(Aqbaz\*(Aq])
+Clean(\*(Aqdist\*(Aq, env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
+Clean([\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq], \*(Aqsomething_else_to_clean\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+In this example, installing the project creates a subdirectory for the documentation\&. This statement causes the subdirectory to be removed if the project is deinstalled\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Clean(docdir, os\&.path\&.join(docdir, projectname))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.Clone([key=val, \&.\&.\&.])
+.RS 4
+Returns a separate copy of a construction environment\&. If there are any keyword arguments specified, they are added to the returned copy, overwriting any existing values for the keywords\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env2 = env\&.Clone()
+env3 = env\&.Clone(CCFLAGS = \*(Aq\-g\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Additionally, a list of tools and a toolpath may be specified, as in the Environment constructor:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def MyTool(env): env[\*(AqFOO\*(Aq] = \*(Aqbar\*(Aq
+env4 = env\&.Clone(tools = [\*(Aqmsvc\*(Aq, MyTool])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fIparse_flags\fR
+keyword argument is also recognized:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# create an environment for compiling programs that use wxWidgets
+wx_env = env\&.Clone(parse_flags = \*(Aq!wx\-config \-\-cflags \-\-cxxflags\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Command(target, source, action, [key=val, \&.\&.\&.]), env\&.Command(target, source, action, [key=val, \&.\&.\&.])
+.RS 4
+Executes a specific action (or list of actions) to build a target file or files\&. This is more convenient than defining a separate Builder object for a single special\-case build\&.
+.sp
+As a special case, the
+\fIsource_scanner\fR
+keyword argument can be used to specify a Scanner object that will be used to scan the sources\&. (The global
+DirScanner
+object can be used if any of the sources will be directories that must be scanned on\-disk for changes to files that aren\*(Aqt already specified in other Builder of function calls\&.)
+.sp
+Any other keyword arguments specified override any same\-named existing construction variables\&.
+.sp
+An action can be an external command, specified as a string, or a callable Python object; see "Action Objects," below, for more complete information\&. Also note that a string specifying an external command may be preceded by an
+@
+(at\-sign) to suppress printing the command in question, or by a
+\-
+(hyphen) to ignore the exit status of the external command\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ "$FOO_BUILD < $SOURCES > $TARGET")
+
+env\&.Command(\*(Aqbar\&.out\*(Aq, \*(Aqbar\&.in\*(Aq,
+ ["rm \-f $TARGET",
+ "$BAR_BUILD < $SOURCES > $TARGET"],
+ ENV = {\*(AqPATH\*(Aq : \*(Aq/usr/local/bin/\*(Aq})
+
+def rename(env, target, source):
+ import os
+ os\&.rename(\*(Aq\&.tmp\*(Aq, str(target[0]))
+
+env\&.Command(\*(Aqbaz\&.out\*(Aq, \*(Aqbaz\&.in\*(Aq,
+ ["$BAZ_BUILD < $SOURCES > \&.tmp",
+ rename ])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the
+\fBCommand\fR
+function will usually assume, by default, that the specified targets and/or sources are Files, if no other part of the configuration identifies what type of entry it is\&. If necessary, you can explicitly specify that targets or source nodes should be treated as directoriese by using the
+\fBDir\fR
+or
+\fBenv\&.Dir\fR() functions\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Command(\*(Aqddd\&.list\*(Aq, Dir(\*(Aqddd\*(Aq), \*(Aqls \-l $SOURCE > $TARGET\*(Aq)
+
+env[\*(AqDISTDIR\*(Aq] = \*(Aqdestination/directory\*(Aq
+env\&.Command(env\&.Dir(\*(Aq$DISTDIR\*(Aq)), None, make_distdir)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+(Also note that SCons will usually automatically create any directory necessary to hold a target file, so you normally don\*(Aqt need to create directories by hand\&.)
+.RE
+.PP
+Configure(env, [custom_tests, conf_dir, log_file, config_h]), env\&.Configure([custom_tests, conf_dir, log_file, config_h])
+.RS 4
+Creates a Configure object for integrated functionality similar to GNU autoconf\&. See the section "Configure Contexts," below, for a complete explanation of the arguments and behavior\&.
+.RE
+.PP
+env\&.Copy([key=val, \&.\&.\&.])
+.RS 4
+A now\-deprecated synonym for
+\fBenv\&.Clone\fR()\&.
+.RE
+.PP
+env\&.CVS(repository, module)
+.RS 4
+A factory function that returns a Builder object to be used to fetch source files from the specified CVS
+\fIrepository\fR\&. The returned Builder is intended to be passed to the
+\fBSourceCode\fR
+function\&.
+.sp
+This function is deprecated\&. For details, see the entry for the
+\fBSourceCode\fR
+function\&.
+.sp
+The optional specified
+\fImodule\fR
+will be added to the beginning of all repository path names; this can be used, in essence, to strip initial directory names from the repository path names, so that you only have to replicate part of the repository directory hierarchy in your local build directory\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Will fetch foo/bar/src\&.c
+# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq))
+
+# Will fetch bar/src\&.c
+# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq, \*(Aqfoo\*(Aq))
+
+# Will fetch src\&.c
+# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq, \*(Aqfoo/bar\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Decider(function), env\&.Decider(function)
+.RS 4
+Specifies that all up\-to\-date decisions for targets built through this construction environment will be handled by the specified
+\fIfunction\fR\&. The
+\fIfunction\fR
+can be one of the following strings that specify the type of decision function to be performed:
+.PP
+timestamp\-newer
+.RS 4
+Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs timestamp is newer than the target file\*(Aqs timestamp\&. This is the behavior of the classic Make utility, and
+make
+can be used a synonym for
+timestamp\-newer\&.
+.RE
+.PP
+timestamp\-match
+.RS 4
+Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs timestamp is different than the timestamp recorded the last time the target was built\&. This provides behavior very similar to the classic Make utility (in particular, files are not opened up so that their contents can be checksummed) except that the target will also be rebuilt if a dependency file has been restored to a version with an
+\fIearlier\fR
+timestamp, such as can happen when restoring files from backup archives\&.
+.RE
+.PP
+MD5
+.RS 4
+Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs content has changed sine the last time the target was built, as determined be performing an MD5 checksum on the dependency\*(Aqs contents and comparing it to the checksum recorded the last time the target was built\&.
+content
+can be used as a synonym for
+MD5\&.
+.RE
+.PP
+MD5\-timestamp
+.RS 4
+Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs content has changed sine the last time the target was built, except that dependencies with a timestamp that matches the last time the target was rebuilt will be assumed to be up\-to\-date and
+\fInot\fR
+rebuilt\&. This provides behavior very similar to the
+MD5
+behavior of always checksumming file contents, with an optimization of not checking the contents of files whose timestamps haven\*(Aqt changed\&. The drawback is that SCons will
+\fInot\fR
+detect if a file\*(Aqs content has changed but its timestamp is the same, as might happen in an automated script that runs a build, updates a file, and runs the build again, all within a single second\&.
+.RE
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Use exact timestamp matches by default\&.
+Decider(\*(Aqtimestamp\-match\*(Aq)
+
+# Use MD5 content signatures for any targets built
+# with the attached construction environment\&.
+env\&.Decider(\*(Aqcontent\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+In addition to the above already\-available functions, the
+\fIfunction\fR
+argument may be an actual Python function that takes the following three arguments:
+.PP
+\fIdependency\fR
+.RS 4
+The Node (file) which should cause the
+\fItarget\fR
+to be rebuilt if it has "changed" since the last tme
+\fItarget\fR
+was built\&.
+.RE
+.PP
+\fItarget\fR
+.RS 4
+The Node (file) being built\&. In the normal case, this is what should get rebuilt if the
+\fIdependency\fR
+has "changed\&."
+.RE
+.PP
+\fIprev_ni\fR
+.RS 4
+Stored information about the state of the
+\fIdependency\fR
+the last time the
+\fItarget\fR
+was built\&. This can be consulted to match various file characteristics such as the timestamp, size, or content signature\&.
+.RE
+.sp
+The
+\fIfunction\fR
+should return a
+True
+(non\-zero) value if the
+\fIdependency\fR
+has "changed" since the last time the
+\fItarget\fR
+was built (indicating that the target
+\fIshould\fR
+be rebuilt), and
+False
+(zero) otherwise (indicating that the target should
+\fInot\fR
+be rebuilt)\&. Note that the decision can be made using whatever criteria are appopriate\&. Ignoring some or all of the function arguments is perfectly normal\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_decider(dependency, target, prev_ni):
+ return not os\&.path\&.exists(str(target))
+
+env\&.Decider(my_decider)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Default(targets), env\&.Default(targets)
+.RS 4
+This specifies a list of default targets, which will be built by
+scons
+if no explicit targets are given on the command line\&. Multiple calls to
+\fBDefault\fR
+are legal, and add to the list of default targets\&.
+.sp
+Multiple targets should be specified as separate arguments to the
+\fBDefault\fR
+method, or as a list\&.
+\fBDefault\fR
+will also accept the Node returned by any of a construction environment\*(Aqs builder methods\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Default(\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq, \*(Aqbaz\*(Aq)
+env\&.Default([\*(Aqa\*(Aq, \*(Aqb\*(Aq, \*(Aqc\*(Aq])
+hello = env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)
+env\&.Default(hello)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+An argument to
+\fBDefault\fR
+of
+None
+will clear all default targets\&. Later calls to
+\fBDefault\fR
+will add to the (now empty) default\-target list like normal\&.
+.sp
+The current list of targets added using the
+\fBDefault\fR
+function or method is available in the
+DEFAULT_TARGETS
+list; see below\&.
+.RE
+.PP
+DefaultEnvironment([args])
+.RS 4
+Creates and returns a default construction environment object\&. This construction environment is used internally by SCons in order to execute many of the global functions in this list, and to fetch source files transparently from source code management systems\&.
+.RE
+.PP
+Depends(target, dependency), env\&.Depends(target, dependency)
+.RS 4
+Specifies an explicit dependency; the
+\fItarget\fR
+will be rebuilt whenever the
+\fIdependency\fR
+has changed\&. Both the specified
+\fItarget\fR
+and
+\fIdependency\fR
+can be a string (usually the path name of a file or directory) or Node objects, or a list of strings or Node objects (such as returned by a Builder call)\&. This should only be necessary for cases where the dependency is not caught by a Scanner for the file\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Depends(\*(Aqfoo\*(Aq, \*(Aqother\-input\-file\-for\-foo\*(Aq)
+
+mylib = env\&.Library(\*(Aqmylib\&.c\*(Aq)
+installed_lib = env\&.Install(\*(Aqlib\*(Aq, mylib)
+bar = env\&.Program(\*(Aqbar\&.c\*(Aq)
+
+# Arrange for the library to be copied into the installation
+# directory before trying to build the "bar" program\&.
+# (Note that this is for example only\&. A "real" library
+# dependency would normally be configured through the $LIBS
+# and $LIBPATH variables, not using an env\&.Depends() call\&.)
+
+env\&.Depends(bar, installed_lib)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.Dictionary([vars])
+.RS 4
+Returns a dictionary object containing copies of all of the construction variables in the environment\&. If there are any variable names specified, only the specified construction variables are returned in the dictionary\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+dict = env\&.Dictionary()
+cc_dict = env\&.Dictionary(\*(AqCC\*(Aq, \*(AqCCFLAGS\*(Aq, \*(AqCCCOM\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Dir(name, [directory]), env\&.Dir(name, [directory])
+.RS 4
+This returns a Directory Node, an object that represents the specified directory
+\fIname\fR\&.
+\fIname\fR
+can be a relative or absolute path\&.
+\fIdirectory\fR
+is an optional directory that will be used as the parent directory\&. If no
+\fIdirectory\fR
+is specified, the current script\*(Aqs directory is used as the parent\&.
+.sp
+If
+\fIname\fR
+is a list, SCons returns a list of Dir nodes\&. Construction variables are expanded in
+\fIname\fR\&.
+.sp
+Directory Nodes can be used anywhere you would supply a string as a directory name to a Builder method or function\&. Directory Nodes have attributes and methods that are useful in many situations; see "File and Directory Nodes," below\&.
+.RE
+.PP
+env\&.Dump([key])
+.RS 4
+Returns a pretty printable representation of the environment\&.
+\fIkey\fR, if not
+None, should be a string containing the name of the variable of interest\&.
+.sp
+This SConstruct:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env=Environment()
+print env\&.Dump(\*(AqCCCOM\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+will print:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\*(Aq$CC \-c \-o $TARGET $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+While this SConstruct:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env=Environment()
+print env\&.Dump()
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+will print:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+{ \*(AqAR\*(Aq: \*(Aqar\*(Aq,
+ \*(AqARCOM\*(Aq: \*(Aq$AR $ARFLAGS $TARGET $SOURCES\en$RANLIB $RANLIBFLAGS $TARGET\*(Aq,
+ \*(AqARFLAGS\*(Aq: [\*(Aqr\*(Aq],
+ \*(AqAS\*(Aq: \*(Aqas\*(Aq,
+ \*(AqASCOM\*(Aq: \*(Aq$AS $ASFLAGS \-o $TARGET $SOURCES\*(Aq,
+ \*(AqASFLAGS\*(Aq: [],
+ \&.\&.\&.
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+EnsurePythonVersion(major, minor), env\&.EnsurePythonVersion(major, minor)
+.RS 4
+Ensure that the Python version is at least
+\fImajor\fR\&.\fIminor\fR\&. This function will print out an error message and exit SCons with a non\-zero exit code if the actual Python version is not late enough\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+EnsurePythonVersion(2,2)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+EnsureSConsVersion(major, minor, [revision]), env\&.EnsureSConsVersion(major, minor, [revision])
+.RS 4
+Ensure that the SCons version is at least
+\fImajor\&.minor\fR, or
+\fImajor\&.minor\&.revision\fR\&. if
+\fIrevision\fR
+is specified\&. This function will print out an error message and exit SCons with a non\-zero exit code if the actual SCons version is not late enough\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+EnsureSConsVersion(0,14)
+
+EnsureSConsVersion(0,96,90)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Environment([key=value, \&.\&.\&.]), env\&.Environment([key=value, \&.\&.\&.])
+.RS 4
+Return a new construction environment initialized with the specified
+\fIkey\fR=\fIvalue\fR
+pairs\&.
+.RE
+.PP
+Execute(action, [strfunction, varlist]), env\&.Execute(action, [strfunction, varlist])
+.RS 4
+Executes an Action object\&. The specified
+\fIaction\fR
+may be an Action object (see the section "Action Objects," below, for a complete explanation of the arguments and behavior), or it may be a command\-line string, list of commands, or executable Python function, each of which will be converted into an Action object and then executed\&. The exit value of the command or return value of the Python function will be returned\&.
+.sp
+Note that
+scons
+will print an error message if the executed
+\fIaction\fR
+fails\-\-that is, exits with or returns a non\-zero value\&.
+scons
+will
+\fInot\fR, however, automatically terminate the build if the specified
+\fIaction\fR
+fails\&. If you want the build to stop in response to a failed
+\fBExecute\fR
+call, you must explicitly check for a non\-zero return value:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Copy(\*(Aqfile\&.out\*(Aq, \*(Aqfile\&.in\*(Aq))
+
+if Execute("mkdir sub/dir/ectory"):
+ # The mkdir failed, don\*(Aqt try to build\&.
+ Exit(1)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Exit([value]), env\&.Exit([value])
+.RS 4
+This tells
+scons
+to exit immediately with the specified
+\fIvalue\fR\&. A default exit value of
+0
+(zero) is used if no value is specified\&.
+.RE
+.PP
+Export(vars), env\&.Export(vars)
+.RS 4
+This tells
+scons
+to export a list of variables from the current SConscript file to all other SConscript files\&. The exported variables are kept in a global collection, so subsequent calls to
+\fBExport\fR
+will over\-write previous exports that have the same name\&. Multiple variable names can be passed to
+\fBExport\fR
+as separate arguments or as a list\&. Keyword arguments can be used to provide names and their values\&. A dictionary can be used to map variables to a different name when exported\&. Both local variables and global variables can be exported\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+# Make env available for all SConscript files to Import()\&.
+Export("env")
+
+package = \*(Aqmy_name\*(Aq
+# Make env and package available for all SConscript files:\&.
+Export("env", "package")
+
+# Make env and package available for all SConscript files:
+Export(["env", "package"])
+
+# Make env available using the name debug:
+Export(debug = env)
+
+# Make env available using the name debug:
+Export({"debug":env})
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the
+\fBSConscript\fR
+function supports an
+\fIexports\fR
+argument that makes it easier to to export a variable or set of variables to a single SConscript file\&. See the description of the
+\fBSConscript\fR
+function, below\&.
+.RE
+.PP
+File(name, [directory]), env\&.File(name, [directory])
+.RS 4
+This returns a File Node, an object that represents the specified file
+\fIname\fR\&.
+\fIname\fR
+can be a relative or absolute path\&.
+\fIdirectory\fR
+is an optional directory that will be used as the parent directory\&.
+.sp
+If
+\fIname\fR
+is a list, SCons returns a list of File nodes\&. Construction variables are expanded in
+\fIname\fR\&.
+.sp
+File Nodes can be used anywhere you would supply a string as a file name to a Builder method or function\&. File Nodes have attributes and methods that are useful in many situations; see "File and Directory Nodes," below\&.
+.RE
+.PP
+FindFile(file, dirs), env\&.FindFile(file, dirs)
+.RS 4
+Search for
+\fIfile\fR
+in the path specified by
+\fIdirs\fR\&.
+\fIdirs\fR
+may be a list of directory names or a single directory name\&. In addition to searching for files that exist in the filesystem, this function also searches for derived files that have not yet been built\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = env\&.FindFile(\*(Aqfoo\*(Aq, [\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FindInstalledFiles(), env\&.FindInstalledFiles()
+.RS 4
+Returns the list of targets set up by the
+\fBInstall\fR
+or
+\fBInstallAs\fR
+builders\&.
+.sp
+This function serves as a convenient method to select the contents of a binary package\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Install( \*(Aq/bin\*(Aq, [ \*(Aqexecutable_a\*(Aq, \*(Aqexecutable_b\*(Aq ] )
+
+# will return the file node list
+# [ \*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq ]
+FindInstalledFiles()
+
+Install( \*(Aq/lib\*(Aq, [ \*(Aqsome_library\*(Aq ] )
+
+# will return the file node list
+# [ \*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq, \*(Aq/lib/some_library\*(Aq ]
+FindInstalledFiles()
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FindPathDirs(variable)
+.RS 4
+Returns a function (actually a callable Python object) intended to be used as the
+\fIpath_function\fR
+of a Scanner object\&. The returned object will look up the specified
+\fIvariable\fR
+in a construction environment and treat the construction variable\*(Aqs value as a list of directory paths that should be searched (like
+\fB$CPPPATH\fR,
+\fB$LIBPATH\fR, etc\&.)\&.
+.sp
+Note that use of
+\fBFindPathDirs\fR
+is generally preferable to writing your own
+\fIpath_function\fR
+for the following reasons: 1) The returned list will contain all appropriate directories found in source trees (when
+\fBVariantDir\fR
+is used) or in code repositories (when
+\fBRepository\fR
+or the
+\fB\-Y\fR
+option are used)\&. 2) scons will identify expansions of
+\fIvariable\fR
+that evaluate to the same list of directories as, in fact, the same list, and avoid re\-scanning the directories for files, when possible\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_scan(node, env, path, arg):
+ # Code to scan file contents goes here\&.\&.\&.
+ return include_files
+
+scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
+ function = my_scan,
+ path_function = FindPathDirs(\*(AqMYPATH\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FindSourceFiles(node=\*(Aq"\&."\*(Aq), env\&.FindSourceFiles(node=\*(Aq"\&."\*(Aq)
+.RS 4
+Returns the list of nodes which serve as the source of the built files\&. It does so by inspecting the dependency tree starting at the optional argument
+\fInode\fR
+which defaults to the \*(Aq"\&."\*(Aq\-node\&. It will then return all leaves of
+\fInode\fR\&. These are all children which have no further children\&.
+.sp
+This function is a convenient method to select the contents of a Source Package\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Program( \*(Aqsrc/main_a\&.c\*(Aq )
+Program( \*(Aqsrc/main_b\&.c\*(Aq )
+Program( \*(Aqmain_c\&.c\*(Aq )
+
+# returns [\*(Aqmain_c\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq, \*(AqSConstruct\*(Aq, \*(Aqsrc/main_b\&.c\*(Aq]
+FindSourceFiles()
+
+# returns [\*(Aqsrc/main_b\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq ]
+FindSourceFiles( \*(Aqsrc\*(Aq )
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+As you can see build support files (SConstruct in the above example) will also be returned by this function\&.
+.RE
+.PP
+Flatten(sequence), env\&.Flatten(sequence)
+.RS 4
+Takes a sequence (that is, a Python list or tuple) that may contain nested sequences and returns a flattened list containing all of the individual elements in any sequence\&. This can be helpful for collecting the lists returned by calls to Builders; other Builders will automatically flatten lists specified as input, but direct Python manipulation of these lists does not\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = Object(\*(Aqfoo\&.c\*(Aq)
+bar = Object(\*(Aqbar\&.c\*(Aq)
+
+# Because `foo\*(Aq and `bar\*(Aq are lists returned by the Object() Builder,
+# `objects\*(Aq will be a list containing nested lists:
+objects = [\*(Aqf1\&.o\*(Aq, foo, \*(Aqf2\&.o\*(Aq, bar, \*(Aqf3\&.o\*(Aq]
+
+# Passing such a list to another Builder is all right because
+# the Builder will flatten the list automatically:
+Program(source = objects)
+
+# If you need to manipulate the list directly using Python, you need to
+# call Flatten() yourself, or otherwise handle nested lists:
+for object in Flatten(objects):
+ print str(object)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+GetBuildFailures()
+.RS 4
+Returns a list of exceptions for the actions that failed while attempting to build targets\&. Each element in the returned list is a
+BuildError
+object with the following attributes that record various aspects of the build failure:
+.sp
+
+\&.node
+The node that was being built when the build failure occurred\&.
+.sp
+
+\&.status
+The numeric exit status returned by the command or Python function that failed when trying to build the specified Node\&.
+.sp
+
+\&.errstr
+The SCons error string describing the build failure\&. (This is often a generic message like "Error 2" to indicate that an executed command exited with a status of 2\&.)
+.sp
+
+\&.filename
+The name of the file or directory that actually caused the failure\&. This may be different from the
+\&.node
+attribute\&. For example, if an attempt to build a target named
+sub/dir/target
+fails because the
+sub/dir
+directory could not be created, then the
+\&.node
+attribute will be
+sub/dir/target
+but the
+\&.filename
+attribute will be
+sub/dir\&.
+.sp
+
+\&.executor
+The SCons Executor object for the target Node being built\&. This can be used to retrieve the construction environment used for the failed action\&.
+.sp
+
+\&.action
+The actual SCons Action object that failed\&. This will be one specific action out of the possible list of actions that would have been executed to build the target\&.
+.sp
+
+\&.command
+The actual expanded command that was executed and failed, after expansion of
+\fB$TARGET\fR,
+\fB$SOURCE\fR, and other construction variables\&.
+.sp
+Note that the
+\fBGetBuildFailures\fR
+function will always return an empty list until any build failure has occurred, which means that
+\fBGetBuildFailures\fR
+will always return an empty list while the
+SConscript
+files are being read\&. Its primary intended use is for functions that will be executed before SCons exits by passing them to the standard Python
+\fBatexit\&.register\fR() function\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import atexit
+
+def print_build_failures():
+ from SCons\&.Script import GetBuildFailures
+ for bf in GetBuildFailures():
+ print "%s failed: %s" % (bf\&.node, bf\&.errstr)
+
+atexit\&.register(print_build_failures)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+GetBuildPath(file, [\&.\&.\&.]), env\&.GetBuildPath(file, [\&.\&.\&.])
+.RS 4
+Returns the
+scons
+path name (or names) for the specified
+\fIfile\fR
+(or files)\&. The specified
+\fIfile\fR
+or files may be
+scons
+Nodes or strings representing path names\&.
+.RE
+.PP
+GetLaunchDir(), env\&.GetLaunchDir()
+.RS 4
+Returns the absolute path name of the directory from which
+scons
+was initially invoked\&. This can be useful when using the
+\fB\-u\fR,
+\fB\-U\fR
+or
+\fB\-D\fR
+options, which internally change to the directory in which the
+SConstruct
+file is found\&.
+.RE
+.PP
+GetOption(name), env\&.GetOption(name)
+.RS 4
+This function provides a way to query the value of SCons options set on scons command line (or set using the
+\fBSetOption\fR
+function)\&. The options supported are:
+.PP
+cache_debug
+.RS 4
+which corresponds to \-\-cache\-debug;
+.RE
+.PP
+cache_disable
+.RS 4
+which corresponds to \-\-cache\-disable;
+.RE
+.PP
+cache_force
+.RS 4
+which corresponds to \-\-cache\-force;
+.RE
+.PP
+cache_show
+.RS 4
+which corresponds to \-\-cache\-show;
+.RE
+.PP
+clean
+.RS 4
+which corresponds to \-c, \-\-clean and \-\-remove;
+.RE
+.PP
+config
+.RS 4
+which corresponds to \-\-config;
+.RE
+.PP
+directory
+.RS 4
+which corresponds to \-C and \-\-directory;
+.RE
+.PP
+diskcheck
+.RS 4
+which corresponds to \-\-diskcheck
+.RE
+.PP
+duplicate
+.RS 4
+which corresponds to \-\-duplicate;
+.RE
+.PP
+file
+.RS 4
+which corresponds to \-f, \-\-file, \-\-makefile and \-\-sconstruct;
+.RE
+.PP
+help
+.RS 4
+which corresponds to \-h and \-\-help;
+.RE
+.PP
+ignore_errors
+.RS 4
+which corresponds to \-\-ignore\-errors;
+.RE
+.PP
+implicit_cache
+.RS 4
+which corresponds to \-\-implicit\-cache;
+.RE
+.PP
+implicit_deps_changed
+.RS 4
+which corresponds to \-\-implicit\-deps\-changed;
+.RE
+.PP
+implicit_deps_unchanged
+.RS 4
+which corresponds to \-\-implicit\-deps\-unchanged;
+.RE
+.PP
+interactive
+.RS 4
+which corresponds to \-\-interact and \-\-interactive;
+.RE
+.PP
+keep_going
+.RS 4
+which corresponds to \-k and \-\-keep\-going;
+.RE
+.PP
+max_drift
+.RS 4
+which corresponds to \-\-max\-drift;
+.RE
+.PP
+no_exec
+.RS 4
+which corresponds to \-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run and \-\-recon;
+.RE
+.PP
+no_site_dir
+.RS 4
+which corresponds to \-\-no\-site\-dir;
+.RE
+.PP
+num_jobs
+.RS 4
+which corresponds to \-j and \-\-jobs;
+.RE
+.PP
+profile_file
+.RS 4
+which corresponds to \-\-profile;
+.RE
+.PP
+question
+.RS 4
+which corresponds to \-q and \-\-question;
+.RE
+.PP
+random
+.RS 4
+which corresponds to \-\-random;
+.RE
+.PP
+repository
+.RS 4
+which corresponds to \-Y, \-\-repository and \-\-srcdir;
+.RE
+.PP
+silent
+.RS 4
+which corresponds to \-s, \-\-silent and \-\-quiet;
+.RE
+.PP
+site_dir
+.RS 4
+which corresponds to \-\-site\-dir;
+.RE
+.PP
+stack_size
+.RS 4
+which corresponds to \-\-stack\-size;
+.RE
+.PP
+taskmastertrace_file
+.RS 4
+which corresponds to \-\-taskmastertrace; and
+.RE
+.PP
+warn
+.RS 4
+which corresponds to \-\-warn and \-\-warning\&.
+.RE
+.sp
+See the documentation for the corresponding command line object for information about each specific option\&.
+.RE
+.PP
+Glob(pattern, [ondisk, source, strings, exclude]), env\&.Glob(pattern, [ondisk, source, strings, exclude])
+.RS 4
+Returns Nodes (or strings) that match the specified
+\fIpattern\fR, relative to the directory of the current
+SConscript
+file\&. The
+\fBenv\&.Glob\fR() form performs string substition on
+\fIpattern\fR
+and returns whatever matches the resulting expanded pattern\&.
+.sp
+The specified
+\fIpattern\fR
+uses Unix shell style metacharacters for matching:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ * matches everything
+ ? matches any single character
+ [seq] matches any character in seq
+ [!seq] matches any char not in seq
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the first character of a filename is a dot, it must be matched explicitly\&. Character matches do
+\fInot\fR
+span directory separators\&.
+.sp
+The
+\fBGlob\fR
+knows about repositories (see the
+\fBRepository\fR
+function) and source directories (see the
+\fBVariantDir\fR
+function) and returns a Node (or string, if so configured) in the local (SConscript) directory if matching Node is found anywhere in a corresponding repository or source directory\&.
+.sp
+The
+\fIondisk\fR
+argument may be set to
+False
+(or any other non\-true value) to disable the search for matches on disk, thereby only returning matches among already\-configured File or Dir Nodes\&. The default behavior is to return corresponding Nodes for any on\-disk matches found\&.
+.sp
+The
+\fIsource\fR
+argument may be set to
+True
+(or any equivalent value) to specify that, when the local directory is a
+\fBVariantDir\fR, the returned Nodes should be from the corresponding source directory, not the local directory\&.
+.sp
+The
+\fIstrings\fR
+argument may be set to
+True
+(or any equivalent value) to have the
+\fBGlob\fR
+function return strings, not Nodes, that represent the matched files or directories\&. The returned strings will be relative to the local (SConscript) directory\&. (Note that This may make it easier to perform arbitrary manipulation of file names, but if the returned strings are passed to a different
+SConscript
+file, any Node translation will be relative to the other
+SConscript
+directory, not the original
+SConscript
+directory\&.)
+.sp
+The
+\fIexclude\fR
+argument may be set to a pattern or a list of patterns (following the same Unix shell semantics) which must be filtered out of returned elements\&. Elements matching a least one pattern of this list will be excluded\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Program(\*(Aqfoo\*(Aq, Glob(\*(Aq*\&.c\*(Aq))
+Zip(\*(Aq/tmp/everything\*(Aq, Glob(\*(Aq\&.??*\*(Aq) + Glob(\*(Aq*\*(Aq))
+sources = Glob(\*(Aq*\&.cpp\*(Aq, exclude=[\*(Aqos_*_specific_*\&.cpp\*(Aq]) + Glob(\*(Aqos_%s_specific_*\&.cpp\*(Aq%currentOS)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Help(text), env\&.Help(text)
+.RS 4
+This specifies help text to be printed if the
+\fB\-h\fR
+argument is given to
+scons\&. If
+\fBHelp\fR
+is called multiple times, the text is appended together in the order that
+\fBHelp\fR
+is called\&.
+.RE
+.PP
+Ignore(target, dependency), env\&.Ignore(target, dependency)
+.RS 4
+The specified dependency file(s) will be ignored when deciding if the target file(s) need to be rebuilt\&.
+.sp
+You can also use
+\fBIgnore\fR
+to remove a target from the default build\&. In order to do this you must specify the directory the target will be built in as the target, and the file you want to skip building as the dependency\&.
+.sp
+Note that this will only remove the dependencies listed from the files built by default\&. It will still be built if that dependency is needed by another object being built\&. See the third and forth examples below\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Ignore(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
+env\&.Ignore(\*(Aqbar\*(Aq, [\*(Aqbar1\&.h\*(Aq, \*(Aqbar2\&.h\*(Aq])
+env\&.Ignore(\*(Aq\&.\*(Aq,\*(Aqfoobar\&.obj\*(Aq)
+env\&.Ignore(\*(Aqbar\*(Aq,\*(Aqbar/foobar\&.obj\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Import(vars), env\&.Import(vars)
+.RS 4
+This tells
+scons
+to import a list of variables into the current SConscript file\&. This will import variables that were exported with
+\fBExport\fR
+or in the
+\fIexports\fR
+argument to
+\fBSConscript\fR\&. Variables exported by
+\fBSConscript\fR
+have precedence\&. Multiple variable names can be passed to
+\fBImport\fR
+as separate arguments or as a list\&. The variable "*" can be used to import all variables\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Import("env")
+Import("env", "variable")
+Import(["env", "variable"])
+Import("*")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Literal(string), env\&.Literal(string)
+.RS 4
+The specified
+\fIstring\fR
+will be preserved as\-is and not have construction variables expanded\&.
+.RE
+.PP
+Local(targets), env\&.Local(targets)
+.RS 4
+The specified
+\fItargets\fR
+will have copies made in the local tree, even if an already up\-to\-date copy exists in a repository\&. Returns a list of the target Node or Nodes\&.
+.RE
+.PP
+env\&.MergeFlags(arg, [unique])
+.RS 4
+Merges the specified
+\fIarg\fR
+values to the construction environment\*(Aqs construction variables\&. If the
+\fIarg\fR
+argument is not a dictionary, it is converted to one by calling
+\fBenv\&.ParseFlags\fR
+on the argument before the values are merged\&. Note that
+\fIarg\fR
+must be a single value, so multiple strings must be passed in as a list, not as separate arguments to
+\fBenv\&.MergeFlags\fR\&.
+.sp
+By default, duplicate values are eliminated; you can, however, specify
+unique=0
+to allow duplicate values to be added\&. When eliminating duplicate values, any construction variables that end with the string
+PATH
+keep the left\-most unique value\&. All other construction variables keep the right\-most unique value\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Add an optimization flag to $CCFLAGS\&.
+env\&.MergeFlags(\*(Aq\-O3\*(Aq)
+
+# Combine the flags returned from running pkg\-config with an optimization
+# flag and merge the result into the construction variables\&.
+env\&.MergeFlags([\*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags\*(Aq, \*(Aq\-O3\*(Aq])
+
+# Combine an optimization flag with the flags returned from running pkg\-config
+# twice and merge the result into the construction variables\&.
+env\&.MergeFlags([\*(Aq\-O3\*(Aq,
+ \*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags \-\-libs\*(Aq,
+ \*(Aq!pkg\-config libpng12 \-\-cflags \-\-libs\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+NoCache(target, \&.\&.\&.), env\&.NoCache(target, \&.\&.\&.)
+.RS 4
+Specifies a list of files which should
+\fInot\fR
+be cached whenever the
+\fBCacheDir\fR
+method has been activated\&. The specified targets may be a list or an individual target\&.
+.sp
+Multiple files should be specified either as separate arguments to the
+\fBNoCache\fR
+method, or as a list\&.
+\fBNoCache\fR
+will also accept the return value of any of the construction environment Builder methods\&.
+.sp
+Calling
+\fBNoCache\fR
+on directories and other non\-File Node types has no effect because only File Nodes are cached\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+NoCache(\*(Aqfoo\&.elf\*(Aq)
+NoCache(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+NoClean(target, \&.\&.\&.), env\&.NoClean(target, \&.\&.\&.)
+.RS 4
+Specifies a list of files or directories which should
+\fInot\fR
+be removed whenever the targets (or their dependencies) are specified with the
+\fB\-c\fR
+command line option\&. The specified targets may be a list or an individual target\&. Multiple calls to
+\fBNoClean\fR
+are legal, and prevent each specified target from being removed by calls to the
+\fB\-c\fR
+option\&.
+.sp
+Multiple files or directories should be specified either as separate arguments to the
+\fBNoClean\fR
+method, or as a list\&.
+\fBNoClean\fR
+will also accept the return value of any of the construction environment Builder methods\&.
+.sp
+Calling
+\fBNoClean\fR
+for a target overrides calling
+\fBClean\fR
+for the same target, and any targets passed to both functions will
+\fInot\fR
+be removed by the
+\fB\-c\fR
+option\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+NoClean(\*(Aqfoo\&.elf\*(Aq)
+NoClean(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.ParseConfig(command, [function, unique])
+.RS 4
+Calls the specified
+\fIfunction\fR
+to modify the environment as specified by the output of
+\fIcommand\fR\&. The default
+\fIfunction\fR
+is
+\fBenv\&.MergeFlags\fR, which expects the output of a typical
+*\-config
+command (for example,
+gtk\-config) and adds the options to the appropriate construction variables\&. By default, duplicate values are not added to any construction variables; you can specify
+unique=0
+to allow duplicate values to be added\&.
+.sp
+Interpreted options and the construction variables they affect are as specified for the
+\fBenv\&.ParseFlags\fR
+method (which this method calls)\&. See that method\*(Aqs description, below, for a table of options and construction variables\&.
+.RE
+.PP
+ParseDepends(filename, [must_exist, only_one]), env\&.ParseDepends(filename, [must_exist, only_one])
+.RS 4
+Parses the contents of the specified
+\fIfilename\fR
+as a list of dependencies in the style of
+Make
+or
+mkdep, and explicitly establishes all of the listed dependencies\&.
+.sp
+By default, it is not an error if the specified
+\fIfilename\fR
+does not exist\&. The optional
+\fImust_exist\fR
+argument may be set to a non\-zero value to have scons throw an exception and generate an error if the file does not exist, or is otherwise inaccessible\&.
+.sp
+The optional
+\fIonly_one\fR
+argument may be set to a non\-zero value to have scons thrown an exception and generate an error if the file contains dependency information for more than one target\&. This can provide a small sanity check for files intended to be generated by, for example, the
+gcc \-M
+flag, which should typically only write dependency information for one output file into a corresponding
+\&.d
+file\&.
+.sp
+The
+\fIfilename\fR
+and all of the files listed therein will be interpreted relative to the directory of the
+SConscript
+file which calls the
+\fBParseDepends\fR
+function\&.
+.RE
+.PP
+env\&.ParseFlags(flags, \&.\&.\&.)
+.RS 4
+Parses one or more strings containing typical command\-line flags for GCC tool chains and returns a dictionary with the flag values separated into the appropriate SCons construction variables\&. This is intended as a companion to the
+\fBenv\&.MergeFlags\fR
+method, but allows for the values in the returned dictionary to be modified, if necessary, before merging them into the construction environment\&. (Note that
+\fBenv\&.MergeFlags\fR
+will call this method if its argument is not a dictionary, so it is usually not necessary to call
+\fBenv\&.ParseFlags\fR
+directly unless you want to manipulate the values\&.)
+.sp
+If the first character in any string is an exclamation mark (!), the rest of the string is executed as a command, and the output from the command is parsed as GCC tool chain command\-line flags and added to the resulting dictionary\&.
+.sp
+Flag values are translated accordig to the prefix found, and added to the following construction variables:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\-arch CCFLAGS, LINKFLAGS
+\-D CPPDEFINES
+\-framework FRAMEWORKS
+\-frameworkdir= FRAMEWORKPATH
+\-include CCFLAGS
+\-isysroot CCFLAGS, LINKFLAGS
+\-I CPPPATH
+\-l LIBS
+\-L LIBPATH
+\-mno\-cygwin CCFLAGS, LINKFLAGS
+\-mwindows LINKFLAGS
+\-pthread CCFLAGS, LINKFLAGS
+\-std= CFLAGS
+\-Wa, ASFLAGS, CCFLAGS
+\-Wl,\-rpath= RPATH
+\-Wl,\-R, RPATH
+\-Wl,\-R RPATH
+\-Wl, LINKFLAGS
+\-Wp, CPPFLAGS
+\- CCFLAGS
++ CCFLAGS, LINKFLAGS
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Any other strings not associated with options are assumed to be the names of libraries and added to the
+\fB$LIBS\fR
+construction variable\&.
+.sp
+Examples (all of which produce the same result):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+dict = env\&.ParseFlags(\*(Aq\-O2 \-Dfoo \-Dbar=1\*(Aq)
+dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo\*(Aq, \*(Aq\-Dbar=1\*(Aq)
+dict = env\&.ParseFlags([\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo \-Dbar=1\*(Aq])
+dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq!echo \-Dfoo \-Dbar=1\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.Perforce()
+.RS 4
+A factory function that returns a Builder object to be used to fetch source files from the Perforce source code management system\&. The returned Builder is intended to be passed to the
+\fBSourceCode\fR
+function\&.
+.sp
+This function is deprecated\&. For details, see the entry for the
+\fBSourceCode\fR
+function\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.Perforce())
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Perforce uses a number of external environment variables for its operation\&. Consequently, this function adds the following variables from the user\*(Aqs external environment to the construction environment\*(Aqs ENV dictionary: P4CHARSET, P4CLIENT, P4LANGUAGE, P4PASSWD, P4PORT, P4USER, SystemRoot, USER, and USERNAME\&.
+.RE
+.PP
+Platform(string)
+.RS 4
+The
+\fBPlatform\fR
+form returns a callable object that can be used to initialize a construction environment using the platform keyword of the
+\fBEnvironment\fR
+function\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(platform = Platform(\*(Aqwin32\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fBenv\&.Platform\fR
+form applies the callable object for the specified platform
+\fIstring\fR
+to the environment through which the method was called\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Platform(\*(Aqposix\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the
+win32
+platform adds the
+SystemDrive
+and
+SystemRoot
+variables from the user\*(Aqs external environment to the construction environment\*(Aqs
+\fB$ENV\fR
+dictionary\&. This is so that any executed commands that use sockets to connect with other systems (such as fetching source files from external CVS repository specifications like
+:pserver:anonymous@cvs\&.sourceforge\&.net:/cvsroot/scons) will work on Windows systems\&.
+.RE
+.PP
+Precious(target, \&.\&.\&.), env\&.Precious(target, \&.\&.\&.)
+.RS 4
+Marks each given
+\fItarget\fR
+as precious so it is not deleted before it is rebuilt\&. Normally
+scons
+deletes a target before building it\&. Multiple targets can be passed in to a single call to
+\fBPrecious\fR\&.
+.RE
+.PP
+env\&.Prepend(key=val, [\&.\&.\&.])
+.RS 4
+Appends the specified keyword arguments to the beginning of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the values of the construction variable and the keyword argument are the same type, then the two values will be simply added together\&. Otherwise, the construction variable and the value of the keyword argument are both coerced to lists, and the lists are added together\&. (See also the Append method, above\&.)
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Prepend(CCFLAGS = \*(Aq\-g \*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.PrependENVPath(name, newpath, [envname, sep, delete_existing])
+.RS 4
+This appends new path elements to the given path in the specified external environment (\fB$ENV\fR
+by default)\&. This will only add any particular path once (leaving the first one it encounters and ignoring the rest, to preserve path order), and to help assure this, will normalize all paths (using
+os\&.path\&.normpath
+and
+os\&.path\&.normcase)\&. This can also handle the case where the given old path variable is a list instead of a string, in which case a list will be returned instead of a string\&.
+.sp
+If
+\fIdelete_existing\fR
+is 0, then adding a path that already exists will not move it to the beginning; it will stay where it is in the list\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print \*(Aqbefore:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
+include_path = \*(Aq/foo/bar:/foo\*(Aq
+env\&.PrependENVPath(\*(AqINCLUDE\*(Aq, include_path)
+print \*(Aqafter:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The above example will print:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+before: /biz:/foo
+after: /foo/bar:/foo:/biz
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.PrependUnique(key=val, delete_existing=0, [\&.\&.\&.])
+.RS 4
+Appends the specified keyword arguments to the beginning of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the construction variable being appended to is a list, then any value(s) that already exist in the construction variable will
+\fInot\fR
+be added again to the list\&. However, if delete_existing is 1, existing matching values are removed first, so existing values in the arg list move to the front of the list\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.PrependUnique(CCFLAGS = \*(Aq\-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Progress(callable, [interval]), Progress(string, [interval, file, overwrite]), Progress(list_of_strings, [interval, file, overwrite])
+.RS 4
+Allows SCons to show progress made during the build by displaying a string or calling a function while evaluating Nodes (e\&.g\&. files)\&.
+.sp
+If the first specified argument is a Python callable (a function or an object that has a
+\fB__call__\fR() method), the function will be called once every
+\fIinterval\fR
+times a Node is evaluated\&. The callable will be passed the evaluated Node as its only argument\&. (For future compatibility, it\*(Aqs a good idea to also add
+*args
+and
+**kw
+as arguments to your function or method\&. This will prevent the code from breaking if SCons ever changes the interface to call the function with additional arguments in the future\&.)
+.sp
+An example of a simple custom progress function that prints a string containing the Node name every 10 Nodes:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_progress_function(node, *args, **kw):
+ print \*(AqEvaluating node %s!\*(Aq % node
+Progress(my_progress_function, interval=10)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+A more complicated example of a custom progress display object that prints a string containing a count every 100 evaluated Nodes\&. Note the use of
+\er
+(a carriage return) at the end so that the string will overwrite itself on a display:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import sys
+class ProgressCounter(object):
+ count = 0
+ def __call__(self, node, *args, **kw):
+ self\&.count += 100
+ sys\&.stderr\&.write(\*(AqEvaluated %s nodes\er\*(Aq % self\&.count)
+Progress(ProgressCounter(), interval=100)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the first argument
+\fBProgress\fR
+is a string, the string will be displayed every
+\fIinterval\fR
+evaluated Nodes\&. The default is to print the string on standard output; an alternate output stream may be specified with the
+file=
+argument\&. The following will print a series of dots on the error output, one dot for every 100 evaluated Nodes:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import sys
+Progress(\*(Aq\&.\*(Aq, interval=100, file=sys\&.stderr)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the string contains the verbatim substring
+\fB$TARGET\fR, it will be replaced with the Node\&. Note that, for performance reasons, this is
+\fInot\fR
+a regular SCons variable substition, so you can not use other variables or use curly braces\&. The following example will print the name of every evaluated Node, using a
+\er
+(carriage return) to cause each line to overwritten by the next line, and the
+overwrite=
+keyword argument to make sure the previously\-printed file name is overwritten with blank spaces:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import sys
+Progress(\*(Aq$TARGET\er\*(Aq, overwrite=True)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the first argument to
+\fBProgress\fR
+is a list of strings, then each string in the list will be displayed in rotating fashion every
+\fIinterval\fR
+evaluated Nodes\&. This can be used to implement a "spinner" on the user\*(Aqs screen as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Progress([\*(Aq\-\er\*(Aq, \*(Aq\e\e\er\*(Aq, \*(Aq|\er\*(Aq, \*(Aq/\er\*(Aq], interval=5)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Pseudo(target, \&.\&.\&.), env\&.Pseudo(target, \&.\&.\&.)
+.RS 4
+This indicates that each given
+\fItarget\fR
+should not be created by the build rule, and if the target is created, an error will be generated\&. This is similar to the gnu make \&.PHONY target\&. However, in the vast majority of cases, an
+\fBAlias\fR
+is more appropriate\&. Multiple targets can be passed in to a single call to
+\fBPseudo\fR\&.
+.RE
+.PP
+env\&.RCS()
+.RS 4
+A factory function that returns a Builder object to be used to fetch source files from RCS\&. The returned Builder is intended to be passed to the
+\fBSourceCode\fR
+function:
+.sp
+This function is deprecated\&. For details, see the entry for the
+\fBSourceCode\fR
+function\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.RCS())
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that
+scons
+will fetch source files from RCS subdirectories automatically, so configuring RCS as demonstrated in the above example should only be necessary if you are fetching from RCS,v files in the same directory as the source files, or if you need to explicitly specify RCS for a specific subdirectory\&.
+.RE
+.PP
+env\&.Replace(key=val, [\&.\&.\&.])
+.RS 4
+Replaces construction variables in the Environment with the specified keyword arguments\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Replace(CCFLAGS = \*(Aq\-g\*(Aq, FOO = \*(Aqfoo\&.xxx\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Repository(directory), env\&.Repository(directory)
+.RS 4
+Specifies that
+\fIdirectory\fR
+is a repository to be searched for files\&. Multiple calls to
+\fBRepository\fR
+are legal, and each one adds to the list of repositories that will be searched\&.
+.sp
+To
+scons, a repository is a copy of the source tree, from the top\-level directory on down, which may contain both source files and derived files that can be used to build targets in the local source tree\&. The canonical example would be an official source tree maintained by an integrator\&. If the repository contains derived files, then the derived files should have been built using
+scons, so that the repository contains the necessary signature information to allow
+scons
+to figure out when it is appropriate to use the repository copy of a derived file, instead of building one locally\&.
+.sp
+Note that if an up\-to\-date derived file already exists in a repository,
+scons
+will
+\fInot\fR
+make a copy in the local directory tree\&. In order to guarantee that a local copy will be made, use the
+\fBLocal\fR
+method\&.
+.RE
+.PP
+Requires(target, prerequisite), env\&.Requires(target, prerequisite)
+.RS 4
+Specifies an order\-only relationship between the specified target file(s) and the specified prerequisite file(s)\&. The prerequisite file(s) will be (re)built, if necessary,
+\fIbefore\fR
+the target file(s), but the target file(s) do not actually depend on the prerequisites and will not be rebuilt simply because the prerequisite file(s) change\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Requires(\*(Aqfoo\*(Aq, \*(Aqfile\-that\-must\-be\-built\-before\-foo\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Return([vars\&.\&.\&., stop=])
+.RS 4
+By default, this stops processing the current SConscript file and returns to the calling SConscript file the values of the variables named in the
+\fIvars\fR
+string arguments\&. Multiple strings contaning variable names may be passed to
+\fBReturn\fR\&. Any strings that contain white space
+.sp
+The optional
+stop=
+keyword argument may be set to a false value to continue processing the rest of the SConscript file after the
+\fBReturn\fR
+call\&. This was the default behavior prior to SCons 0\&.98\&. However, the values returned are still the values of the variables in the named
+\fIvars\fR
+at the point
+\fBReturn\fR
+is called\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Returns without returning a value\&.
+Return()
+
+# Returns the value of the \*(Aqfoo\*(Aq Python variable\&.
+Return("foo")
+
+# Returns the values of the Python variables \*(Aqfoo\*(Aq and \*(Aqbar\*(Aq\&.
+Return("foo", "bar")
+
+# Returns the values of Python variables \*(Aqval1\*(Aq and \*(Aqval2\*(Aq\&.
+Return(\*(Aqval1 val2\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Scanner(function, [argument, keys, path_function, node_class, node_factory, scan_check, recursive]), env\&.Scanner(function, [argument, keys, path_function, node_class, node_factory, scan_check, recursive])
+.RS 4
+Creates a Scanner object for the specified
+\fIfunction\fR\&. See the section "Scanner Objects," below, for a complete explanation of the arguments and behavior\&.
+.RE
+.PP
+env\&.SCCS()
+.RS 4
+A factory function that returns a Builder object to be used to fetch source files from SCCS\&. The returned Builder is intended to be passed to the
+\fBSourceCode\fR
+function\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.SCCS())
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that
+scons
+will fetch source files from SCCS subdirectories automatically, so configuring SCCS as demonstrated in the above example should only be necessary if you are fetching from
+s\&.SCCS
+files in the same directory as the source files, or if you need to explicitly specify SCCS for a specific subdirectory\&.
+.RE
+.PP
+SConscript(scripts, [exports, variant_dir, duplicate]), env\&.SConscript(scripts, [exports, variant_dir, duplicate]), SConscript(dirs=subdirs, [name=script, exports, variant_dir, duplicate]), env\&.SConscript(dirs=subdirs, [name=script, exports, variant_dir, duplicate])
+.RS 4
+This tells
+scons
+to execute one or more subsidiary SConscript (configuration) files\&. Any variables returned by a called script using
+\fBReturn\fR
+will be returned by the call to
+\fBSConscript\fR\&. There are two ways to call the
+\fBSConscript\fR
+function\&.
+.sp
+The first way you can call
+\fBSConscript\fR
+is to explicitly specify one or more
+\fIscripts\fR
+as the first argument\&. A single script may be specified as a string; multiple scripts must be specified as a list (either explicitly or as created by a function like
+\fBSplit\fR)\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConscript(\*(AqSConscript\*(Aq) # run SConscript in the current directory
+SConscript(\*(Aqsrc/SConscript\*(Aq) # run SConscript in the src directory
+SConscript([\*(Aqsrc/SConscript\*(Aq, \*(Aqdoc/SConscript\*(Aq])
+config = SConscript(\*(AqMyConfig\&.py\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The second way you can call
+\fBSConscript\fR
+is to specify a list of (sub)directory names as a
+dirs=\fIsubdirs\fR
+keyword argument\&. In this case,
+scons
+will, by default, execute a subsidiary configuration file named
+SConscript
+in each of the specified directories\&. You may specify a name other than
+SConscript
+by supplying an optional
+name=\fIscript\fR
+keyword argument\&. The first three examples below have the same effect as the first three examples above:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConscript(dirs=\*(Aq\&.\*(Aq) # run SConscript in the current directory
+SConscript(dirs=\*(Aqsrc\*(Aq) # run SConscript in the src directory
+SConscript(dirs=[\*(Aqsrc\*(Aq, \*(Aqdoc\*(Aq])
+SConscript(dirs=[\*(Aqsub1\*(Aq, \*(Aqsub2\*(Aq], name=\*(AqMySConscript\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The optional
+\fIexports\fR
+argument provides a list of variable names or a dictionary of named values to export to the
+\fIscript(s)\fR\&. These variables are locally exported only to the specified
+\fIscript(s)\fR, and do not affect the global pool of variables used by the
+\fBExport\fR
+function\&.
+The subsidiary
+\fIscript(s)\fR
+must use the
+\fBImport\fR
+function to import the variables\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+foo = SConscript(\*(Aqsub/SConscript\*(Aq, exports=\*(Aqenv\*(Aq)
+SConscript(\*(Aqdir/SConscript\*(Aq, exports=[\*(Aqenv\*(Aq, \*(Aqvariable\*(Aq])
+SConscript(dirs=\*(Aqsubdir\*(Aq, exports=\*(Aqenv variable\*(Aq)
+SConscript(dirs=[\*(Aqone\*(Aq, \*(Aqtwo\*(Aq, \*(Aqthree\*(Aq], exports=\*(Aqshared_info\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the optional
+\fIvariant_dir\fR
+argument is present, it causes an effect equivalent to the
+\fBVariantDir\fR
+method described below\&. (If
+\fIvariant_dir\fR
+is not present, the
+
+\fIduplicate\fR
+argument is ignored\&.) The
+\fIvariant_dir\fR
+argument is interpreted relative to the directory of the calling
+SConscript
+file\&. See the description of the
+\fBVariantDir\fR
+function below for additional details and restrictions\&.
+.sp
+If
+\fIvariant_dir\fR
+is present,
+the source directory is the directory in which the
+SConscript
+file resides and the
+SConscript
+file is evaluated as if it were in the
+\fIvariant_dir\fR
+directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir = \*(Aqbuild\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+is equivalent to
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq)
+SConscript(\*(Aqbuild/SConscript\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+This later paradigm is often used when the sources are in the same directory as the
+SConstruct:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConscript(\*(AqSConscript\*(Aq, variant_dir = \*(Aqbuild\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+is equivalent to
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq)
+SConscript(\*(Aqbuild/SConscript\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+.sp
+Here are some composite examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# collect the configuration information and use it to build src and doc
+shared_info = SConscript(\*(AqMyConfig\&.py\*(Aq)
+SConscript(\*(Aqsrc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq)
+SConscript(\*(Aqdoc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# build debugging and production versions\&. SConscript
+# can use Dir(\*(Aq\&.\*(Aq)\&.path to determine variant\&.
+SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0)
+SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# build debugging and production versions\&. SConscript
+# is passed flags to use\&.
+opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqDEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-pgdb\*(Aq }
+SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0, exports=opts)
+opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqNODEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-O\*(Aq }
+SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0, exports=opts)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# build common documentation and compile for different architectures
+SConscript(\*(Aqdoc/SConscript\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=0)
+SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/x86\*(Aq, duplicate=0)
+SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/ppc\*(Aq, duplicate=0)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SConscriptChdir(value), env\&.SConscriptChdir(value)
+.RS 4
+By default,
+scons
+changes its working directory to the directory in which each subsidiary SConscript file lives\&. This behavior may be disabled by specifying either:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConscriptChdir(0)
+env\&.SConscriptChdir(0)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+in which case
+scons
+will stay in the top\-level directory while reading all SConscript files\&. (This may be necessary when building from repositories, when all the directories in which SConscript files may be found don\*(Aqt necessarily exist locally\&.) You may enable and disable this ability by calling SConscriptChdir() multiple times\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+SConscriptChdir(0)
+SConscript(\*(Aqfoo/SConscript\*(Aq) # will not chdir to foo
+env\&.SConscriptChdir(1)
+SConscript(\*(Aqbar/SConscript\*(Aq) # will chdir to bar
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SConsignFile([file, dbm_module]), env\&.SConsignFile([file, dbm_module])
+.RS 4
+This tells
+scons
+to store all file signatures in the specified database
+\fIfile\fR\&. If the
+\fIfile\fR
+name is omitted,
+\&.sconsign
+is used by default\&. (The actual file name(s) stored on disk may have an appropriated suffix appended by the
+\fI dbm_module\fR\&.) If
+\fIfile\fR
+is not an absolute path name, the file is placed in the same directory as the top\-level
+SConstruct
+file\&.
+.sp
+If
+\fIfile\fR
+is
+None, then
+scons
+will store file signatures in a separate
+\&.sconsign
+file in each directory, not in one global database file\&. (This was the default behavior prior to SCons 0\&.96\&.91 and 0\&.97\&.)
+.sp
+The optional
+\fIdbm_module\fR
+argument can be used to specify which Python database module The default is to use a custom
+SCons\&.dblite
+module that uses pickled Python data structures, and which works on all Python versions\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Explicitly stores signatures in "\&.sconsign\&.dblite"
+# in the top\-level SConstruct directory (the
+# default behavior)\&.
+SConsignFile()
+
+# Stores signatures in the file "etc/scons\-signatures"
+# relative to the top\-level SConstruct directory\&.
+SConsignFile("etc/scons\-signatures")
+
+# Stores signatures in the specified absolute file name\&.
+SConsignFile("/home/me/SCons/signatures")
+
+# Stores signatures in a separate \&.sconsign file
+# in each directory\&.
+SConsignFile(None)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.SetDefault(key=val, [\&.\&.\&.])
+.RS 4
+Sets construction variables to default values specified with the keyword arguments if (and only if) the variables are not already set\&. The following statements are equivalent:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SetDefault(FOO = \*(Aqfoo\*(Aq)
+
+if \*(AqFOO\*(Aq not in env: env[\*(AqFOO\*(Aq] = \*(Aqfoo\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SetOption(name, value), env\&.SetOption(name, value)
+.RS 4
+This function provides a way to set a select subset of the scons command line options from a SConscript file\&. The options supported are:
+.PP
+clean
+.RS 4
+which corresponds to \-c, \-\-clean and \-\-remove;
+.RE
+.PP
+duplicate
+.RS 4
+which corresponds to \-\-duplicate;
+.RE
+.PP
+help
+.RS 4
+which corresponds to \-h and \-\-help;
+.RE
+.PP
+implicit_cache
+.RS 4
+which corresponds to \-\-implicit\-cache;
+.RE
+.PP
+max_drift
+.RS 4
+which corresponds to \-\-max\-drift;
+.RE
+.PP
+no_exec
+.RS 4
+which corresponds to \-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run and \-\-recon;
+.RE
+.PP
+num_jobs
+.RS 4
+which corresponds to \-j and \-\-jobs;
+.RE
+.PP
+random
+.RS 4
+which corresponds to \-\-random; and
+.RE
+.PP
+stack_size
+.RS 4
+which corresponds to \-\-stack\-size\&.
+.RE
+.sp
+See the documentation for the corresponding command line object for information about each specific option\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SetOption(\*(Aqmax_drift\*(Aq, 1)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SideEffect(side_effect, target), env\&.SideEffect(side_effect, target)
+.RS 4
+Declares
+\fIside_effect\fR
+as a side effect of building
+\fItarget\fR\&. Both
+\fIside_effect\fR
+and
+\fItarget\fR
+can be a list, a file name, or a node\&. A side effect is a target file that is created or updated as a side effect of building other targets\&. For example, a Windows PDB file is created as a side effect of building the \&.obj files for a static library, and various log files are created updated as side effects of various TeX commands\&. If a target is a side effect of multiple build commands,
+scons
+will ensure that only one set of commands is executed at a time\&. Consequently, you only need to use this method for side\-effect targets that are built as a result of multiple build commands\&.
+.sp
+Because multiple build commands may update the same side effect file, by default the
+\fIside_effect\fR
+target is
+\fInot\fR
+automatically removed when the
+\fItarget\fR
+is removed by the
+\fB\-c\fR
+option\&. (Note, however, that the
+\fIside_effect\fR
+might be removed as part of cleaning the directory in which it lives\&.) If you want to make sure the
+\fIside_effect\fR
+is cleaned whenever a specific
+\fItarget\fR
+is cleaned, you must specify this explicitly with the
+\fBClean\fR
+or
+\fBenv\&.Clean\fR
+function\&.
+.RE
+.PP
+SourceCode(entries, builder), env\&.SourceCode(entries, builder)
+.RS 4
+This function and its associate factory functions are deprecated\&. There is no replacement\&. The intended use was to keep a local tree in sync with an archive, but in actuality the function only causes the archive to be fetched on the first run\&. Synchronizing with the archive is best done external to
+SCons\&.
+.sp
+Arrange for non\-existent source files to be fetched from a source code management system using the specified
+\fIbuilder\fR\&. The specified
+\fIentries\fR
+may be a Node, string or list of both, and may represent either individual source files or directories in which source files can be found\&.
+.sp
+For any non\-existent source files,
+scons
+will search up the directory tree and use the first
+\fBSourceCode\fR
+builder it finds\&. The specified
+\fIbuilder\fR
+may be
+None, in which case
+scons
+will not use a builder to fetch source files for the specified
+\fIentries\fR, even if a
+\fBSourceCode\fR
+builder has been specified for a directory higher up the tree\&.
+.sp
+
+scons
+will, by default, fetch files from SCCS or RCS subdirectories without explicit configuration\&. This takes some extra processing time to search for the necessary source code management files on disk\&. You can avoid these extra searches and speed up your build a little by disabling these searches as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, None)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that if the specified
+\fIbuilder\fR
+is one you create by hand, it must have an associated construction environment to use when fetching a source file\&.
+.sp
+
+scons
+provides a set of canned factory functions that return appropriate Builders for various popular source code management systems\&. Canonical examples of invocation include:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.BitKeeper(\*(Aq/usr/local/BKsources\*(Aq))
+env\&.SourceCode(\*(Aqsrc\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq))
+env\&.SourceCode(\*(Aq/\*(Aq, env\&.RCS())
+env\&.SourceCode([\*(Aqf1\&.c\*(Aq, \*(Aqf2\&.c\*(Aq], env\&.SCCS())
+env\&.SourceCode(\*(Aqno_source\&.c\*(Aq, None)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+.RE
+.PP
+SourceSignatures(type), env\&.SourceSignatures(type)
+.RS 4
+Note: Although it is not yet officially deprecated, use of this function is discouraged\&. See the
+\fBDecider\fR
+function for a more flexible and straightforward way to configure SCons\*(Aq decision\-making\&.
+.sp
+The
+\fBSourceSignatures\fR
+function tells
+scons
+how to decide if a source file (a file that is not built from any other files) has changed since the last time it was used to build a particular target file\&. Legal values are
+MD5
+or
+timestamp\&.
+.sp
+If the environment method is used, the specified type of source signature is only used when deciding whether targets built with that environment are up\-to\-date or must be rebuilt\&. If the global function is used, the specified type of source signature becomes the default used for all decisions about whether targets are up\-to\-date\&.
+.sp
+
+MD5
+means
+scons
+decides that a source file has changed if the MD5 checksum of its contents has changed since the last time it was used to rebuild a particular target file\&.
+.sp
+
+timestamp
+means
+scons
+decides that a source file has changed if its timestamp (modification time) has changed since the last time it was used to rebuild a particular target file\&. (Note that although this is similar to the behavior of Make, by default it will also rebuild if the dependency is
+\fIolder\fR
+than the last time it was used to rebuild the target file\&.)
+.sp
+There is no different between the two behaviors for Python
+\fBValue\fR
+node objects\&.
+.sp
+
+MD5
+signatures take longer to compute, but are more accurate than
+timestamp
+signatures\&. The default value is
+MD5\&.
+.sp
+Note that the default
+\fBTargetSignatures\fR
+setting (see below) is to use this
+\fBSourceSignatures\fR
+setting for any target files that are used to build other target files\&. Consequently, changing the value of
+\fBSourceSignatures\fR
+will, by default, affect the up\-to\-date decision for all files in the build (or all files built with a specific construction environment when
+\fBenv\&.SourceSignatures\fR
+is used)\&.
+.RE
+.PP
+Split(arg), env\&.Split(arg)
+.RS 4
+Returns a list of file names or other objects\&. If arg is a string, it will be split on strings of white\-space characters within the string, making it easier to write long lists of file names\&. If arg is already a list, the list will be returned untouched\&. If arg is any other type of object, it will be returned as a list containing just the object\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+files = Split("f1\&.c f2\&.c f3\&.c")
+files = env\&.Split("f4\&.c f5\&.c f6\&.c")
+files = Split("""
+ f7\&.c
+ f8\&.c
+ f9\&.c
+""")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env\&.subst(input, [raw, target, source, conv])
+.RS 4
+Performs construction variable interpolation on the specified string or sequence argument
+\fIinput\fR\&.
+.sp
+By default, leading or trailing white space will be removed from the result\&. and all sequences of white space will be compressed to a single space character\&. Additionally, any
+$(
+and
+$)
+character sequences will be stripped from the returned string, The optional
+\fIraw\fR
+argument may be set to
+1
+if you want to preserve white space and
+$(\-$)
+sequences\&. The
+\fIraw\fR
+argument may be set to
+2
+if you want to strip all characters between any
+$(
+and
+$)
+pairs (as is done for signature calculation)\&.
+.sp
+If the input is a sequence (list or tuple), the individual elements of the sequence will be expanded, and the results will be returned as a list\&.
+.sp
+The optional
+\fItarget\fR
+and
+\fIsource\fR
+keyword arguments must be set to lists of target and source nodes, respectively, if you want the
+\fB$TARGET\fR,
+\fB$TARGETS\fR,
+\fB$SOURCE\fR
+and
+\fB$SOURCES\fR
+to be available for expansion\&. This is usually necessary if you are calling
+\fBenv\&.subst\fR
+from within a Python function used as an SCons action\&.
+.sp
+Returned string values or sequence elements are converted to their string representation by default\&. The optional
+\fIconv\fR
+argument may specify a conversion function that will be used in place of the default\&. For example, if you want Python objects (including SCons Nodes) to be returned as Python objects, you can use the Python Λ idiom to pass in an unnamed function that simply returns its unconverted argument\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print env\&.subst("The C compiler is: $CC")
+
+def compile(target, source, env):
+ sourceDir = env\&.subst("${SOURCE\&.srcdir}",
+ target=target,
+ source=source)
+
+source_nodes = env\&.subst(\*(Aq$EXPAND_TO_NODELIST\*(Aq,
+ conv=lambda x: x)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Tag(node, tags)
+.RS 4
+Annotates file or directory Nodes with information about how the
+\fBPackage\fR
+Builder should package those files or directories\&. All tags are optional\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# makes sure the built library will be installed with 0644 file
+# access mode
+Tag( Library( \*(Aqlib\&.c\*(Aq ), UNIX_ATTR="0644" )
+
+# marks file2\&.txt to be a documentation file
+Tag( \*(Aqfile2\&.txt\*(Aq, DOC )
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+TargetSignatures(type), env\&.TargetSignatures(type)
+.RS 4
+Note: Although it is not yet officially deprecated, use of this function is discouraged\&. See the
+\fBDecider\fR
+function for a more flexible and straightforward way to configure SCons\*(Aq decision\-making\&.
+.sp
+The
+\fBTargetSignatures\fR
+function tells
+scons
+how to decide if a target file (a file that
+\fIis\fR
+built from any other files) has changed since the last time it was used to build some other target file\&. Legal values are
+"build";
+"content"
+(or its synonym
+"MD5");
+"timestamp"; or
+"source"\&.
+.sp
+If the environment method is used, the specified type of target signature is only used for targets built with that environment\&. If the global function is used, the specified type of signature becomes the default used for all target files that don\*(Aqt have an explicit target signature type specified for their environments\&.
+.sp
+
+"content"
+(or its synonym
+"MD5") means
+scons
+decides that a target file has changed if the MD5 checksum of its contents has changed since the last time it was used to rebuild some other target file\&. This means
+scons
+will open up MD5 sum the contents of target files after they\*(Aqre built, and may decide that it does not need to rebuild "downstream" target files if a file was rebuilt with exactly the same contents as the last time\&.
+.sp
+
+"timestamp"
+means
+scons
+decides that a target file has changed if its timestamp (modification time) has changed since the last time it was used to rebuild some other target file\&. (Note that although this is similar to the behavior of Make, by default it will also rebuild if the dependency is
+\fIolder\fR
+than the last time it was used to rebuild the target file\&.)
+.sp
+
+"source"
+means
+scons
+decides that a target file has changed as specified by the corresponding
+\fBSourceSignatures\fR
+setting ("MD5"
+or
+"timestamp")\&. This means that
+scons
+will treat all input files to a target the same way, regardless of whether they are source files or have been built from other files\&.
+.sp
+
+"build"
+means
+scons
+decides that a target file has changed if it has been rebuilt in this invocation or if its content or timestamp have changed as specified by the corresponding
+\fBSourceSignatures\fR
+setting\&. This "propagates" the status of a rebuilt file so that other "downstream" target files will always be rebuilt, even if the contents or the timestamp have not changed\&.
+.sp
+
+"build"
+signatures are fastest because
+"content"
+(or
+"MD5") signatures take longer to compute, but are more accurate than
+"timestamp"
+signatures, and can prevent unnecessary "downstream" rebuilds when a target file is rebuilt to the exact same contents as the previous build\&. The
+"source"
+setting provides the most consistent behavior when other target files may be rebuilt from both source and target input files\&. The default value is
+"source"\&.
+.sp
+Because the default setting is
+"source", using
+\fBSourceSignatures\fR
+is generally preferable to
+\fBTargetSignatures\fR, so that the up\-to\-date decision will be consistent for all files (or all files built with a specific construction environment)\&. Use of
+\fBTargetSignatures\fR
+provides specific control for how built target files affect their "downstream" dependencies\&.
+.RE
+.PP
+Tool(string, [toolpath, **kw]), env\&.Tool(string, [toolpath, **kw])
+.RS 4
+The
+\fBTool\fR
+form of the function returns a callable object that can be used to initialize a construction environment using the tools keyword of the Environment() method\&. The object may be called with a construction environment as an argument, in which case the object will add the necessary variables to the construction environment and the name of the tool will be added to the
+\fB$TOOLS\fR
+construction variable\&.
+.sp
+Additional keyword arguments are passed to the tool\*(Aqs
+\fBgenerate\fR() method\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools = [ Tool(\*(Aqmsvc\*(Aq) ])
+
+env = Environment()
+t = Tool(\*(Aqmsvc\*(Aq)
+t(env) # adds \*(Aqmsvc\*(Aq to the TOOLS variable
+u = Tool(\*(Aqopengl\*(Aq, toolpath = [\*(Aqtools\*(Aq])
+u(env) # adds \*(Aqopengl\*(Aq to the TOOLS variable
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fBenv\&.Tool\fR
+form of the function applies the callable object for the specified tool
+\fIstring\fR
+to the environment through which the method was called\&.
+.sp
+Additional keyword arguments are passed to the tool\*(Aqs
+\fBgenerate\fR() method\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Tool(\*(Aqgcc\*(Aq)
+env\&.Tool(\*(Aqopengl\*(Aq, toolpath = [\*(Aqbuild/tools\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Value(value, [built_value]), env\&.Value(value, [built_value])
+.RS 4
+Returns a Node object representing the specified Python value\&. Value Nodes can be used as dependencies of targets\&. If the result of calling
+\fBstr\fR(\fIvalue\fR) changes between SCons runs, any targets depending on
+\fBValue\fR(\fIvalue\fR) will be rebuilt\&. (This is true even when using timestamps to decide if files are up\-to\-date\&.) When using timestamp source signatures, Value Nodes\*(Aq timestamps are equal to the system time when the Node is created\&.
+.sp
+The returned Value Node object has a
+\fBwrite\fR() method that can be used to "build" a Value Node by setting a new value\&. The optional
+\fIbuilt_value\fR
+argument can be specified when the Value Node is created to indicate the Node should already be considered "built\&." There is a corresponding
+\fBread\fR() method that will return the built value of the Node\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+
+def create(target, source, env):
+ # A function that will write a \*(Aqprefix=$SOURCE\*(Aq
+ # string into the file name specified as the
+ # $TARGET\&.
+ f = open(str(target[0]), \*(Aqwb\*(Aq)
+ f\&.write(\*(Aqprefix=\*(Aq + source[0]\&.get_contents())
+
+# Fetch the prefix= argument, if any, from the command
+# line, and use /usr/local as the default\&.
+prefix = ARGUMENTS\&.get(\*(Aqprefix\*(Aq, \*(Aq/usr/local\*(Aq)
+
+# Attach a \&.Config() builder for the above function action
+# to the construction environment\&.
+env[\*(AqBUILDERS\*(Aq][\*(AqConfig\*(Aq] = Builder(action = create)
+env\&.Config(target = \*(Aqpackage\-config\*(Aq, source = Value(prefix))
+
+def build_value(target, source, env):
+ # A function that "builds" a Python Value by updating
+ # the the Python value with the contents of the file
+ # specified as the source of the Builder call ($SOURCE)\&.
+ target[0]\&.write(source[0]\&.get_contents())
+
+output = env\&.Value(\*(Aqbefore\*(Aq)
+input = env\&.Value(\*(Aqafter\*(Aq)
+
+# Attach a \&.UpdateValue() builder for the above function
+# action to the construction environment\&.
+env[\*(AqBUILDERS\*(Aq][\*(AqUpdateValue\*(Aq] = Builder(action = build_value)
+env\&.UpdateValue(target = Value(output), source = Value(input))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+VariantDir(variant_dir, src_dir, [duplicate]), env\&.VariantDir(variant_dir, src_dir, [duplicate])
+.RS 4
+Use the
+\fBVariantDir\fR
+function to create a copy of your sources in another location: if a name under
+\fIvariant_dir\fR
+is not found but exists under
+\fIsrc_dir\fR, the file or directory is copied to
+\fIvariant_dir\fR\&. Target files can be built in a different directory than the original sources by simply refering to the sources (and targets) within the variant tree\&.
+.sp
+
+\fBVariantDir\fR
+can be called multiple times with the same
+\fIsrc_dir\fR
+to set up multiple builds with different options (\fIvariants\fR)\&. The
+\fIsrc_dir\fR
+location must be in or underneath the SConstruct file\*(Aqs directory, and
+\fIvariant_dir\fR
+may not be underneath
+\fIsrc_dir\fR\&.
+.sp
+The default behavior is for
+scons
+to physically duplicate the source files in the variant tree\&. Thus, a build performed in the variant tree is guaranteed to be identical to a build performed in the source tree even if intermediate source files are generated during the build, or preprocessors or other scanners search for included files relative to the source file, or individual compilers or other invoked tools are hard\-coded to put derived files in the same directory as source files\&.
+.sp
+If possible on the platform, the duplication is performed by linking rather than copying; see also the
+\fB\-\-duplicate\fR
+command\-line option\&. Moreover, only the files needed for the build are duplicated; files and directories that are not used are not present in
+\fIvariant_dir\fR\&.
+.sp
+Duplicating the source tree may be disabled by setting the
+duplicate
+argument to
+0
+(zero)\&. This will cause
+scons
+to invoke Builders using the path names of source files in
+\fIsrc_dir\fR
+and the path names of derived files within
+\fIvariant_dir\fR\&. This is always more efficient than
+duplicate=1, and is usually safe for most builds (but see above for cases that may cause problems)\&.
+.sp
+Note that
+\fBVariantDir\fR
+works most naturally with a subsidiary SConscript file\&. However, you would then call the subsidiary SConscript file not in the source directory, but in the
+\fIvariant_dir\fR, regardless of the value of
+duplicate\&. This is how you tell
+scons
+which variant of a source tree to build:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# run src/SConscript in two variant directories
+VariantDir(\*(Aqbuild/variant1\*(Aq, \*(Aqsrc\*(Aq)
+SConscript(\*(Aqbuild/variant1/SConscript\*(Aq)
+VariantDir(\*(Aqbuild/variant2\*(Aq, \*(Aqsrc\*(Aq)
+SConscript(\*(Aqbuild/variant2/SConscript\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+See also the
+\fBSConscript\fR
+function, described above, for another way to specify a variant directory in conjunction with calling a subsidiary SConscript file\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# use names in the build directory, not the source directory
+VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate=0)
+Program(\*(Aqbuild/prog\*(Aq, \*(Aqbuild/source\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# this builds both the source and docs in a separate subtree
+VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq, duplicate=0)
+SConscript(dirs=[\*(Aqbuild/src\*(Aq,\*(Aqbuild/doc\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# same as previous example, but only uses SConscript
+SConscript(dirs=\*(Aqsrc\*(Aq, variant_dir=\*(Aqbuild/src\*(Aq, duplicate=0)
+SConscript(dirs=\*(Aqdoc\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=0)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+WhereIs(program, [path, pathext, reject]), env\&.WhereIs(program, [path, pathext, reject])
+.RS 4
+Searches for the specified executable
+\fIprogram\fR, returning the full path name to the program if it is found, and returning None if not\&. Searches the specified
+\fIpath\fR, the value of the calling environment\*(Aqs PATH (env[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]), or the user\*(Aqs current external PATH (os\&.environ[\*(AqPATH\*(Aq]) by default\&. On Windows systems, searches for executable programs with any of the file extensions listed in the specified
+\fIpathext\fR, the calling environment\*(Aqs PATHEXT (env[\*(AqENV\*(Aq][\*(AqPATHEXT\*(Aq]) or the user\*(Aqs current PATHEXT (os\&.environ[\*(AqPATHEXT\*(Aq]) by default\&. Will not select any path name or names in the specified
+\fIreject\fR
+list, if any\&.
+.RE
+.SS "SConscript Variables"
+.PP
+In addition to the global functions and methods,
+\fBscons\fR
+supports a number of Python variables that can be used in SConscript files to affect how you want the build to be performed\&. These variables may be accessed from custom Python modules that you import into an SConscript file by adding the following to the Python module:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+from SCons\&.Script import *
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+ARGLIST
+.RS 4
+A list
+\fIkeyword\fR=\fIvalue\fR
+arguments specified on the command line\&. Each element in the list is a tuple containing the (\fIkeyword\fR,\fIvalue\fR) of the argument\&. The separate
+\fIkeyword\fR
+and
+\fIvalue\fR
+elements of the tuple can be accessed by subscripting for element
+\fB[0]\fR
+and
+\fB[1]\fR
+of the tuple, respectively\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print "first keyword, value =", ARGLIST[0][0], ARGLIST[0][1]
+print "second keyword, value =", ARGLIST[1][0], ARGLIST[1][1]
+third_tuple = ARGLIST[2]
+print "third keyword, value =", third_tuple[0], third_tuple[1]
+for key, value in ARGLIST:
+ # process key and value
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ARGUMENTS
+.RS 4
+A dictionary of all the
+\fIkeyword\fR=\fIvalue\fR
+arguments specified on the command line\&. The dictionary is not in order, and if a given keyword has more than one value assigned to it on the command line, the last (right\-most) value is the one in the
+\fBARGUMENTS\fR
+dictionary\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+if ARGUMENTS\&.get(\*(Aqdebug\*(Aq, 0):
+ env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
+else:
+ env = Environment()
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+BUILD_TARGETS
+.RS 4
+A list of the targets which
+\fBscons\fR
+will actually try to build, regardless of whether they were specified on the command line or via the
+\fBDefault\fR() function or method\&. The elements of this list may be strings
+\fIor\fR
+nodes, so you should run the list through the Python
+\fBstr\fR
+function to make sure any Node path names are converted to strings\&.
+.sp
+Because this list may be taken from the list of targets specified using the
+\fBDefault\fR() function or method, the contents of the list may change on each successive call to
+\fBDefault\fR()\&. See the
+\fBDEFAULT_TARGETS\fR
+list, below, for additional information\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+if \*(Aqfoo\*(Aq in BUILD_TARGETS:
+ print "Don\*(Aqt forget to test the `foo\*(Aq program!"
+if \*(Aqspecial/program\*(Aq in BUILD_TARGETS:
+ SConscript(\*(Aqspecial\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Note that the
+\fBBUILD_TARGETS\fR
+list only contains targets expected listed on the command line or via calls to the
+\fBDefault\fR() function or method\&. It does
+\fInot\fR
+contain all dependent targets that will be built as a result of making the sure the explicitly\-specified targets are up to date\&.
+.PP
+COMMAND_LINE_TARGETS
+.RS 4
+A list of the targets explicitly specified on the command line\&. If there are no targets specified on the command line, the list is empty\&. This can be used, for example, to take specific actions only when a certain target or targets is explicitly being built\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+if \*(Aqfoo\*(Aq in COMMAND_LINE_TARGETS:
+ print "Don\*(Aqt forget to test the `foo\*(Aq program!"
+if \*(Aqspecial/program\*(Aq in COMMAND_LINE_TARGETS:
+ SConscript(\*(Aqspecial\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+DEFAULT_TARGETS
+.RS 4
+A list of the target
+\fInodes\fR
+that have been specified using the
+\fBDefault\fR() function or method\&. The elements of the list are nodes, so you need to run them through the Python
+\fBstr\fR
+function to get at the path name for each Node\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print str(DEFAULT_TARGETS[0])
+if \*(Aqfoo\*(Aq in map(str, DEFAULT_TARGETS):
+ print "Don\*(Aqt forget to test the `foo\*(Aq program!"
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+The contents of the
+\fBDEFAULT_TARGETS\fR
+list change on on each successive call to the
+\fBDefault\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+print map(str, DEFAULT_TARGETS) # originally []
+Default(\*(Aqfoo\*(Aq)
+print map(str, DEFAULT_TARGETS) # now a node [\*(Aqfoo\*(Aq]
+Default(\*(Aqbar\*(Aq)
+print map(str, DEFAULT_TARGETS) # now a node [\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq]
+Default(None)
+print map(str, DEFAULT_TARGETS) # back to []
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Consequently, be sure to use
+\fBDEFAULT_TARGETS\fR
+only after you\*(Aqve made all of your
+\fBDefault\fR() calls, or else simply be careful of the order of these statements in your SConscript files so that you don\*(Aqt look for a specific default target before it\*(Aqs actually been added to the list\&.
+.SS "Construction Variables"
+.PP
+A construction environment has an associated dictionary of
+\fIconstruction variables\fR
+that are used by built\-in or user\-supplied build rules\&. Construction variables must follow the same rules for Python identifiers: the initial character must be an underscore or letter, followed by any number of underscores, letters, or digits\&.
+.PP
+A number of useful construction variables are automatically defined by scons for each supported platform, and additional construction variables can be defined by the user\&. The following is a list of the automatically defined construction variables:
+.PP
+AR
+.RS 4
+The static library archiver\&.
+.RE
+.PP
+ARCHITECTURE
+.RS 4
+Specifies the system architecture for which the package is being built\&. The default is the system architecture of the machine on which SCons is running\&. This is used to fill in the
+Architecture:
+field in an Ipkg
+control
+file, and as part of the name of a generated RPM file\&.
+.RE
+.PP
+ARCOM
+.RS 4
+The command line used to generate a static library from object files\&.
+.RE
+.PP
+ARCOMSTR
+.RS 4
+The string displayed when an object file is generated from an assembly\-language source file\&. If this is not set, then
+\fB$ARCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(ARCOMSTR = "Archiving $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ARFLAGS
+.RS 4
+General options passed to the static library archiver\&.
+.RE
+.PP
+AS
+.RS 4
+The assembler\&.
+.RE
+.PP
+ASCOM
+.RS 4
+The command line used to generate an object file from an assembly\-language source file\&.
+.RE
+.PP
+ASCOMSTR
+.RS 4
+The string displayed when an object file is generated from an assembly\-language source file\&. If this is not set, then
+\fB$ASCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(ASCOMSTR = "Assembling $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ASFLAGS
+.RS 4
+General options passed to the assembler\&.
+.RE
+.PP
+ASPPCOM
+.RS 4
+The command line used to assemble an assembly\-language source file into an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$ASFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+ASPPCOMSTR
+.RS 4
+The string displayed when an object file is generated from an assembly\-language source file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$ASPPCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(ASPPCOMSTR = "Assembling $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ASPPFLAGS
+.RS 4
+General options when an assembling an assembly\-language source file into an object file after first running the file through the C preprocessor\&. The default is to use the value of
+\fB$ASFLAGS\fR\&.
+.RE
+.PP
+BIBTEX
+.RS 4
+The bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+BIBTEXCOM
+.RS 4
+The command line used to call the bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+BIBTEXCOMSTR
+.RS 4
+The string displayed when generating a bibliography for TeX or LaTeX\&. If this is not set, then
+\fB$BIBTEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(BIBTEXCOMSTR = "Generating bibliography $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+BIBTEXFLAGS
+.RS 4
+General options passed to the bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+BITKEEPER
+.RS 4
+The BitKeeper executable\&.
+.RE
+.PP
+BITKEEPERCOM
+.RS 4
+The command line for fetching source files using BitKeeper\&.
+.RE
+.PP
+BITKEEPERCOMSTR
+.RS 4
+The string displayed when fetching a source file using BitKeeper\&. If this is not set, then
+\fB$BITKEEPERCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+BITKEEPERGET
+.RS 4
+The command (\fB$BITKEEPER\fR) and subcommand for fetching source files using BitKeeper\&.
+.RE
+.PP
+BITKEEPERGETFLAGS
+.RS 4
+Options that are passed to the BitKeeper
+\fBget\fR
+subcommand\&.
+.RE
+.PP
+BUILDERS
+.RS 4
+A dictionary mapping the names of the builders available through this environment to underlying Builder objects\&. Builders named Alias, CFile, CXXFile, DVI, Library, Object, PDF, PostScript, and Program are available by default\&. If you initialize this variable when an Environment is created:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(BUILDERS = {\*(AqNewBuilder\*(Aq : foo})
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+the default Builders will no longer be available\&. To use a new Builder object in addition to the default Builders, add your new Builder object like this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.Append(BUILDERS = {\*(AqNewBuilder\*(Aq : foo})
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+or this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env[\*(AqBUILDERS][\*(AqNewBuilder\*(Aq] = foo
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CC
+.RS 4
+The C compiler\&.
+.RE
+.PP
+CCCOM
+.RS 4
+The command line used to compile a C source file to a (static) object file\&. Any options specified in the
+\fB$CFLAGS\fR,
+\fB$CCFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+CCCOMSTR
+.RS 4
+The string displayed when a C source file is compiled to a (static) object file\&. If this is not set, then
+\fB$CCCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CCCOMSTR = "Compiling static object $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CCFLAGS
+.RS 4
+General options that are passed to the C and C++ compilers\&.
+.RE
+.PP
+CCPCHFLAGS
+.RS 4
+Options added to the compiler command line to support building with precompiled headers\&. The default value expands expands to the appropriate Microsoft Visual C++ command\-line options when the
+\fB$PCH\fR
+construction variable is set\&.
+.RE
+.PP
+CCPDBFLAGS
+.RS 4
+Options added to the compiler command line to support storing debugging information in a Microsoft Visual C++ PDB file\&. The default value expands expands to appropriate Microsoft Visual C++ command\-line options when the
+\fB$PDB\fR
+construction variable is set\&.
+.sp
+The Visual C++ compiler option that SCons uses by default to generate PDB information is
+\fB/Z7\fR\&. This works correctly with parallel (\fB\-j\fR) builds because it embeds the debug information in the intermediate object files, as opposed to sharing a single PDB file between multiple object files\&. This is also the only way to get debug information embedded into a static library\&. Using the
+\fB/Zi\fR
+instead may yield improved link\-time performance, although parallel builds will no longer work\&.
+.sp
+You can generate PDB files with the
+\fB/Zi\fR
+switch by overriding the default
+\fB$CCPDBFLAGS\fR
+variable as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqCCPDBFLAGS\*(Aq] = [\*(Aq${(PDB and "/Zi /Fd%s" % File(PDB)) or ""}\*(Aq]
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+An alternative would be to use the
+\fB/Zi\fR
+to put the debugging information in a separate
+\&.pdb
+file for each object file by overriding the
+\fB$CCPDBFLAGS\fR
+variable as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqCCPDBFLAGS\*(Aq] = \*(Aq/Zi /Fd${TARGET}\&.pdb\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CCVERSION
+.RS 4
+The version number of the C compiler\&. This may or may not be set, depending on the specific C compiler being used\&.
+.RE
+.PP
+CFILESUFFIX
+.RS 4
+The suffix for C source files\&. This is used by the internal CFile builder when generating C files from Lex (\&.l) or YACC (\&.y) input files\&. The default suffix, of course, is
+\&.c
+(lower case)\&. On case\-insensitive systems (like Windows), SCons also treats
+\&.C
+(upper case) files as C files\&.
+.RE
+.PP
+CFLAGS
+.RS 4
+General options that are passed to the C compiler (C only; not C++)\&.
+.RE
+.PP
+CHANGE_SPECFILE
+.RS 4
+A hook for modifying the file that controls the packaging build (the
+\&.spec
+for RPM, the
+control
+for Ipkg, the
+\&.wxs
+for MSI)\&. If set, the function will be called after the SCons template for the file has been written\&. XXX
+.RE
+.PP
+CHANGED_SOURCES
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+CHANGED_TARGETS
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+CHANGELOG
+.RS 4
+The name of a file containing the change log text to be included in the package\&. This is included as the
+%changelog
+section of the RPM
+\&.spec
+file\&.
+.RE
+.PP
+_concat
+.RS 4
+A function used to produce variables like
+\fB$_CPPINCFLAGS\fR\&. It takes four or five arguments: a prefix to concatenate onto each element, a list of elements, a suffix to concatenate onto each element, an environment for variable interpolation, and an optional function that will be called to transform the list before concatenation\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(Aq_CPPINCFLAGS\*(Aq] = \*(Aq$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs)} $)\*(Aq,
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CONFIGUREDIR
+.RS 4
+The name of the directory in which Configure context test files are written\&. The default is
+\&.sconf_temp
+in the top\-level directory containing the
+SConstruct
+file\&.
+.RE
+.PP
+CONFIGURELOG
+.RS 4
+The name of the Configure context log file\&. The default is
+config\&.log
+in the top\-level directory containing the
+SConstruct
+file\&.
+.RE
+.PP
+_CPPDEFFLAGS
+.RS 4
+An automatically\-generated construction variable containing the C preprocessor command\-line options to define values\&. The value of
+\fB$_CPPDEFFLAGS\fR
+is created by appending
+\fB$CPPDEFPREFIX\fR
+and
+\fB$CPPDEFSUFFIX\fR
+to the beginning and end of each definition in
+\fB$CPPDEFINES\fR\&.
+.RE
+.PP
+CPPDEFINES
+.RS 4
+A platform independent specification of C preprocessor definitions\&. The definitions will be added to command lines through the automatically\-generated
+\fB$_CPPDEFFLAGS\fR
+construction variable (see above), which is constructed according to the type of value of
+\fB$CPPDEFINES\fR:
+.sp
+If
+\fB$CPPDEFINES\fR
+is a string, the values of the
+\fB$CPPDEFPREFIX\fR
+and
+\fB$CPPDEFSUFFIX\fR
+construction variables will be added to the beginning and end\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Will add \-Dxyz to POSIX compiler command lines,
+# and /Dxyz to Microsoft Visual C++ command lines\&.
+env = Environment(CPPDEFINES=\*(Aqxyz\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If
+\fB$CPPDEFINES\fR
+is a list, the values of the
+\fB$CPPDEFPREFIX\fR
+and
+\fB$CPPDEFSUFFIX\fR
+construction variables will be appended to the beginning and end of each element in the list\&. If any element is a list or tuple, then the first item is the name being defined and the second item is its value:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Will add \-DB=2 \-DA to POSIX compiler command lines,
+# and /DB=2 /DA to Microsoft Visual C++ command lines\&.
+env = Environment(CPPDEFINES=[(\*(AqB\*(Aq, 2), \*(AqA\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If
+\fB$CPPDEFINES\fR
+is a dictionary, the values of the
+\fB$CPPDEFPREFIX\fR
+and
+\fB$CPPDEFSUFFIX\fR
+construction variables will be appended to the beginning and end of each item from the dictionary\&. The key of each dictionary item is a name being defined to the dictionary item\*(Aqs corresponding value; if the value is
+None, then the name is defined without an explicit value\&. Note that the resulting flags are sorted by keyword to ensure that the order of the options on the command line is consistent each time
+scons
+is run\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Will add \-DA \-DB=2 to POSIX compiler command lines,
+# and /DA /DB=2 to Microsoft Visual C++ command lines\&.
+env = Environment(CPPDEFINES={\*(AqB\*(Aq:2, \*(AqA\*(Aq:None})
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CPPDEFPREFIX
+.RS 4
+The prefix used to specify preprocessor definitions on the C compiler command line\&. This will be appended to the beginning of each definition in the
+\fB$CPPDEFINES\fR
+construction variable when the
+\fB$_CPPDEFFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+CPPDEFSUFFIX
+.RS 4
+The suffix used to specify preprocessor definitions on the C compiler command line\&. This will be appended to the end of each definition in the
+\fB$CPPDEFINES\fR
+construction variable when the
+\fB$_CPPDEFFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+CPPFLAGS
+.RS 4
+User\-specified C preprocessor options\&. These will be included in any command that uses the C preprocessor, including not just compilation of C and C++ source files via the
+\fB$CCCOM\fR,
+\fB$SHCCCOM\fR,
+\fB$CXXCOM\fR
+and
+\fB$SHCXXCOM\fR
+command lines, but also the
+\fB$FORTRANPPCOM\fR,
+\fB$SHFORTRANPPCOM\fR,
+\fB$F77PPCOM\fR
+and
+\fB$SHF77PPCOM\fR
+command lines used to compile a Fortran source file, and the
+\fB$ASPPCOM\fR
+command line used to assemble an assembly language source file, after first running each file through the C preprocessor\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$CPPPATH\fR\&. See
+\fB$_CPPINCFLAGS\fR, below, for the variable that expands to those options\&.
+.RE
+.PP
+_CPPINCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the C preprocessor command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_CPPINCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$CPPPATH\fR\&.
+.RE
+.PP
+CPPPATH
+.RS 4
+The list of directories that the C preprocessor will search for include directories\&. The C/C++ implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in CCFLAGS or CXXFLAGS because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in CPPPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CPPPATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(CPPPATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_CPPINCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$CPPPATH\fR\&. Any command lines you define that need the CPPPATH directory list should include
+\fB$_CPPINCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CCCOM="my_compiler $_CPPINCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CPPSUFFIXES
+.RS 4
+The list of suffixes of files that will be scanned for C preprocessor implicit dependencies (#include lines)\&. The default list is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+["\&.c", "\&.C", "\&.cxx", "\&.cpp", "\&.c++", "\&.cc",
+ "\&.h", "\&.H", "\&.hxx", "\&.hpp", "\&.hh",
+ "\&.F", "\&.fpp", "\&.FPP",
+ "\&.m", "\&.mm",
+ "\&.S", "\&.spp", "\&.SPP"]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CVS
+.RS 4
+The CVS executable\&.
+.RE
+.PP
+CVSCOFLAGS
+.RS 4
+Options that are passed to the CVS checkout subcommand\&.
+.RE
+.PP
+CVSCOM
+.RS 4
+The command line used to fetch source files from a CVS repository\&.
+.RE
+.PP
+CVSCOMSTR
+.RS 4
+The string displayed when fetching a source file from a CVS repository\&. If this is not set, then
+\fB$CVSCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+CVSFLAGS
+.RS 4
+General options that are passed to CVS\&. By default, this is set to
+\-d $CVSREPOSITORY
+to specify from where the files must be fetched\&.
+.RE
+.PP
+CVSREPOSITORY
+.RS 4
+The path to the CVS repository\&. This is referenced in the default
+\fB$CVSFLAGS\fR
+value\&.
+.RE
+.PP
+CXX
+.RS 4
+The C++ compiler\&.
+.RE
+.PP
+CXXCOM
+.RS 4
+The command line used to compile a C++ source file to an object file\&. Any options specified in the
+\fB$CXXFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+CXXCOMSTR
+.RS 4
+The string displayed when a C++ source file is compiled to a (static) object file\&. If this is not set, then
+\fB$CXXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CXXCOMSTR = "Compiling static object $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+CXXFILESUFFIX
+.RS 4
+The suffix for C++ source files\&. This is used by the internal CXXFile builder when generating C++ files from Lex (\&.ll) or YACC (\&.yy) input files\&. The default suffix is
+\&.cc\&. SCons also treats files with the suffixes
+\&.cpp,
+\&.cxx,
+\&.c++, and
+\&.C++
+as C++ files, and files with
+\&.mm
+suffixes as Objective C++ files\&. On case\-sensitive systems (Linux, UNIX, and other POSIX\-alikes), SCons also treats
+\&.C
+(upper case) files as C++ files\&.
+.RE
+.PP
+CXXFLAGS
+.RS 4
+General options that are passed to the C++ compiler\&. By default, this includes the value of
+\fB$CCFLAGS\fR, so that setting
+\fB$CCFLAGS\fR
+affects both C and C++ compilation\&. If you want to add C++\-specific flags, you must set or override the value of
+\fB$CXXFLAGS\fR\&.
+.RE
+.PP
+CXXVERSION
+.RS 4
+The version number of the C++ compiler\&. This may or may not be set, depending on the specific C++ compiler being used\&.
+.RE
+.PP
+DC
+.RS 4
+DC\&.
+.RE
+.PP
+DCOM
+.RS 4
+DCOM\&.
+.RE
+.PP
+DDEBUG
+.RS 4
+DDEBUG\&.
+.RE
+.PP
+_DDEBUGFLAGS
+.RS 4
+_DDEBUGFLAGS\&.
+.RE
+.PP
+DDEBUGPREFIX
+.RS 4
+DDEBUGPREFIX\&.
+.RE
+.PP
+DDEBUGSUFFIX
+.RS 4
+DDEBUGSUFFIX\&.
+.RE
+.PP
+DESCRIPTION
+.RS 4
+A long description of the project being packaged\&. This is included in the relevant section of the file that controls the packaging build\&.
+.RE
+.PP
+DESCRIPTION_lang
+.RS 4
+A language\-specific long description for the specified
+\fIlang\fR\&. This is used to populate a
+%description \-l
+section of an RPM
+\&.spec
+file\&.
+.RE
+.PP
+DFILESUFFIX
+.RS 4
+DFILESUFFIX\&.
+.RE
+.PP
+DFLAGPREFIX
+.RS 4
+DFLAGPREFIX\&.
+.RE
+.PP
+_DFLAGS
+.RS 4
+_DFLAGS\&.
+.RE
+.PP
+DFLAGS
+.RS 4
+DFLAGS\&.
+.RE
+.PP
+DFLAGSUFFIX
+.RS 4
+DFLAGSUFFIX\&.
+.RE
+.PP
+_DINCFLAGS
+.RS 4
+_DINCFLAGS\&.
+.RE
+.PP
+DINCPREFIX
+.RS 4
+DINCPREFIX\&.
+.RE
+.PP
+DINCSUFFIX
+.RS 4
+DINCSUFFIX\&.
+.RE
+.PP
+Dir
+.RS 4
+A function that converts a string into a Dir instance relative to the target being built\&.
+.sp
+A function that converts a string into a Dir instance relative to the target being built\&.
+.RE
+.PP
+Dirs
+.RS 4
+A function that converts a list of strings into a list of Dir instances relative to the target being built\&.
+.RE
+.PP
+DLIB
+.RS 4
+DLIB\&.
+.RE
+.PP
+DLIBCOM
+.RS 4
+DLIBCOM\&.
+.RE
+.PP
+_DLIBDIRFLAGS
+.RS 4
+_DLIBDIRFLAGS\&.
+.RE
+.PP
+DLIBDIRPREFIX
+.RS 4
+DLIBDIRPREFIX\&.
+.RE
+.PP
+DLIBDIRSUFFIX
+.RS 4
+DLIBDIRSUFFIX\&.
+.RE
+.PP
+DLIBFLAGPREFIX
+.RS 4
+DLIBFLAGPREFIX\&.
+.RE
+.PP
+_DLIBFLAGS
+.RS 4
+_DLIBFLAGS\&.
+.RE
+.PP
+DLIBFLAGSUFFIX
+.RS 4
+DLIBFLAGSUFFIX\&.
+.RE
+.PP
+DLIBLINKPREFIX
+.RS 4
+DLIBLINKPREFIX\&.
+.RE
+.PP
+DLIBLINKSUFFIX
+.RS 4
+DLIBLINKSUFFIX\&.
+.RE
+.PP
+DLINK
+.RS 4
+DLINK\&.
+.RE
+.PP
+DLINKCOM
+.RS 4
+DLINKCOM\&.
+.RE
+.PP
+DLINKFLAGPREFIX
+.RS 4
+DLINKFLAGPREFIX\&.
+.RE
+.PP
+DLINKFLAGS
+.RS 4
+DLINKFLAGS\&.
+.RE
+.PP
+DLINKFLAGSUFFIX
+.RS 4
+DLINKFLAGSUFFIX\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_EPUB
+.RS 4
+The default XSLT file for the
+\fBDocbookEpub\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_HTML
+.RS 4
+The default XSLT file for the
+\fBDocbookHtml\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
+.RS 4
+The default XSLT file for the
+\fBDocbookHtmlChunked\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_HTMLHELP
+.RS 4
+The default XSLT file for the
+\fBDocbookHtmlhelp\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_MAN
+.RS 4
+The default XSLT file for the
+\fBDocbookMan\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_PDF
+.RS 4
+The default XSLT file for the
+\fBDocbookPdf\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_SLIDESHTML
+.RS 4
+The default XSLT file for the
+\fBDocbookSlidesHtml\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_DEFAULT_XSL_SLIDESPDF
+.RS 4
+The default XSLT file for the
+\fBDocbookSlidesPdf\fR
+builder within the current environment, if no other XSLT gets specified via keyword\&.
+.RE
+.PP
+DOCBOOK_FOP
+.RS 4
+The path to the PDF renderer
+fop
+or
+xep, if one of them is installed (fop
+gets checked first)\&.
+.RE
+.PP
+DOCBOOK_FOPCOM
+.RS 4
+The full command\-line for the PDF renderer
+fop
+or
+xep\&.
+.RE
+.PP
+DOCBOOK_FOPCOMSTR
+.RS 4
+The string displayed when a renderer like
+fop
+or
+xep
+is used to create PDF output from an XML file\&.
+.RE
+.PP
+DOCBOOK_FOPFLAGS
+.RS 4
+Additonal command\-line flags for the PDF renderer
+fop
+or
+xep\&.
+.RE
+.PP
+DOCBOOK_XMLLINT
+.RS 4
+The path to the external executable
+xmllint, if it\*(Aqs installed\&. Note, that this is only used as last fallback for resolving XIncludes, if no libxml2 or lxml Python binding can be imported in the current system\&.
+.RE
+.PP
+DOCBOOK_XMLLINTCOM
+.RS 4
+The full command\-line for the external executable
+xmllint\&.
+.RE
+.PP
+DOCBOOK_XMLLINTCOMSTR
+.RS 4
+The string displayed when
+xmllint
+is used to resolve XIncludes for a given XML file\&.
+.RE
+.PP
+DOCBOOK_XMLLINTFLAGS
+.RS 4
+Additonal command\-line flags for the external executable
+xmllint\&.
+.RE
+.PP
+DOCBOOK_XSLTPROC
+.RS 4
+The path to the external executable
+xsltproc
+(or
+saxon,
+xalan), if one of them is installed\&. Note, that this is only used as last fallback for XSL transformations, if no libxml2 or lxml Python binding can be imported in the current system\&.
+.RE
+.PP
+DOCBOOK_XSLTPROCCOM
+.RS 4
+The full command\-line for the external executable
+xsltproc
+(or
+saxon,
+xalan)\&.
+.RE
+.PP
+DOCBOOK_XSLTPROCCOMSTR
+.RS 4
+The string displayed when
+xsltproc
+is used to transform an XML file via a given XSLT stylesheet\&.
+.RE
+.PP
+DOCBOOK_XSLTPROCFLAGS
+.RS 4
+Additonal command\-line flags for the external executable
+xsltproc
+(or
+saxon,
+xalan)\&.
+.RE
+.PP
+DOCBOOK_XSLTPROCPARAMS
+.RS 4
+Additonal parameters that are not intended for the XSLT processor executable, but the XSL processing itself\&. By default, they get appended at the end of the command line for
+saxon
+and
+saxon\-xslt, respectively\&.
+.RE
+.PP
+DPATH
+.RS 4
+DPATH\&.
+.RE
+.PP
+DSUFFIXES
+.RS 4
+The list of suffixes of files that will be scanned for imported D package files\&. The default list is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+[\*(Aq\&.d\*(Aq]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+_DVERFLAGS
+.RS 4
+_DVERFLAGS\&.
+.RE
+.PP
+DVERPREFIX
+.RS 4
+DVERPREFIX\&.
+.RE
+.PP
+DVERSIONS
+.RS 4
+DVERSIONS\&.
+.RE
+.PP
+DVERSUFFIX
+.RS 4
+DVERSUFFIX\&.
+.RE
+.PP
+DVIPDF
+.RS 4
+The TeX DVI file to PDF file converter\&.
+.RE
+.PP
+DVIPDFCOM
+.RS 4
+The command line used to convert TeX DVI files into a PDF file\&.
+.RE
+.PP
+DVIPDFCOMSTR
+.RS 4
+The string displayed when a TeX DVI file is converted into a PDF file\&. If this is not set, then
+\fB$DVIPDFCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+DVIPDFFLAGS
+.RS 4
+General options passed to the TeX DVI file to PDF file converter\&.
+.RE
+.PP
+DVIPS
+.RS 4
+The TeX DVI file to PostScript converter\&.
+.RE
+.PP
+DVIPSFLAGS
+.RS 4
+General options passed to the TeX DVI file to PostScript converter\&.
+.RE
+.PP
+ENV
+.RS 4
+A dictionary of environment variables to use when invoking commands\&. When
+\fB$ENV\fR
+is used in a command all list values will be joined using the path separator and any other non\-string values will simply be coerced to a string\&. Note that, by default,
+scons
+does
+\fInot\fR
+propagate the environment in force when you execute
+scons
+to the commands used to build target files\&. This is so that builds will be guaranteed repeatable regardless of the environment variables set at the time
+scons
+is invoked\&.
+.sp
+If you want to propagate your environment variables to the commands executed to build target files, you must do so explicitly:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import os
+env = Environment(ENV = os\&.environ)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that you can choose only to propagate certain environment variables\&. A common example is the system
+\fBPATH\fR
+environment variable, so that
+scons
+uses the same utilities as the invoking shell (or other process):
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import os
+env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq]})
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ESCAPE
+.RS 4
+A function that will be called to escape shell special characters in command lines\&. The function should take one argument: the command line string to escape; and should return the escaped command line\&.
+.RE
+.PP
+F03
+.RS 4
+The Fortran 03 compiler\&. You should normally set the
+\fB$FORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$F03\fR
+if you need to use a specific compiler or compiler version for Fortran 03 files\&.
+.RE
+.PP
+F03COM
+.RS 4
+The command line used to compile a Fortran 03 source file to an object file\&. You only need to set
+\fB$F03COM\fR
+if you need to use a specific command line for Fortran 03 files\&. You should normally set the
+\fB$FORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+F03COMSTR
+.RS 4
+The string displayed when a Fortran 03 source file is compiled to an object file\&. If this is not set, then
+\fB$F03COM\fR
+or
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F03FILESUFFIXES
+.RS 4
+The list of file extensions for which the F03 dialect will be used\&. By default, this is [\*(Aq\&.f03\*(Aq]
+.RE
+.PP
+F03FLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran 03 compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$F03PATH\fR\&. See
+\fB$_F03INCFLAGS\fR
+below, for the variable that expands to those options\&. You only need to set
+\fB$F03FLAGS\fR
+if you need to define specific user options for Fortran 03 files\&. You should normally set the
+\fB$FORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+_F03INCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran 03 compiler command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_F03INCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$F03PATH\fR\&.
+.RE
+.PP
+F03PATH
+.RS 4
+The list of directories that the Fortran 03 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$F03FLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
+\fB$F03PATH\fR
+will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #: You only need to set
+\fB$F03PATH\fR
+if you need to define a specific include path for Fortran 03 files\&. You should normally set the
+\fB$FORTRANPATH\fR
+variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F03PATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(F03PATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_F03INCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$F03PATH\fR\&. Any command lines you define that need the F03PATH directory list should include
+\fB$_F03INCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F03COM="my_compiler $_F03INCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+F03PPCOM
+.RS 4
+The command line used to compile a Fortran 03 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$F03FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$F03PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 03 files\&. You should normally set the
+\fB$FORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+F03PPCOMSTR
+.RS 4
+The string displayed when a Fortran 03 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$F03PPCOM\fR
+or
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F03PPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for F03 dialect will be used\&. By default, this is empty
+.RE
+.PP
+F08
+.RS 4
+The Fortran 08 compiler\&. You should normally set the
+\fB$FORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$F08\fR
+if you need to use a specific compiler or compiler version for Fortran 08 files\&.
+.RE
+.PP
+F08COM
+.RS 4
+The command line used to compile a Fortran 08 source file to an object file\&. You only need to set
+\fB$F08COM\fR
+if you need to use a specific command line for Fortran 08 files\&. You should normally set the
+\fB$FORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+F08COMSTR
+.RS 4
+The string displayed when a Fortran 08 source file is compiled to an object file\&. If this is not set, then
+\fB$F08COM\fR
+or
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F08FILESUFFIXES
+.RS 4
+The list of file extensions for which the F08 dialect will be used\&. By default, this is [\*(Aq\&.f08\*(Aq]
+.RE
+.PP
+F08FLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran 08 compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$F08PATH\fR\&. See
+\fB$_F08INCFLAGS\fR
+below, for the variable that expands to those options\&. You only need to set
+\fB$F08FLAGS\fR
+if you need to define specific user options for Fortran 08 files\&. You should normally set the
+\fB$FORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+_F08INCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran 08 compiler command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_F08INCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$F08PATH\fR\&.
+.RE
+.PP
+F08PATH
+.RS 4
+The list of directories that the Fortran 08 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$F08FLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
+\fB$F08PATH\fR
+will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #: You only need to set
+\fB$F08PATH\fR
+if you need to define a specific include path for Fortran 08 files\&. You should normally set the
+\fB$FORTRANPATH\fR
+variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F08PATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(F08PATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_F08INCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$F08PATH\fR\&. Any command lines you define that need the F08PATH directory list should include
+\fB$_F08INCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F08COM="my_compiler $_F08INCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+F08PPCOM
+.RS 4
+The command line used to compile a Fortran 08 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$F08FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$F08PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 08 files\&. You should normally set the
+\fB$FORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+F08PPCOMSTR
+.RS 4
+The string displayed when a Fortran 08 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$F08PPCOM\fR
+or
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F08PPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for F08 dialect will be used\&. By default, this is empty
+.RE
+.PP
+F77
+.RS 4
+The Fortran 77 compiler\&. You should normally set the
+\fB$FORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$F77\fR
+if you need to use a specific compiler or compiler version for Fortran 77 files\&.
+.RE
+.PP
+F77COM
+.RS 4
+The command line used to compile a Fortran 77 source file to an object file\&. You only need to set
+\fB$F77COM\fR
+if you need to use a specific command line for Fortran 77 files\&. You should normally set the
+\fB$FORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+F77COMSTR
+.RS 4
+The string displayed when a Fortran 77 source file is compiled to an object file\&. If this is not set, then
+\fB$F77COM\fR
+or
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F77FILESUFFIXES
+.RS 4
+The list of file extensions for which the F77 dialect will be used\&. By default, this is [\*(Aq\&.f77\*(Aq]
+.RE
+.PP
+F77FLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran 77 compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$F77PATH\fR\&. See
+\fB$_F77INCFLAGS\fR
+below, for the variable that expands to those options\&. You only need to set
+\fB$F77FLAGS\fR
+if you need to define specific user options for Fortran 77 files\&. You should normally set the
+\fB$FORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+_F77INCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran 77 compiler command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_F77INCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$F77PATH\fR\&.
+.RE
+.PP
+F77PATH
+.RS 4
+The list of directories that the Fortran 77 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$F77FLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
+\fB$F77PATH\fR
+will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #: You only need to set
+\fB$F77PATH\fR
+if you need to define a specific include path for Fortran 77 files\&. You should normally set the
+\fB$FORTRANPATH\fR
+variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F77PATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(F77PATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_F77INCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$F77PATH\fR\&. Any command lines you define that need the F77PATH directory list should include
+\fB$_F77INCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F77COM="my_compiler $_F77INCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+F77PPCOM
+.RS 4
+The command line used to compile a Fortran 77 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$F77FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$F77PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 77 files\&. You should normally set the
+\fB$FORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+F77PPCOMSTR
+.RS 4
+The string displayed when a Fortran 77 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$F77PPCOM\fR
+or
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F77PPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for F77 dialect will be used\&. By default, this is empty
+.RE
+.PP
+F90
+.RS 4
+The Fortran 90 compiler\&. You should normally set the
+\fB$FORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$F90\fR
+if you need to use a specific compiler or compiler version for Fortran 90 files\&.
+.RE
+.PP
+F90COM
+.RS 4
+The command line used to compile a Fortran 90 source file to an object file\&. You only need to set
+\fB$F90COM\fR
+if you need to use a specific command line for Fortran 90 files\&. You should normally set the
+\fB$FORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+F90COMSTR
+.RS 4
+The string displayed when a Fortran 90 source file is compiled to an object file\&. If this is not set, then
+\fB$F90COM\fR
+or
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F90FILESUFFIXES
+.RS 4
+The list of file extensions for which the F90 dialect will be used\&. By default, this is [\*(Aq\&.f90\*(Aq]
+.RE
+.PP
+F90FLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran 90 compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$F90PATH\fR\&. See
+\fB$_F90INCFLAGS\fR
+below, for the variable that expands to those options\&. You only need to set
+\fB$F90FLAGS\fR
+if you need to define specific user options for Fortran 90 files\&. You should normally set the
+\fB$FORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+_F90INCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran 90 compiler command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_F90INCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$F90PATH\fR\&.
+.RE
+.PP
+F90PATH
+.RS 4
+The list of directories that the Fortran 90 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$F90FLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
+\fB$F90PATH\fR
+will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #: You only need to set
+\fB$F90PATH\fR
+if you need to define a specific include path for Fortran 90 files\&. You should normally set the
+\fB$FORTRANPATH\fR
+variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F90PATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(F90PATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_F90INCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$F90PATH\fR\&. Any command lines you define that need the F90PATH directory list should include
+\fB$_F90INCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F90COM="my_compiler $_F90INCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+F90PPCOM
+.RS 4
+The command line used to compile a Fortran 90 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$F90FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$F90PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 90 files\&. You should normally set the
+\fB$FORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+F90PPCOMSTR
+.RS 4
+The string displayed when a Fortran 90 source file is compiled after first running the file through the C preprocessor\&. If this is not set, then
+\fB$F90PPCOM\fR
+or
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F90PPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for F90 dialect will be used\&. By default, this is empty
+.RE
+.PP
+F95
+.RS 4
+The Fortran 95 compiler\&. You should normally set the
+\fB$FORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$F95\fR
+if you need to use a specific compiler or compiler version for Fortran 95 files\&.
+.RE
+.PP
+F95COM
+.RS 4
+The command line used to compile a Fortran 95 source file to an object file\&. You only need to set
+\fB$F95COM\fR
+if you need to use a specific command line for Fortran 95 files\&. You should normally set the
+\fB$FORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+F95COMSTR
+.RS 4
+The string displayed when a Fortran 95 source file is compiled to an object file\&. If this is not set, then
+\fB$F95COM\fR
+or
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F95FILESUFFIXES
+.RS 4
+The list of file extensions for which the F95 dialect will be used\&. By default, this is [\*(Aq\&.f95\*(Aq]
+.RE
+.PP
+F95FLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran 95 compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include search path options that scons generates automatically from
+\fB$F95PATH\fR\&. See
+\fB$_F95INCFLAGS\fR
+below, for the variable that expands to those options\&. You only need to set
+\fB$F95FLAGS\fR
+if you need to define specific user options for Fortran 95 files\&. You should normally set the
+\fB$FORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+_F95INCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran 95 compiler command\-line options for specifying directories to be searched for include files\&. The value of
+\fB$_F95INCFLAGS\fR
+is created by appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$F95PATH\fR\&.
+.RE
+.PP
+F95PATH
+.RS 4
+The list of directories that the Fortran 95 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$F95FLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
+\fB$F95PATH\fR
+will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #: You only need to set
+\fB$F95PATH\fR
+if you need to define a specific include path for Fortran 95 files\&. You should normally set the
+\fB$FORTRANPATH\fR
+variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F95PATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(F95PATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_F95INCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$F95PATH\fR\&. Any command lines you define that need the F95PATH directory list should include
+\fB$_F95INCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(F95COM="my_compiler $_F95INCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+F95PPCOM
+.RS 4
+The command line used to compile a Fortran 95 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$F95FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$F95PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 95 files\&. You should normally set the
+\fB$FORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+F95PPCOMSTR
+.RS 4
+The string displayed when a Fortran 95 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$F95PPCOM\fR
+or
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+F95PPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for F95 dialect will be used\&. By default, this is empty
+.RE
+.PP
+File
+.RS 4
+A function that converts a string into a File instance relative to the target being built\&.
+.sp
+A function that converts a string into a File instance relative to the target being built\&.
+.RE
+.PP
+FORTRAN
+.RS 4
+The default Fortran compiler for all versions of Fortran\&.
+.RE
+.PP
+FORTRANCOM
+.RS 4
+The command line used to compile a Fortran source file to an object file\&. By default, any options specified in the
+\fB$FORTRANFLAGS\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_FORTRANMODFLAG\fR, and
+\fB$_FORTRANINCFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+FORTRANCOMSTR
+.RS 4
+The string displayed when a Fortran source file is compiled to an object file\&. If this is not set, then
+\fB$FORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+FORTRANFILESUFFIXES
+.RS 4
+The list of file extensions for which the FORTRAN dialect will be used\&. By default, this is [\*(Aq\&.f\*(Aq, \*(Aq\&.for\*(Aq, \*(Aq\&.ftn\*(Aq]
+.RE
+.PP
+FORTRANFLAGS
+.RS 4
+General user\-specified options that are passed to the Fortran compiler\&. Note that this variable does
+\fInot\fR
+contain
+\fB\-I\fR
+(or similar) include or module search path options that scons generates automatically from
+\fB$FORTRANPATH\fR\&. See
+\fB$_FORTRANINCFLAGS\fR
+and
+\fB$_FORTRANMODFLAG\fR, below, for the variables that expand those options\&.
+.RE
+.PP
+_FORTRANINCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the Fortran compiler command\-line options for specifying directories to be searched for include files and module files\&. The value of
+\fB$_FORTRANINCFLAGS\fR
+is created by prepending/appending
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$FORTRANPATH\fR\&.
+.RE
+.PP
+FORTRANMODDIR
+.RS 4
+Directory location where the Fortran compiler should place any module files it generates\&. This variable is empty, by default\&. Some Fortran compilers will internally append this directory in the search path for module files, as well\&.
+.RE
+.PP
+FORTRANMODDIRPREFIX
+.RS 4
+The prefix used to specify a module directory on the Fortran compiler command line\&. This will be appended to the beginning of the directory in the
+\fB$FORTRANMODDIR\fR
+construction variables when the
+\fB$_FORTRANMODFLAG\fR
+variables is automatically generated\&.
+.RE
+.PP
+FORTRANMODDIRSUFFIX
+.RS 4
+The suffix used to specify a module directory on the Fortran compiler command line\&. This will be appended to the beginning of the directory in the
+\fB$FORTRANMODDIR\fR
+construction variables when the
+\fB$_FORTRANMODFLAG\fR
+variables is automatically generated\&.
+.RE
+.PP
+_FORTRANMODFLAG
+.RS 4
+An automatically\-generated construction variable containing the Fortran compiler command\-line option for specifying the directory location where the Fortran compiler should place any module files that happen to get generated during compilation\&. The value of
+\fB$_FORTRANMODFLAG\fR
+is created by prepending/appending
+\fB$FORTRANMODDIRPREFIX\fR
+and
+\fB$FORTRANMODDIRSUFFIX\fR
+to the beginning and end of the directory in
+\fB$FORTRANMODDIR\fR\&.
+.RE
+.PP
+FORTRANMODPREFIX
+.RS 4
+The module file prefix used by the Fortran compiler\&. SCons assumes that the Fortran compiler follows the quasi\-standard naming convention for module files of
+module_name\&.mod\&. As a result, this variable is left empty, by default\&. For situations in which the compiler does not necessarily follow the normal convention, the user may use this variable\&. Its value will be appended to every module file name as scons attempts to resolve dependencies\&.
+.RE
+.PP
+FORTRANMODSUFFIX
+.RS 4
+The module file suffix used by the Fortran compiler\&. SCons assumes that the Fortran compiler follows the quasi\-standard naming convention for module files of
+module_name\&.mod\&. As a result, this variable is set to "\&.mod", by default\&. For situations in which the compiler does not necessarily follow the normal convention, the user may use this variable\&. Its value will be appended to every module file name as scons attempts to resolve dependencies\&.
+.RE
+.PP
+FORTRANPATH
+.RS 4
+The list of directories that the Fortran compiler will search for include files and (for some compilers) module files\&. The Fortran implicit dependency scanner will search these directories for include files (but not module files since they are autogenerated and, as such, may not actually exist at the time the scan takes place)\&. Don\*(Aqt explicitly put include directory arguments in FORTRANFLAGS because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in FORTRANPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(FORTRANPATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(FORTRANPATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_FORTRANINCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$INCPREFIX\fR
+and
+\fB$INCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$FORTRANPATH\fR\&. Any command lines you define that need the FORTRANPATH directory list should include
+\fB$_FORTRANINCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(FORTRANCOM="my_compiler $_FORTRANINCFLAGS \-c \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FORTRANPPCOM
+.RS 4
+The command line used to compile a Fortran source file to an object file after first running the file through the C preprocessor\&. By default, any options specified in the
+\fB$FORTRANFLAGS\fR,
+\fB$CPPFLAGS\fR,
+\fB$_CPPDEFFLAGS\fR,
+\fB$_FORTRANMODFLAG\fR, and
+\fB$_FORTRANINCFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+FORTRANPPCOMSTR
+.RS 4
+The string displayed when a Fortran source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$FORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+FORTRANPPFILESUFFIXES
+.RS 4
+The list of file extensions for which the compilation + preprocessor pass for FORTRAN dialect will be used\&. By default, this is [\*(Aq\&.fpp\*(Aq, \*(Aq\&.FPP\*(Aq]
+.RE
+.PP
+FORTRANSUFFIXES
+.RS 4
+The list of suffixes of files that will be scanned for Fortran implicit dependencies (INCLUDE lines and USE statements)\&. The default list is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+["\&.f", "\&.F", "\&.for", "\&.FOR", "\&.ftn", "\&.FTN", "\&.fpp", "\&.FPP",
+"\&.f77", "\&.F77", "\&.f90", "\&.F90", "\&.f95", "\&.F95"]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FRAMEWORKPATH
+.RS 4
+On Mac OS X with gcc, a list containing the paths to search for frameworks\&. Used by the compiler to find framework\-style includes like #include <Fmwk/Header\&.h>\&. Used by the linker to find user\-specified frameworks when linking (see
+\fB$FRAMEWORKS\fR)\&. For example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ env\&.AppendUnique(FRAMEWORKPATH=\*(Aq#myframeworkdir\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+will add
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ \&.\&.\&. \-Fmyframeworkdir
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+to the compiler and linker command lines\&.
+.RE
+.PP
+_FRAMEWORKPATH
+.RS 4
+On Mac OS X with gcc, an automatically\-generated construction variable containing the linker command\-line options corresponding to
+\fB$FRAMEWORKPATH\fR\&.
+.RE
+.PP
+FRAMEWORKPATHPREFIX
+.RS 4
+On Mac OS X with gcc, the prefix to be used for the FRAMEWORKPATH entries\&. (see
+\fB$FRAMEWORKPATH\fR)\&. The default value is
+\fB\-F\fR\&.
+.RE
+.PP
+FRAMEWORKPREFIX
+.RS 4
+On Mac OS X with gcc, the prefix to be used for linking in frameworks (see
+\fB$FRAMEWORKS\fR)\&. The default value is
+\fB\-framework\fR\&.
+.RE
+.PP
+_FRAMEWORKS
+.RS 4
+On Mac OS X with gcc, an automatically\-generated construction variable containing the linker command\-line options for linking with FRAMEWORKS\&.
+.RE
+.PP
+FRAMEWORKS
+.RS 4
+On Mac OS X with gcc, a list of the framework names to be linked into a program or shared library or bundle\&. The default value is the empty list\&. For example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ env\&.AppendUnique(FRAMEWORKS=Split(\*(AqSystem Cocoa SystemConfiguration\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FRAMEWORKSFLAGS
+.RS 4
+On Mac OS X with gcc, general user\-supplied frameworks options to be added at the end of a command line building a loadable module\&. (This has been largely superseded by the
+\fB$FRAMEWORKPATH\fR,
+\fB$FRAMEWORKPATHPREFIX\fR,
+\fB$FRAMEWORKPREFIX\fR
+and
+\fB$FRAMEWORKS\fR
+variables described above\&.)
+.RE
+.PP
+GS
+.RS 4
+The Ghostscript program used, e\&.g\&. to convert PostScript to PDF files\&.
+.RE
+.PP
+GSCOM
+.RS 4
+The full Ghostscript command line used for the conversion process\&. Its default value is
+\(lq$GS $GSFLAGS \-sOutputFile=$TARGET $SOURCES\(rq\&.
+.RE
+.PP
+GSCOMSTR
+.RS 4
+The string displayed when Ghostscript is called for the conversion process\&. If this is not set (the default), then
+\fB$GSCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+GSFLAGS
+.RS 4
+General options passed to the Ghostscript program, when converting PostScript to PDF files for example\&. Its default value is
+\(lq\-dNOPAUSE \-dBATCH \-sDEVICE=pdfwrite\(rq
+.RE
+.PP
+HOST_ARCH
+.RS 4
+The name of the host hardware architecture used to create the Environment\&. If a platform is specified when creating the Environment, then that Platform\*(Aqs logic will handle setting this value\&. This value is immutable, and should not be changed by the user after the Environment is initialized\&. Currently only set for Win32\&.
+.sp
+Sets the host architecture for Visual Studio compiler\&. If not set, default to the detected host architecture: note that this may depend on the python you are using\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&.
+.sp
+Valid values are the same as for
+\fB$TARGET_ARCH\fR\&.
+.sp
+This is currently only used on Windows, but in the future it will be used on other OSes as well\&.
+.RE
+.PP
+HOST_OS
+.RS 4
+The name of the host operating system used to create the Environment\&. If a platform is specified when creating the Environment, then that Platform\*(Aqs logic will handle setting this value\&. This value is immutable, and should not be changed by the user after the Environment is initialized\&. Currently only set for Win32\&.
+.RE
+.PP
+IDLSUFFIXES
+.RS 4
+The list of suffixes of files that will be scanned for IDL implicit dependencies (#include or import lines)\&. The default list is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+["\&.idl", "\&.IDL"]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+IMPLICIT_COMMAND_DEPENDENCIES
+.RS 4
+Controls whether or not SCons will add implicit dependencies for the commands executed to build targets\&.
+.sp
+By default, SCons will add to each target an implicit dependency on the command represented by the first argument on any command line it executes\&. The specific file for the dependency is found by searching the
+\fIPATH\fR
+variable in the
+\fIENV\fR
+environment used to execute the command\&.
+.sp
+If the construction variable
+\fB$IMPLICIT_COMMAND_DEPENDENCIES\fR
+is set to a false value (None,
+False,
+0, etc\&.), then the implicit dependency will not be added to the targets built with that construction environment\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(IMPLICIT_COMMAND_DEPENDENCIES = 0)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+INCPREFIX
+.RS 4
+The prefix used to specify an include directory on the C compiler command line\&. This will be appended to the beginning of each directory in the
+\fB$CPPPATH\fR
+and
+\fB$FORTRANPATH\fR
+construction variables when the
+\fB$_CPPINCFLAGS\fR
+and
+\fB$_FORTRANINCFLAGS\fR
+variables are automatically generated\&.
+.RE
+.PP
+INCSUFFIX
+.RS 4
+The suffix used to specify an include directory on the C compiler command line\&. This will be appended to the end of each directory in the
+\fB$CPPPATH\fR
+and
+\fB$FORTRANPATH\fR
+construction variables when the
+\fB$_CPPINCFLAGS\fR
+and
+\fB$_FORTRANINCFLAGS\fR
+variables are automatically generated\&.
+.RE
+.PP
+INSTALL
+.RS 4
+A function to be called to install a file into a destination file name\&. The default function copies the file into the destination (and sets the destination file\*(Aqs mode and permission bits to match the source file\*(Aqs)\&. The function takes the following arguments:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def install(dest, source, env):
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIdest\fR
+is the path name of the destination file\&.
+\fIsource\fR
+is the path name of the source file\&.
+\fIenv\fR
+is the construction environment (a dictionary of construction values) in force for this file installation\&.
+.RE
+.PP
+INSTALLSTR
+.RS 4
+The string displayed when a file is installed into a destination file name\&. The default is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Install file: "$SOURCE" as "$TARGET"
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+INTEL_C_COMPILER_VERSION
+.RS 4
+Set by the "intelc" Tool to the major version number of the Intel C compiler selected for use\&.
+.RE
+.PP
+JAR
+.RS 4
+The Java archive tool\&.
+.sp
+The Java archive tool\&.
+.RE
+.PP
+JARCHDIR
+.RS 4
+The directory to which the Java archive tool should change (using the
+\fB\-C\fR
+option)\&.
+.sp
+The directory to which the Java archive tool should change (using the
+\fB\-C\fR
+option)\&.
+.RE
+.PP
+JARCOM
+.RS 4
+The command line used to call the Java archive tool\&.
+.sp
+The command line used to call the Java archive tool\&.
+.RE
+.PP
+JARCOMSTR
+.RS 4
+The string displayed when the Java archive tool is called If this is not set, then
+\fB$JARCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The string displayed when the Java archive tool is called If this is not set, then
+\fB$JARCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+JARFLAGS
+.RS 4
+General options passed to the Java archive tool\&. By default this is set to
+\fBcf\fR
+to create the necessary
+\fBjar\fR
+file\&.
+.sp
+General options passed to the Java archive tool\&. By default this is set to
+\fBcf\fR
+to create the necessary
+\fBjar\fR
+file\&.
+.RE
+.PP
+JARSUFFIX
+.RS 4
+The suffix for Java archives:
+\&.jar
+by default\&.
+.sp
+The suffix for Java archives:
+\&.jar
+by default\&.
+.RE
+.PP
+JAVABOOTCLASSPATH
+.RS 4
+Specifies the list of directories that will be added to the
+javac
+command line via the
+\fB\-bootclasspath\fR
+option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
+on UNIX/Linux/POSIX,
+;
+on Windows)\&.
+.RE
+.PP
+JAVAC
+.RS 4
+The Java compiler\&.
+.RE
+.PP
+JAVACCOM
+.RS 4
+The command line used to compile a directory tree containing Java source files to corresponding Java class files\&. Any options specified in the
+\fB$JAVACFLAGS\fR
+construction variable are included on this command line\&.
+.RE
+.PP
+JAVACCOMSTR
+.RS 4
+The string displayed when compiling a directory tree of Java source files to corresponding Java class files\&. If this is not set, then
+\fB$JAVACCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(JAVACCOMSTR = "Compiling class files $TARGETS from $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+JAVACFLAGS
+.RS 4
+General options that are passed to the Java compiler\&.
+.RE
+.PP
+JAVACLASSDIR
+.RS 4
+The directory in which Java class files may be found\&. This is stripped from the beginning of any Java \&.class file names supplied to the
+JavaH
+builder\&.
+.RE
+.PP
+JAVACLASSPATH
+.RS 4
+Specifies the list of directories that will be searched for Java
+\&.class
+file\&. The directories in this list will be added to the
+javac
+and
+javah
+command lines via the
+\fB\-classpath\fR
+option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
+on UNIX/Linux/POSIX,
+;
+on Windows)\&.
+.sp
+Note that this currently just adds the specified directory via the
+\fB\-classpath\fR
+option\&.
+SCons
+does not currently search the
+\fB$JAVACLASSPATH\fR
+directories for dependency
+\&.class
+files\&.
+.RE
+.PP
+JAVACLASSSUFFIX
+.RS 4
+The suffix for Java class files;
+\&.class
+by default\&.
+.RE
+.PP
+JAVAH
+.RS 4
+The Java generator for C header and stub files\&.
+.RE
+.PP
+JAVAHCOM
+.RS 4
+The command line used to generate C header and stub files from Java classes\&. Any options specified in the
+\fB$JAVAHFLAGS\fR
+construction variable are included on this command line\&.
+.RE
+.PP
+JAVAHCOMSTR
+.RS 4
+The string displayed when C header and stub files are generated from Java classes\&. If this is not set, then
+\fB$JAVAHCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(JAVAHCOMSTR = "Generating header/stub file(s) $TARGETS from $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+JAVAHFLAGS
+.RS 4
+General options passed to the C header and stub file generator for Java classes\&.
+.RE
+.PP
+JAVASOURCEPATH
+.RS 4
+Specifies the list of directories that will be searched for input
+\&.java
+file\&. The directories in this list will be added to the
+javac
+command line via the
+\fB\-sourcepath\fR
+option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
+on UNIX/Linux/POSIX,
+;
+on Windows)\&.
+.sp
+Note that this currently just adds the specified directory via the
+\fB\-sourcepath\fR
+option\&.
+SCons
+does not currently search the
+\fB$JAVASOURCEPATH\fR
+directories for dependency
+\&.java
+files\&.
+.RE
+.PP
+JAVASUFFIX
+.RS 4
+The suffix for Java files;
+\&.java
+by default\&.
+.RE
+.PP
+JAVAVERSION
+.RS 4
+Specifies the Java version being used by the
+\fBJava\fR
+builder\&. This is
+\fInot\fR
+currently used to select one version of the Java compiler vs\&. another\&. Instead, you should set this to specify the version of Java supported by your
+javac
+compiler\&. The default is
+1\&.4\&.
+.sp
+This is sometimes necessary because Java 1\&.5 changed the file names that are created for nested anonymous inner classes, which can cause a mismatch with the files that
+SCons
+expects will be generated by the
+javac
+compiler\&. Setting
+\fB$JAVAVERSION\fR
+to
+1\&.5
+(or
+1\&.6, as appropriate) can make
+SCons
+realize that a Java 1\&.5 or 1\&.6 build is actually up to date\&.
+.RE
+.PP
+LATEX
+.RS 4
+The LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+LATEXCOM
+.RS 4
+The command line used to call the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+LATEXCOMSTR
+.RS 4
+The string displayed when calling the LaTeX structured formatter and typesetter\&. If this is not set, then
+\fB$LATEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LATEXCOMSTR = "Building $TARGET from LaTeX input $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+LATEXFLAGS
+.RS 4
+General options passed to the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+LATEXRETRIES
+.RS 4
+The maximum number of times that LaTeX will be re\-run if the
+\&.log
+generated by the
+\fB$LATEXCOM\fR
+command indicates that there are undefined references\&. The default is to try to resolve undefined references by re\-running LaTeX up to three times\&.
+.RE
+.PP
+LATEXSUFFIXES
+.RS 4
+The list of suffixes of files that will be scanned for LaTeX implicit dependencies (\einclude
+or
+\eimport
+files)\&. The default list is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+["\&.tex", "\&.ltx", "\&.latex"]
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+LDMODULE
+.RS 4
+The linker for building loadable modules\&. By default, this is the same as
+\fB$SHLINK\fR\&.
+.RE
+.PP
+LDMODULECOM
+.RS 4
+The command line for building loadable modules\&. On Mac OS X, this uses the
+\fB$LDMODULE\fR,
+\fB$LDMODULEFLAGS\fR
+and
+\fB$FRAMEWORKSFLAGS\fR
+variables\&. On other systems, this is the same as
+\fB$SHLINK\fR\&.
+.RE
+.PP
+LDMODULECOMSTR
+.RS 4
+The string displayed when building loadable modules\&. If this is not set, then
+\fB$LDMODULECOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+LDMODULEFLAGS
+.RS 4
+General user options passed to the linker for building loadable modules\&.
+.RE
+.PP
+LDMODULEPREFIX
+.RS 4
+The prefix used for loadable module file names\&. On Mac OS X, this is null; on other systems, this is the same as
+\fB$SHLIBPREFIX\fR\&.
+.RE
+.PP
+LDMODULESUFFIX
+.RS 4
+The suffix used for loadable module file names\&. On Mac OS X, this is null; on other systems, this is the same as $SHLIBSUFFIX\&.
+.RE
+.PP
+LEX
+.RS 4
+The lexical analyzer generator\&.
+.RE
+.PP
+LEXCOM
+.RS 4
+The command line used to call the lexical analyzer generator to generate a source file\&.
+.RE
+.PP
+LEXCOMSTR
+.RS 4
+The string displayed when generating a source file using the lexical analyzer generator\&. If this is not set, then
+\fB$LEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LEXCOMSTR = "Lex\*(Aqing $TARGET from $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+LEXFLAGS
+.RS 4
+General options passed to the lexical analyzer generator\&.
+.RE
+.PP
+_LIBDIRFLAGS
+.RS 4
+An automatically\-generated construction variable containing the linker command\-line options for specifying directories to be searched for library\&. The value of
+\fB$_LIBDIRFLAGS\fR
+is created by appending
+\fB$LIBDIRPREFIX\fR
+and
+\fB$LIBDIRSUFFIX\fR
+to the beginning and end of each directory in
+\fB$LIBPATH\fR\&.
+.RE
+.PP
+LIBDIRPREFIX
+.RS 4
+The prefix used to specify a library directory on the linker command line\&. This will be appended to the beginning of each directory in the
+\fB$LIBPATH\fR
+construction variable when the
+\fB$_LIBDIRFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+LIBDIRSUFFIX
+.RS 4
+The suffix used to specify a library directory on the linker command line\&. This will be appended to the end of each directory in the
+\fB$LIBPATH\fR
+construction variable when the
+\fB$_LIBDIRFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+LIBEMITTER
+.RS 4
+TODO
+.RE
+.PP
+_LIBFLAGS
+.RS 4
+An automatically\-generated construction variable containing the linker command\-line options for specifying libraries to be linked with the resulting target\&. The value of
+\fB$_LIBFLAGS\fR
+is created by appending
+\fB$LIBLINKPREFIX\fR
+and
+\fB$LIBLINKSUFFIX\fR
+to the beginning and end of each filename in
+\fB$LIBS\fR\&.
+.RE
+.PP
+LIBLINKPREFIX
+.RS 4
+The prefix used to specify a library to link on the linker command line\&. This will be appended to the beginning of each library in the
+\fB$LIBS\fR
+construction variable when the
+\fB$_LIBFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+LIBLINKSUFFIX
+.RS 4
+The suffix used to specify a library to link on the linker command line\&. This will be appended to the end of each library in the
+\fB$LIBS\fR
+construction variable when the
+\fB$_LIBFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+LIBPATH
+.RS 4
+The list of directories that will be searched for libraries\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
+\fB$LINKFLAGS\fR
+or
+\fB$SHLINKFLAGS\fR
+because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in LIBPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LIBPATH=\*(Aq#/libs\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+libs = Dir(\*(Aqlibs\*(Aq)
+env = Environment(LIBPATH=libs)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_LIBDIRFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$LIBDIRPREFIX\fR
+and
+\fB$LIBDIRSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$LIBPATH\fR\&. Any command lines you define that need the LIBPATH directory list should include
+\fB$_LIBDIRFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+LIBPREFIX
+.RS 4
+The prefix used for (static) library file names\&. A default value is set for each platform (posix, win32, os2, etc\&.), but the value is overridden by individual tools (ar, mslib, sgiar, sunar, tlib, etc\&.) to reflect the names of the libraries they create\&.
+.RE
+.PP
+LIBPREFIXES
+.RS 4
+A list of all legal prefixes for library file names\&. When searching for library dependencies, SCons will look for files with these prefixes, the base library name, and suffixes in the
+\fB$LIBSUFFIXES\fR
+list\&.
+.RE
+.PP
+LIBS
+.RS 4
+A list of one or more libraries that will be linked with any executable programs created by this environment\&.
+.sp
+The library list will be added to command lines through the automatically\-generated
+\fB$_LIBFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$LIBLINKPREFIX\fR
+and
+\fB$LIBLINKSUFFIX\fR
+construction variables to the beginning and end of each filename in
+\fB$LIBS\fR\&. Any command lines you define that need the LIBS library list should include
+\fB$_LIBFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If you add a File object to the
+\fB$LIBS\fR
+list, the name of that file will be added to
+\fB$_LIBFLAGS\fR, and thus the link line, as is, without
+\fB$LIBLINKPREFIX\fR
+or
+\fB$LIBLINKSUFFIX\fR\&. For example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env\&.Append(LIBS=File(\*(Aq/tmp/mylib\&.so\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+In all cases, scons will add dependencies from the executable program to all the libraries in this list\&.
+.RE
+.PP
+LIBSUFFIX
+.RS 4
+The suffix used for (static) library file names\&. A default value is set for each platform (posix, win32, os2, etc\&.), but the value is overridden by individual tools (ar, mslib, sgiar, sunar, tlib, etc\&.) to reflect the names of the libraries they create\&.
+.RE
+.PP
+LIBSUFFIXES
+.RS 4
+A list of all legal suffixes for library file names\&. When searching for library dependencies, SCons will look for files with prefixes, in the
+\fB$LIBPREFIXES\fR
+list, the base library name, and these suffixes\&.
+.RE
+.PP
+LICENSE
+.RS 4
+The abbreviated name of the license under which this project is released (gpl, lpgl, bsd etc\&.)\&. See http://www\&.opensource\&.org/licenses/alphabetical for a list of license names\&.
+.RE
+.PP
+LINESEPARATOR
+.RS 4
+The separator used by the
+\fBSubstfile\fR
+and
+\fBTextfile\fR
+builders\&. This value is used between sources when constructing the target\&. It defaults to the current system line separator\&.
+.RE
+.PP
+LINGUAS_FILE
+.RS 4
+The
+\fB$LINGUAS_FILE\fR
+defines file(s) containing list of additional linguas to be processed by
+\fBPOInit\fR,
+\fBPOUpdate\fR
+or
+\fBMOFiles\fR
+builders\&. It also affects
+\fBTranslate\fR
+builder\&. If the variable contains a string, it defines name of the list file\&. The
+\fB$LINGUAS_FILE\fR
+may be a list of file names as well\&. If
+\fB$LINGUAS_FILE\fR
+is set to
+True
+(or non\-zero numeric value), the list will be read from default file named
+LINGUAS\&.
+.RE
+.PP
+LINK
+.RS 4
+The linker\&.
+.RE
+.PP
+LINKCOM
+.RS 4
+The command line used to link object files into an executable\&.
+.RE
+.PP
+LINKCOMSTR
+.RS 4
+The string displayed when object files are linked into an executable\&. If this is not set, then
+\fB$LINKCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LINKCOMSTR = "Linking $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+LINKFLAGS
+.RS 4
+General user options passed to the linker\&. Note that this variable should
+\fInot\fR
+contain
+\fB\-l\fR
+(or similar) options for linking with the libraries listed in
+\fB$LIBS\fR, nor
+\fB\-L\fR
+(or similar) library search path options that scons generates automatically from
+\fB$LIBPATH\fR\&. See
+\fB$_LIBFLAGS\fR
+above, for the variable that expands to library\-link options, and
+\fB$_LIBDIRFLAGS\fR
+above, for the variable that expands to library search path options\&.
+.RE
+.PP
+M4
+.RS 4
+The M4 macro preprocessor\&.
+.RE
+.PP
+M4COM
+.RS 4
+The command line used to pass files through the M4 macro preprocessor\&.
+.RE
+.PP
+M4COMSTR
+.RS 4
+The string displayed when a file is passed through the M4 macro preprocessor\&. If this is not set, then
+\fB$M4COM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+M4FLAGS
+.RS 4
+General options passed to the M4 macro preprocessor\&.
+.RE
+.PP
+MAKEINDEX
+.RS 4
+The makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+MAKEINDEXCOM
+.RS 4
+The command line used to call the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+MAKEINDEXCOMSTR
+.RS 4
+The string displayed when calling the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&. If this is not set, then
+\fB$MAKEINDEXCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+MAKEINDEXFLAGS
+.RS 4
+General options passed to the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
+.RE
+.PP
+MAXLINELENGTH
+.RS 4
+The maximum number of characters allowed on an external command line\&. On Win32 systems, link lines longer than this many characters are linked via a temporary file name\&.
+.RE
+.PP
+MIDL
+.RS 4
+The Microsoft IDL compiler\&.
+.RE
+.PP
+MIDLCOM
+.RS 4
+The command line used to pass files to the Microsoft IDL compiler\&.
+.RE
+.PP
+MIDLCOMSTR
+.RS 4
+The string displayed when the Microsoft IDL copmiler is called\&. If this is not set, then
+\fB$MIDLCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+MIDLFLAGS
+.RS 4
+General options passed to the Microsoft IDL compiler\&.
+.RE
+.PP
+MOSUFFIX
+.RS 4
+Suffix used for
+MO
+files (default:
+\*(Aq\&.mo\*(Aq)\&. See
+msgfmt
+tool and
+\fBMOFiles\fR
+builder\&.
+.RE
+.PP
+MSGFMT
+.RS 4
+Absolute path to
+\fBmsgfmt(1)\fR
+binary, found by
+\fBDetect()\fR\&. See
+msgfmt
+tool and
+\fBMOFiles\fR
+builder\&.
+.RE
+.PP
+MSGFMTCOM
+.RS 4
+Complete command line to run
+\fBmsgfmt(1)\fR
+program\&. See
+msgfmt
+tool and
+\fBMOFiles\fR
+builder\&.
+.RE
+.PP
+MSGFMTCOMSTR
+.RS 4
+String to display when
+\fBmsgfmt(1)\fR
+is invoked (default:
+\*(Aq\*(Aq, which means ``print
+\fB$MSGFMTCOM\fR\*(Aq\*(Aq)\&. See
+msgfmt
+tool and
+\fBMOFiles\fR
+builder\&.
+.RE
+.PP
+MSGFMTFLAGS
+.RS 4
+Additional flags to
+\fBmsgfmt(1)\fR\&. See
+msgfmt
+tool and
+\fBMOFiles\fR
+builder\&.
+.RE
+.PP
+MSGINIT
+.RS 4
+Path to
+\fBmsginit(1)\fR
+program (found via
+Detect())\&. See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+MSGINITCOM
+.RS 4
+Complete command line to run
+\fBmsginit(1)\fR
+program\&. See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+MSGINITCOMSTR
+.RS 4
+String to display when
+\fBmsginit(1)\fR
+is invoked (default:
+\*(Aq\*(Aq, which means ``print
+\fB$MSGINITCOM\fR\*(Aq\*(Aq)\&. See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+MSGINITFLAGS
+.RS 4
+List of additional flags to
+\fBmsginit(1)\fR
+(default:
+[])\&. See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+_MSGINITLOCALE
+.RS 4
+Internal ``macro\*(Aq\*(Aq\&. Computes locale (language) name based on target filename (default:
+\*(Aq${TARGET\&.filebase}\*(Aq)\&.
+.sp
+See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+MSGMERGE
+.RS 4
+Absolute path to
+\fBmsgmerge(1)\fR
+binary as found by
+\fBDetect()\fR\&. See
+msgmerge
+tool and
+\fBPOUpdate\fR
+builder\&.
+.RE
+.PP
+MSGMERGECOM
+.RS 4
+Complete command line to run
+\fBmsgmerge(1)\fR
+command\&. See
+msgmerge
+tool and
+\fBPOUpdate\fR
+builder\&.
+.RE
+.PP
+MSGMERGECOMSTR
+.RS 4
+String to be displayed when
+\fBmsgmerge(1)\fR
+is invoked (default:
+\*(Aq\*(Aq, which means ``print
+\fB$MSGMERGECOM\fR\*(Aq\*(Aq)\&. See
+msgmerge
+tool and
+\fBPOUpdate\fR
+builder\&.
+.RE
+.PP
+MSGMERGEFLAGS
+.RS 4
+Additional flags to
+\fBmsgmerge(1)\fR
+command\&. See
+msgmerge
+tool and
+\fBPOUpdate\fR
+builder\&.
+.RE
+.PP
+MSSDK_DIR
+.RS 4
+The directory containing the Microsoft SDK (either Platform SDK or Windows SDK) to be used for compilation\&.
+.RE
+.PP
+MSSDK_VERSION
+.RS 4
+The version string of the Microsoft SDK (either Platform SDK or Windows SDK) to be used for compilation\&. Supported versions include
+6\&.1,
+6\&.0A,
+6\&.0,
+2003R2
+and
+2003R1\&.
+.RE
+.PP
+MSVC_BATCH
+.RS 4
+When set to any true value, specifies that SCons should batch compilation of object files when calling the Microsoft Visual C/C++ compiler\&. All compilations of source files from the same source directory that generate target files in a same output directory and were configured in SCons using the same construction environment will be built in a single call to the compiler\&. Only source files that have changed since their object files were built will be passed to each compiler invocation (via the
+\fB$CHANGED_SOURCES\fR
+construction variable)\&. Any compilations where the object (target) file base name (minus the
+\&.obj) does not match the source file base name will be compiled separately\&.
+.RE
+.PP
+MSVC_USE_SCRIPT
+.RS 4
+Use a batch script to set up Microsoft Visual Studio compiler
+.sp
+
+\fB$MSVC_USE_SCRIPT\fR
+overrides
+\fB$MSVC_VERSION\fR
+and
+\fB$TARGET_ARCH\fR\&. If set to the name of a Visual Studio \&.bat file (e\&.g\&. vcvars\&.bat), SCons will run that bat file and extract the relevant variables from the result (typically %INCLUDE%, %LIB%, and %PATH%)\&. Setting MSVC_USE_SCRIPT to None bypasses the Visual Studio autodetection entirely; use this if you are running SCons in a Visual Studio cmd window and importing the shell\*(Aqs environment variables\&.
+.RE
+.PP
+MSVC_VERSION
+.RS 4
+Sets the preferred version of Microsoft Visual C/C++ to use\&.
+.sp
+If
+\fB$MSVC_VERSION\fR
+is not set, SCons will (by default) select the latest version of Visual C/C++ installed on your system\&. If the specified version isn\*(Aqt installed, tool initialization will fail\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&.
+.sp
+Valid values for Windows are
+12\&.0,
+12\&.0Exp,
+11\&.0,
+11\&.0Exp,
+10\&.0,
+10\&.0Exp,
+9\&.0,
+9\&.0Exp,
+8\&.0,
+8\&.0Exp,
+7\&.1,
+7\&.0, and
+6\&.0\&. Versions ending in
+Exp
+refer to "Express" or "Express for Desktop" editions\&.
+.RE
+.PP
+MSVS
+.RS 4
+When the Microsoft Visual Studio tools are initialized, they set up this dictionary with the following keys:
+.PP
+VERSION
+.RS 4
+the version of MSVS being used (can be set via
+\fB$MSVS_VERSION\fR)
+.RE
+.PP
+VERSIONS
+.RS 4
+the available versions of MSVS installed
+.RE
+.PP
+VCINSTALLDIR
+.RS 4
+installed directory of Visual C++
+.RE
+.PP
+VSINSTALLDIR
+.RS 4
+installed directory of Visual Studio
+.RE
+.PP
+FRAMEWORKDIR
+.RS 4
+installed directory of the \&.NET framework
+.RE
+.PP
+FRAMEWORKVERSIONS
+.RS 4
+list of installed versions of the \&.NET framework, sorted latest to oldest\&.
+.RE
+.PP
+FRAMEWORKVERSION
+.RS 4
+latest installed version of the \&.NET framework
+.RE
+.PP
+FRAMEWORKSDKDIR
+.RS 4
+installed location of the \&.NET SDK\&.
+.RE
+.PP
+PLATFORMSDKDIR
+.RS 4
+installed location of the Platform SDK\&.
+.RE
+.PP
+PLATFORMSDK_MODULES
+.RS 4
+dictionary of installed Platform SDK modules, where the dictionary keys are keywords for the various modules, and the values are 2\-tuples where the first is the release date, and the second is the version number\&.
+.RE
+.sp
+If a value isn\*(Aqt set, it wasn\*(Aqt available in the registry\&.
+.RE
+.PP
+MSVS_ARCH
+.RS 4
+Sets the architecture for which the generated project(s) should build\&.
+.sp
+The default value is
+x86\&.
+amd64
+is also supported by
+SCons
+for some Visual Studio versions\&. Trying to set
+\fB$MSVS_ARCH\fR
+to an architecture that\*(Aqs not supported for a given Visual Studio version will generate an error\&.
+.RE
+.PP
+MSVS_PROJECT_GUID
+.RS 4
+The string placed in a generated Microsoft Visual Studio project file as the value of the
+ProjectGUID
+attribute\&. There is no default value\&. If not defined, a new GUID is generated\&.
+.RE
+.PP
+MSVS_SCC_AUX_PATH
+.RS 4
+The path name placed in a generated Microsoft Visual Studio project file as the value of the
+SccAuxPath
+attribute if the
+\fBMSVS_SCC_PROVIDER\fR
+construction variable is also set\&. There is no default value\&.
+.RE
+.PP
+MSVS_SCC_CONNECTION_ROOT
+.RS 4
+The root path of projects in your SCC workspace, i\&.e the path under which all project and solution files will be generated\&. It is used as a reference path from which the relative paths of the generated Microsoft Visual Studio project and solution files are computed\&. The relative project file path is placed as the value of the
+SccLocalPath
+attribute of the project file and as the values of the
+SccProjectFilePathRelativizedFromConnection[i]
+(where [i] ranges from 0 to the number of projects in the solution) attributes of the
+GlobalSection(SourceCodeControl)
+section of the Microsoft Visual Studio solution file\&. Similarly the relative solution file path is placed as the values of the
+SccLocalPath[i]
+(where [i] ranges from 0 to the number of projects in the solution) attributes of the
+GlobalSection(SourceCodeControl)
+section of the Microsoft Visual Studio solution file\&. This is used only if the
+\fBMSVS_SCC_PROVIDER\fR
+construction variable is also set\&. The default value is the current working directory\&.
+.RE
+.PP
+MSVS_SCC_PROJECT_NAME
+.RS 4
+The project name placed in a generated Microsoft Visual Studio project file as the value of the
+SccProjectName
+attribute if the
+\fBMSVS_SCC_PROVIDER\fR
+construction variable is also set\&. In this case the string is also placed in the
+SccProjectName0
+attribute of the
+GlobalSection(SourceCodeControl)
+section of the Microsoft Visual Studio solution file\&. There is no default value\&.
+.RE
+.PP
+MSVS_SCC_PROVIDER
+.RS 4
+The string placed in a generated Microsoft Visual Studio project file as the value of the
+SccProvider
+attribute\&. The string is also placed in the
+SccProvider0
+attribute of the
+GlobalSection(SourceCodeControl)
+section of the Microsoft Visual Studio solution file\&. There is no default value\&.
+.RE
+.PP
+MSVS_VERSION
+.RS 4
+Sets the preferred version of Microsoft Visual Studio to use\&.
+.sp
+If
+\fB$MSVS_VERSION\fR
+is not set,
+SCons
+will (by default) select the latest version of Visual Studio installed on your system\&. So, if you have version 6 and version 7 (MSVS \&.NET) installed, it will prefer version 7\&. You can override this by specifying the
+\fBMSVS_VERSION\fR
+variable in the Environment initialization, setting it to the appropriate version (\*(Aq6\&.0\*(Aq or \*(Aq7\&.0\*(Aq, for example)\&. If the specified version isn\*(Aqt installed, tool initialization will fail\&.
+.sp
+This is obsolete: use
+\fB$MSVC_VERSION\fR
+instead\&. If
+\fB$MSVS_VERSION\fR
+is set and
+\fB$MSVC_VERSION\fR
+is not,
+\fB$MSVC_VERSION\fR
+will be set automatically to
+\fB$MSVS_VERSION\fR\&. If both are set to different values, scons will raise an error\&.
+.RE
+.PP
+MSVSBUILDCOM
+.RS 4
+The build command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with any specified build targets\&.
+.RE
+.PP
+MSVSCLEANCOM
+.RS 4
+The clean command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with the \-c option to remove any specified targets\&.
+.RE
+.PP
+MSVSENCODING
+.RS 4
+The encoding string placed in a generated Microsoft Visual Studio project file\&. The default is encoding
+Windows\-1252\&.
+.RE
+.PP
+MSVSPROJECTCOM
+.RS 4
+The action used to generate Microsoft Visual Studio project files\&.
+.RE
+.PP
+MSVSPROJECTSUFFIX
+.RS 4
+The suffix used for Microsoft Visual Studio project (DSP) files\&. The default value is
+\&.vcproj
+when using Visual Studio version 7\&.x (\&.NET) or later version, and
+\&.dsp
+when using earlier versions of Visual Studio\&.
+.RE
+.PP
+MSVSREBUILDCOM
+.RS 4
+The rebuild command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with any specified rebuild targets\&.
+.RE
+.PP
+MSVSSCONS
+.RS 4
+The SCons used in generated Microsoft Visual Studio project files\&. The default is the version of SCons being used to generate the project file\&.
+.RE
+.PP
+MSVSSCONSCOM
+.RS 4
+The default SCons command used in generated Microsoft Visual Studio project files\&.
+.RE
+.PP
+MSVSSCONSCRIPT
+.RS 4
+The sconscript file (that is,
+SConstruct
+or
+SConscript
+file) that will be invoked by Visual Studio project files (through the
+\fB$MSVSSCONSCOM\fR
+variable)\&. The default is the same sconscript file that contains the call to
+\fBMSVSProject\fR
+to build the project file\&.
+.RE
+.PP
+MSVSSCONSFLAGS
+.RS 4
+The SCons flags used in generated Microsoft Visual Studio project files\&.
+.RE
+.PP
+MSVSSOLUTIONCOM
+.RS 4
+The action used to generate Microsoft Visual Studio solution files\&.
+.RE
+.PP
+MSVSSOLUTIONSUFFIX
+.RS 4
+The suffix used for Microsoft Visual Studio solution (DSW) files\&. The default value is
+\&.sln
+when using Visual Studio version 7\&.x (\&.NET), and
+\&.dsw
+when using earlier versions of Visual Studio\&.
+.RE
+.PP
+MT
+.RS 4
+The program used on Windows systems to embed manifests into DLLs and EXEs\&. See also
+\fB$WINDOWS_EMBED_MANIFEST\fR\&.
+.RE
+.PP
+MTEXECOM
+.RS 4
+The Windows command line used to embed manifests into executables\&. See also
+\fB$MTSHLIBCOM\fR\&.
+.RE
+.PP
+MTFLAGS
+.RS 4
+Flags passed to the
+\fB$MT\fR
+manifest embedding program (Windows only)\&.
+.RE
+.PP
+MTSHLIBCOM
+.RS 4
+The Windows command line used to embed manifests into shared libraries (DLLs)\&. See also
+\fB$MTEXECOM\fR\&.
+.RE
+.PP
+MWCW_VERSION
+.RS 4
+The version number of the MetroWerks CodeWarrior C compiler to be used\&.
+.RE
+.PP
+MWCW_VERSIONS
+.RS 4
+A list of installed versions of the MetroWerks CodeWarrior C compiler on this system\&.
+.RE
+.PP
+NAME
+.RS 4
+Specfies the name of the project to package\&.
+.RE
+.PP
+no_import_lib
+.RS 4
+When set to non\-zero, suppresses creation of a corresponding Windows static import lib by the
+SharedLibrary
+builder when used with MinGW, Microsoft Visual Studio or Metrowerks\&. This also suppresses creation of an export (\&.exp) file when using Microsoft Visual Studio\&.
+.RE
+.PP
+OBJPREFIX
+.RS 4
+The prefix used for (static) object file names\&.
+.RE
+.PP
+OBJSUFFIX
+.RS 4
+The suffix used for (static) object file names\&.
+.RE
+.PP
+P4
+.RS 4
+The Perforce executable\&.
+.RE
+.PP
+P4COM
+.RS 4
+The command line used to fetch source files from Perforce\&.
+.RE
+.PP
+P4COMSTR
+.RS 4
+The string displayed when fetching a source file from Perforce\&. If this is not set, then
+\fB$P4COM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+P4FLAGS
+.RS 4
+General options that are passed to Perforce\&.
+.RE
+.PP
+PACKAGEROOT
+.RS 4
+Specifies the directory where all files in resulting archive will be placed if applicable\&. The default value is "$NAME\-$VERSION"\&.
+.RE
+.PP
+PACKAGETYPE
+.RS 4
+Selects the package type to build\&. Currently these are available:
+.sp
+* msi \- Microsoft Installer * rpm \- Redhat Package Manger * ipkg \- Itsy Package Management System * tarbz2 \- compressed tar * targz \- compressed tar * zip \- zip file * src_tarbz2 \- compressed tar source * src_targz \- compressed tar source * src_zip \- zip file source
+.sp
+This may be overridden with the "package_type" command line option\&.
+.RE
+.PP
+PACKAGEVERSION
+.RS 4
+The version of the package (not the underlying project)\&. This is currently only used by the rpm packager and should reflect changes in the packaging, not the underlying project code itself\&.
+.RE
+.PP
+PCH
+.RS 4
+The Microsoft Visual C++ precompiled header that will be used when compiling object files\&. This variable is ignored by tools other than Microsoft Visual C++\&. When this variable is defined SCons will add options to the compiler command line to cause it to use the precompiled header, and will also set up the dependencies for the PCH file\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqPCH\*(Aq] = \*(AqStdAfx\&.pch\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+PCHCOM
+.RS 4
+The command line used by the
+\fBPCH\fR
+builder to generated a precompiled header\&.
+.RE
+.PP
+PCHCOMSTR
+.RS 4
+The string displayed when generating a precompiled header\&. If this is not set, then
+\fB$PCHCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+PCHPDBFLAGS
+.RS 4
+A construction variable that, when expanded, adds the
+/yD
+flag to the command line only if the
+\fB$PDB\fR
+construction variable is set\&.
+.RE
+.PP
+PCHSTOP
+.RS 4
+This variable specifies how much of a source file is precompiled\&. This variable is ignored by tools other than Microsoft Visual C++, or when the PCH variable is not being used\&. When this variable is define it must be a string that is the name of the header that is included at the end of the precompiled portion of the source files, or the empty string if the "#pragma hrdstop" construct is being used:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqPCHSTOP\*(Aq] = \*(AqStdAfx\&.h\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+PDB
+.RS 4
+The Microsoft Visual C++ PDB file that will store debugging information for object files, shared libraries, and programs\&. This variable is ignored by tools other than Microsoft Visual C++\&. When this variable is defined SCons will add options to the compiler and linker command line to cause them to generate external debugging information, and will also set up the dependencies for the PDB file\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqPDB\*(Aq] = \*(Aqhello\&.pdb\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The Visual C++ compiler switch that SCons uses by default to generate PDB information is
+\fB/Z7\fR\&. This works correctly with parallel (\fB\-j\fR) builds because it embeds the debug information in the intermediate object files, as opposed to sharing a single PDB file between multiple object files\&. This is also the only way to get debug information embedded into a static library\&. Using the
+\fB/Zi\fR
+instead may yield improved link\-time performance, although parallel builds will no longer work\&. You can generate PDB files with the
+\fB/Zi\fR
+switch by overriding the default
+\fB$CCPDBFLAGS\fR
+variable; see the entry for that variable for specific examples\&.
+.RE
+.PP
+PDFCOM
+.RS 4
+A deprecated synonym for
+\fB$DVIPDFCOM\fR\&.
+.RE
+.PP
+PDFLATEX
+.RS 4
+The
+pdflatex
+utility\&.
+.RE
+.PP
+PDFLATEXCOM
+.RS 4
+The command line used to call the
+pdflatex
+utility\&.
+.RE
+.PP
+PDFLATEXCOMSTR
+.RS 4
+The string displayed when calling the
+pdflatex
+utility\&. If this is not set, then
+\fB$PDFLATEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(PDFLATEX;COMSTR = "Building $TARGET from LaTeX input $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+PDFLATEXFLAGS
+.RS 4
+General options passed to the
+pdflatex
+utility\&.
+.RE
+.PP
+PDFPREFIX
+.RS 4
+The prefix used for PDF file names\&.
+.RE
+.PP
+PDFSUFFIX
+.RS 4
+The suffix used for PDF file names\&.
+.RE
+.PP
+PDFTEX
+.RS 4
+The
+pdftex
+utility\&.
+.RE
+.PP
+PDFTEXCOM
+.RS 4
+The command line used to call the
+pdftex
+utility\&.
+.RE
+.PP
+PDFTEXCOMSTR
+.RS 4
+The string displayed when calling the
+pdftex
+utility\&. If this is not set, then
+\fB$PDFTEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(PDFTEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+PDFTEXFLAGS
+.RS 4
+General options passed to the
+pdftex
+utility\&.
+.RE
+.PP
+PKGCHK
+.RS 4
+On Solaris systems, the package\-checking program that will be used (along with
+\fB$PKGINFO\fR) to look for installed versions of the Sun PRO C++ compiler\&. The default is
+/usr/sbin/pgkchk\&.
+.RE
+.PP
+PKGINFO
+.RS 4
+On Solaris systems, the package information program that will be used (along with
+\fB$PKGCHK\fR) to look for installed versions of the Sun PRO C++ compiler\&. The default is
+pkginfo\&.
+.RE
+.PP
+PLATFORM
+.RS 4
+The name of the platform used to create the Environment\&. If no platform is specified when the Environment is created,
+scons
+autodetects the platform\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(tools = [])
+if env[\*(AqPLATFORM\*(Aq] == \*(Aqcygwin\*(Aq:
+ Tool(\*(Aqmingw\*(Aq)(env)
+else:
+ Tool(\*(Aqmsvc\*(Aq)(env)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+POAUTOINIT
+.RS 4
+The
+\fB$POAUTOINIT\fR
+variable, if set to
+True
+(on non\-zero numeric value), let the
+msginit
+tool to automatically initialize
+\fImissing\fR
+PO
+files with
+\fBmsginit(1)\fR\&. This applies to both,
+\fBPOInit\fR
+and
+\fBPOUpdate\fR
+builders (and others that use any of them)\&.
+.RE
+.PP
+POCREATE_ALIAS
+.RS 4
+Common alias for all
+PO
+files created with
+\fBPOInit\fR
+builder (default:
+\*(Aqpo\-create\*(Aq)\&. See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+POSUFFIX
+.RS 4
+Suffix used for
+PO
+files (default:
+\*(Aq\&.po\*(Aq) See
+msginit
+tool and
+\fBPOInit\fR
+builder\&.
+.RE
+.PP
+POTDOMAIN
+.RS 4
+The
+\fB$POTDOMAIN\fR
+defines default domain, used to generate
+POT
+filename as
+\fB$POTDOMAIN\fR\&.pot
+when no
+POT
+file name is provided by the user\&. This applies to
+\fBPOTUpdate\fR,
+\fBPOInit\fR
+and
+\fBPOUpdate\fR
+builders (and builders, that use them, e\&.g\&.
+\fBTranslate\fR)\&. Normally (if
+\fB$POTDOMAIN\fR
+is not defined), the builders use
+messages\&.pot
+as default
+POT
+file name\&.
+.RE
+.PP
+POTSUFFIX
+.RS 4
+Suffix used for PO Template files (default:
+\*(Aq\&.pot\*(Aq)\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+POTUPDATE_ALIAS
+.RS 4
+Name of the common phony target for all PO Templates created with
+\fBPOUpdate\fR
+(default:
+\*(Aqpot\-update\*(Aq)\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+POUPDATE_ALIAS
+.RS 4
+Common alias for all
+PO
+files being defined with
+\fBPOUpdate\fR
+builder (default:
+\*(Aqpo\-update\*(Aq)\&. See
+msgmerge
+tool and
+\fBPOUpdate\fR
+builder\&.
+.RE
+.PP
+PRINT_CMD_LINE_FUNC
+.RS 4
+A Python function used to print the command lines as they are executed (assuming command printing is not disabled by the
+\fB\-q\fR
+or
+\fB\-s\fR
+options or their equivalents)\&. The function should take four arguments:
+\fIs\fR, the command being executed (a string),
+\fItarget\fR, the target being built (file node, list, or string name(s)),
+\fIsource\fR, the source(s) used (file node, list, or string name(s)), and
+\fIenv\fR, the environment being used\&.
+.sp
+The function must do the printing itself\&. The default implementation, used if this variable is not set or is None, is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def print_cmd_line(s, target, source, env):
+ sys\&.stdout\&.write(s + "\en")
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Here\*(Aqs an example of a more interesting function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def print_cmd_line(s, target, source, env):
+ sys\&.stdout\&.write("Building %s \-> %s\&.\&.\&.\en" %
+ (\*(Aq and \*(Aq\&.join([str(x) for x in source]),
+ \*(Aq and \*(Aq\&.join([str(x) for x in target])))
+env=Environment(PRINT_CMD_LINE_FUNC=print_cmd_line)
+env\&.Program(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+This just prints "Building
+\fItargetname\fR
+from
+\fIsourcename\fR\&.\&.\&." instead of the actual commands\&. Such a function could also log the actual commands to a log file, for example\&.
+.RE
+.PP
+PROGEMITTER
+.RS 4
+TODO
+.RE
+.PP
+PROGPREFIX
+.RS 4
+The prefix used for executable file names\&.
+.RE
+.PP
+PROGSUFFIX
+.RS 4
+The suffix used for executable file names\&.
+.RE
+.PP
+PSCOM
+.RS 4
+The command line used to convert TeX DVI files into a PostScript file\&.
+.RE
+.PP
+PSCOMSTR
+.RS 4
+The string displayed when a TeX DVI file is converted into a PostScript file\&. If this is not set, then
+\fB$PSCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+PSPREFIX
+.RS 4
+The prefix used for PostScript file names\&.
+.RE
+.PP
+PSSUFFIX
+.RS 4
+The prefix used for PostScript file names\&.
+.RE
+.PP
+QT_AUTOSCAN
+.RS 4
+Turn off scanning for mocable files\&. Use the Moc Builder to explicitly specify files to run moc on\&.
+.RE
+.PP
+QT_BINPATH
+.RS 4
+The path where the qt binaries are installed\&. The default value is \*(Aq\fB$QTDIR\fR/bin\*(Aq\&.
+.RE
+.PP
+QT_CPPPATH
+.RS 4
+The path where the qt header files are installed\&. The default value is \*(Aq\fB$QTDIR\fR/include\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
+\fB$CPPPATH\fR
+construction variable\&.
+.RE
+.PP
+QT_DEBUG
+.RS 4
+Prints lots of debugging information while scanning for moc files\&.
+.RE
+.PP
+QT_LIB
+.RS 4
+Default value is \*(Aqqt\*(Aq\&. You may want to set this to \*(Aqqt\-mt\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
+\fB$LIBS\fR
+variable\&.
+.RE
+.PP
+QT_LIBPATH
+.RS 4
+The path where the qt libraries are installed\&. The default value is \*(Aq\fB$QTDIR\fR/lib\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
+\fB$LIBPATH\fR
+construction variable\&.
+.RE
+.PP
+QT_MOC
+.RS 4
+Default value is \*(Aq\fB$QT_BINPATH\fR/moc\*(Aq\&.
+.RE
+.PP
+QT_MOCCXXPREFIX
+.RS 4
+Default value is \*(Aq\*(Aq\&. Prefix for moc output files, when source is a cxx file\&.
+.RE
+.PP
+QT_MOCCXXSUFFIX
+.RS 4
+Default value is \*(Aq\&.moc\*(Aq\&. Suffix for moc output files, when source is a cxx file\&.
+.RE
+.PP
+QT_MOCFROMCXXCOM
+.RS 4
+Command to generate a moc file from a cpp file\&.
+.RE
+.PP
+QT_MOCFROMCXXCOMSTR
+.RS 4
+The string displayed when generating a moc file from a cpp file\&. If this is not set, then
+\fB$QT_MOCFROMCXXCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+QT_MOCFROMCXXFLAGS
+.RS 4
+Default value is \*(Aq\-i\*(Aq\&. These flags are passed to moc, when moccing a C++ file\&.
+.RE
+.PP
+QT_MOCFROMHCOM
+.RS 4
+Command to generate a moc file from a header\&.
+.RE
+.PP
+QT_MOCFROMHCOMSTR
+.RS 4
+The string displayed when generating a moc file from a cpp file\&. If this is not set, then
+\fB$QT_MOCFROMHCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+QT_MOCFROMHFLAGS
+.RS 4
+Default value is \*(Aq\*(Aq\&. These flags are passed to moc, when moccing a header file\&.
+.RE
+.PP
+QT_MOCHPREFIX
+.RS 4
+Default value is \*(Aqmoc_\*(Aq\&. Prefix for moc output files, when source is a header\&.
+.RE
+.PP
+QT_MOCHSUFFIX
+.RS 4
+Default value is \*(Aq\fB$CXXFILESUFFIX\fR\*(Aq\&. Suffix for moc output files, when source is a header\&.
+.RE
+.PP
+QT_UIC
+.RS 4
+Default value is \*(Aq\fB$QT_BINPATH\fR/uic\*(Aq\&.
+.RE
+.PP
+QT_UICCOM
+.RS 4
+Command to generate header files from \&.ui files\&.
+.RE
+.PP
+QT_UICCOMSTR
+.RS 4
+The string displayed when generating header files from \&.ui files\&. If this is not set, then
+\fB$QT_UICCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+QT_UICDECLFLAGS
+.RS 4
+Default value is \*(Aq\*(Aq\&. These flags are passed to uic, when creating a a h file from a \&.ui file\&.
+.RE
+.PP
+QT_UICDECLPREFIX
+.RS 4
+Default value is \*(Aq\*(Aq\&. Prefix for uic generated header files\&.
+.RE
+.PP
+QT_UICDECLSUFFIX
+.RS 4
+Default value is \*(Aq\&.h\*(Aq\&. Suffix for uic generated header files\&.
+.RE
+.PP
+QT_UICIMPLFLAGS
+.RS 4
+Default value is \*(Aq\*(Aq\&. These flags are passed to uic, when creating a cxx file from a \&.ui file\&.
+.RE
+.PP
+QT_UICIMPLPREFIX
+.RS 4
+Default value is \*(Aquic_\*(Aq\&. Prefix for uic generated implementation files\&.
+.RE
+.PP
+QT_UICIMPLSUFFIX
+.RS 4
+Default value is \*(Aq\fB$CXXFILESUFFIX\fR\*(Aq\&. Suffix for uic generated implementation files\&.
+.RE
+.PP
+QT_UISUFFIX
+.RS 4
+Default value is \*(Aq\&.ui\*(Aq\&. Suffix of designer input files\&.
+.RE
+.PP
+QTDIR
+.RS 4
+The qt tool tries to take this from os\&.environ\&. It also initializes all QT_* construction variables listed below\&. (Note that all paths are constructed with python\*(Aqs os\&.path\&.join() method, but are listed here with the \*(Aq/\*(Aq separator for easier reading\&.) In addition, the construction environment variables
+\fB$CPPPATH\fR,
+\fB$LIBPATH\fR
+and
+\fB$LIBS\fR
+may be modified and the variables
+\fB$PROGEMITTER\fR,
+\fB$SHLIBEMITTER\fR
+and
+\fB$LIBEMITTER\fR
+are modified\&. Because the build\-performance is affected when using this tool, you have to explicitly specify it at Environment creation:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Environment(tools=[\*(Aqdefault\*(Aq,\*(Aqqt\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The qt tool supports the following operations:
+.sp
+
+\fBAutomatic moc file generation from header files\&.\fR
+You do not have to specify moc files explicitly, the tool does it for you\&. However, there are a few preconditions to do so: Your header file must have the same filebase as your implementation file and must stay in the same directory\&. It must have one of the suffixes \&.h, \&.hpp, \&.H, \&.hxx, \&.hh\&. You can turn off automatic moc file generation by setting QT_AUTOSCAN to 0\&. See also the corresponding
+\fBMoc\fR() builder method\&.
+.sp
+
+\fBAutomatic moc file generation from cxx files\&.\fR
+As stated in the qt documentation, include the moc file at the end of the cxx file\&. Note that you have to include the file, which is generated by the transformation ${QT_MOCCXXPREFIX}<basename>${QT_MOCCXXSUFFIX}, by default <basename>\&.moc\&. A warning is generated after building the moc file, if you do not include the correct file\&. If you are using VariantDir, you may need to specify duplicate=1\&. You can turn off automatic moc file generation by setting QT_AUTOSCAN to 0\&. See also the corresponding
+\fBMoc\fR
+builder method\&.
+.sp
+
+\fBAutomatic handling of \&.ui files\&.\fR
+The implementation files generated from \&.ui files are handled much the same as yacc or lex files\&. Each \&.ui file given as a source of Program, Library or SharedLibrary will generate three files, the declaration file, the implementation file and a moc file\&. Because there are also generated headers, you may need to specify duplicate=1 in calls to VariantDir\&. See also the corresponding
+\fBUic\fR
+builder method\&.
+.RE
+.PP
+RANLIB
+.RS 4
+The archive indexer\&.
+.RE
+.PP
+RANLIBCOM
+.RS 4
+The command line used to index a static library archive\&.
+.RE
+.PP
+RANLIBCOMSTR
+.RS 4
+The string displayed when a static library archive is indexed\&. If this is not set, then
+\fB$RANLIBCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(RANLIBCOMSTR = "Indexing $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+RANLIBFLAGS
+.RS 4
+General options passed to the archive indexer\&.
+.RE
+.PP
+RC
+.RS 4
+The resource compiler used to build a Microsoft Visual C++ resource file\&.
+.RE
+.PP
+RCCOM
+.RS 4
+The command line used to build a Microsoft Visual C++ resource file\&.
+.RE
+.PP
+RCCOMSTR
+.RS 4
+The string displayed when invoking the resource compiler to build a Microsoft Visual C++ resource file\&. If this is not set, then
+\fB$RCCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+RCFLAGS
+.RS 4
+The flags passed to the resource compiler by the RES builder\&.
+.RE
+.PP
+RCINCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the command\-line options for specifying directories to be searched by the resource compiler\&. The value of
+\fB$RCINCFLAGS\fR
+is created by appending
+\fB$RCINCPREFIX\fR
+and
+\fB$RCINCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$CPPPATH\fR\&.
+.RE
+.PP
+RCINCPREFIX
+.RS 4
+The prefix (flag) used to specify an include directory on the resource compiler command line\&. This will be appended to the beginning of each directory in the
+\fB$CPPPATH\fR
+construction variable when the
+\fB$RCINCFLAGS\fR
+variable is expanded\&.
+.RE
+.PP
+RCINCSUFFIX
+.RS 4
+The suffix used to specify an include directory on the resource compiler command line\&. This will be appended to the end of each directory in the
+\fB$CPPPATH\fR
+construction variable when the
+\fB$RCINCFLAGS\fR
+variable is expanded\&.
+.RE
+.PP
+RCS
+.RS 4
+The RCS executable\&. Note that this variable is not actually used for the command to fetch source files from RCS; see the
+\fB$RCS_CO\fR
+construction variable, below\&.
+.RE
+.PP
+RCS_CO
+.RS 4
+The RCS "checkout" executable, used to fetch source files from RCS\&.
+.RE
+.PP
+RCS_COCOM
+.RS 4
+The command line used to fetch (checkout) source files from RCS\&.
+.RE
+.PP
+RCS_COCOMSTR
+.RS 4
+The string displayed when fetching a source file from RCS\&. If this is not set, then
+\fB$RCS_COCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+RCS_COFLAGS
+.RS 4
+Options that are passed to the
+\fB$RCS_CO\fR
+command\&.
+.RE
+.PP
+RDirs
+.RS 4
+A function that converts a string into a list of Dir instances by searching the repositories\&.
+.RE
+.PP
+REGSVR
+.RS 4
+The program used on Windows systems to register a newly\-built DLL library whenever the
+\fBSharedLibrary\fR
+builder is passed a keyword argument of
+register=1\&.
+.RE
+.PP
+REGSVRCOM
+.RS 4
+The command line used on Windows systems to register a newly\-built DLL library whenever the
+\fBSharedLibrary\fR
+builder is passed a keyword argument of
+register=1\&.
+.RE
+.PP
+REGSVRCOMSTR
+.RS 4
+The string displayed when registering a newly\-built DLL file\&. If this is not set, then
+\fB$REGSVRCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+REGSVRFLAGS
+.RS 4
+Flags passed to the DLL registration program on Windows systems when a newly\-built DLL library is registered\&. By default, this includes the
+\fB/s\fR
+that prevents dialog boxes from popping up and requiring user attention\&.
+.RE
+.PP
+RMIC
+.RS 4
+The Java RMI stub compiler\&.
+.RE
+.PP
+RMICCOM
+.RS 4
+The command line used to compile stub and skeleton class files from Java classes that contain RMI implementations\&. Any options specified in the
+\fB$RMICFLAGS\fR
+construction variable are included on this command line\&.
+.RE
+.PP
+RMICCOMSTR
+.RS 4
+The string displayed when compiling stub and skeleton class files from Java classes that contain RMI implementations\&. If this is not set, then
+\fB$RMICCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(RMICCOMSTR = "Generating stub/skeleton class files $TARGETS from $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+RMICFLAGS
+.RS 4
+General options passed to the Java RMI stub compiler\&.
+.RE
+.PP
+_RPATH
+.RS 4
+An automatically\-generated construction variable containing the rpath flags to be used when linking a program with shared libraries\&. The value of
+\fB$_RPATH\fR
+is created by appending
+\fB$RPATHPREFIX\fR
+and
+\fB$RPATHSUFFIX\fR
+to the beginning and end of each directory in
+\fB$RPATH\fR\&.
+.RE
+.PP
+RPATH
+.RS 4
+A list of paths to search for shared libraries when running programs\&. Currently only used in the GNU (gnulink), IRIX (sgilink) and Sun (sunlink) linkers\&. Ignored on platforms and toolchains that don\*(Aqt support it\&. Note that the paths added to RPATH are not transformed by
+scons
+in any way: if you want an absolute path, you must make it absolute yourself\&.
+.RE
+.PP
+RPATHPREFIX
+.RS 4
+The prefix used to specify a directory to be searched for shared libraries when running programs\&. This will be appended to the beginning of each directory in the
+\fB$RPATH\fR
+construction variable when the
+\fB$_RPATH\fR
+variable is automatically generated\&.
+.RE
+.PP
+RPATHSUFFIX
+.RS 4
+The suffix used to specify a directory to be searched for shared libraries when running programs\&. This will be appended to the end of each directory in the
+\fB$RPATH\fR
+construction variable when the
+\fB$_RPATH\fR
+variable is automatically generated\&.
+.RE
+.PP
+RPCGEN
+.RS 4
+The RPC protocol compiler\&.
+.RE
+.PP
+RPCGENCLIENTFLAGS
+.RS 4
+Options passed to the RPC protocol compiler when generating client side stubs\&. These are in addition to any flags specified in the
+\fB$RPCGENFLAGS\fR
+construction variable\&.
+.RE
+.PP
+RPCGENFLAGS
+.RS 4
+General options passed to the RPC protocol compiler\&.
+.RE
+.PP
+RPCGENHEADERFLAGS
+.RS 4
+Options passed to the RPC protocol compiler when generating a header file\&. These are in addition to any flags specified in the
+\fB$RPCGENFLAGS\fR
+construction variable\&.
+.RE
+.PP
+RPCGENSERVICEFLAGS
+.RS 4
+Options passed to the RPC protocol compiler when generating server side stubs\&. These are in addition to any flags specified in the
+\fB$RPCGENFLAGS\fR
+construction variable\&.
+.RE
+.PP
+RPCGENXDRFLAGS
+.RS 4
+Options passed to the RPC protocol compiler when generating XDR routines\&. These are in addition to any flags specified in the
+\fB$RPCGENFLAGS\fR
+construction variable\&.
+.RE
+.PP
+SCANNERS
+.RS 4
+A list of the available implicit dependency scanners\&. New file scanners may be added by appending to this list, although the more flexible approach is to associate scanners with a specific Builder\&. See the sections "Builder Objects" and "Scanner Objects," below, for more information\&.
+.RE
+.PP
+SCCS
+.RS 4
+The SCCS executable\&.
+.RE
+.PP
+SCCSCOM
+.RS 4
+The command line used to fetch source files from SCCS\&.
+.RE
+.PP
+SCCSCOMSTR
+.RS 4
+The string displayed when fetching a source file from a CVS repository\&. If this is not set, then
+\fB$SCCSCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SCCSFLAGS
+.RS 4
+General options that are passed to SCCS\&.
+.RE
+.PP
+SCCSGETFLAGS
+.RS 4
+Options that are passed specifically to the SCCS "get" subcommand\&. This can be set, for example, to
+\fB\-e\fR
+to check out editable files from SCCS\&.
+.RE
+.PP
+SCONS_HOME
+.RS 4
+The (optional) path to the SCons library directory, initialized from the external environment\&. If set, this is used to construct a shorter and more efficient search path in the
+\fB$MSVSSCONS\fR
+command line executed from Microsoft Visual Studio project files\&.
+.RE
+.PP
+SHCC
+.RS 4
+The C compiler used for generating shared\-library objects\&.
+.RE
+.PP
+SHCCCOM
+.RS 4
+The command line used to compile a C source file to a shared\-library object file\&. Any options specified in the
+\fB$SHCFLAGS\fR,
+\fB$SHCCFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+SHCCCOMSTR
+.RS 4
+The string displayed when a C source file is compiled to a shared object file\&. If this is not set, then
+\fB$SHCCCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(SHCCCOMSTR = "Compiling shared object $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SHCCFLAGS
+.RS 4
+Options that are passed to the C and C++ compilers to generate shared\-library objects\&.
+.RE
+.PP
+SHCFLAGS
+.RS 4
+Options that are passed to the C compiler (only; not C++) to generate shared\-library objects\&.
+.RE
+.PP
+SHCXX
+.RS 4
+The C++ compiler used for generating shared\-library objects\&.
+.RE
+.PP
+SHCXXCOM
+.RS 4
+The command line used to compile a C++ source file to a shared\-library object file\&. Any options specified in the
+\fB$SHCXXFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+SHCXXCOMSTR
+.RS 4
+The string displayed when a C++ source file is compiled to a shared object file\&. If this is not set, then
+\fB$SHCXXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(SHCXXCOMSTR = "Compiling shared object $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SHCXXFLAGS
+.RS 4
+Options that are passed to the C++ compiler to generate shared\-library objects\&.
+.RE
+.PP
+SHDC
+.RS 4
+SHDC\&.
+.RE
+.PP
+SHDCOM
+.RS 4
+SHDCOM\&.
+.RE
+.PP
+SHDLINK
+.RS 4
+SHDLINK\&.
+.RE
+.PP
+SHDLINKCOM
+.RS 4
+SHDLINKCOM\&.
+.RE
+.PP
+SHDLINKFLAGS
+.RS 4
+SHDLINKFLAGS\&.
+.RE
+.PP
+SHELL
+.RS 4
+A string naming the shell program that will be passed to the
+\fB$SPAWN\fR
+function\&. See the
+\fB$SPAWN\fR
+construction variable for more information\&.
+.RE
+.PP
+SHF03
+.RS 4
+The Fortran 03 compiler used for generating shared\-library objects\&. You should normally set the
+\fB$SHFORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$SHF03\fR
+if you need to use a specific compiler or compiler version for Fortran 03 files\&.
+.RE
+.PP
+SHF03COM
+.RS 4
+The command line used to compile a Fortran 03 source file to a shared\-library object file\&. You only need to set
+\fB$SHF03COM\fR
+if you need to use a specific command line for Fortran 03 files\&. You should normally set the
+\fB$SHFORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+SHF03COMSTR
+.RS 4
+The string displayed when a Fortran 03 source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHF03COM\fR
+or
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF03FLAGS
+.RS 4
+Options that are passed to the Fortran 03 compiler to generated shared\-library objects\&. You only need to set
+\fB$SHF03FLAGS\fR
+if you need to define specific user options for Fortran 03 files\&. You should normally set the
+\fB$SHFORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+SHF03PPCOM
+.RS 4
+The command line used to compile a Fortran 03 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHF03FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$SHF03PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 03 files\&. You should normally set the
+\fB$SHFORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+SHF03PPCOMSTR
+.RS 4
+The string displayed when a Fortran 03 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHF03PPCOM\fR
+or
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF08
+.RS 4
+The Fortran 08 compiler used for generating shared\-library objects\&. You should normally set the
+\fB$SHFORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$SHF08\fR
+if you need to use a specific compiler or compiler version for Fortran 08 files\&.
+.RE
+.PP
+SHF08COM
+.RS 4
+The command line used to compile a Fortran 08 source file to a shared\-library object file\&. You only need to set
+\fB$SHF08COM\fR
+if you need to use a specific command line for Fortran 08 files\&. You should normally set the
+\fB$SHFORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+SHF08COMSTR
+.RS 4
+The string displayed when a Fortran 08 source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHF08COM\fR
+or
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF08FLAGS
+.RS 4
+Options that are passed to the Fortran 08 compiler to generated shared\-library objects\&. You only need to set
+\fB$SHF08FLAGS\fR
+if you need to define specific user options for Fortran 08 files\&. You should normally set the
+\fB$SHFORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+SHF08PPCOM
+.RS 4
+The command line used to compile a Fortran 08 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHF08FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$SHF08PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 08 files\&. You should normally set the
+\fB$SHFORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+SHF08PPCOMSTR
+.RS 4
+The string displayed when a Fortran 08 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHF08PPCOM\fR
+or
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF77
+.RS 4
+The Fortran 77 compiler used for generating shared\-library objects\&. You should normally set the
+\fB$SHFORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$SHF77\fR
+if you need to use a specific compiler or compiler version for Fortran 77 files\&.
+.RE
+.PP
+SHF77COM
+.RS 4
+The command line used to compile a Fortran 77 source file to a shared\-library object file\&. You only need to set
+\fB$SHF77COM\fR
+if you need to use a specific command line for Fortran 77 files\&. You should normally set the
+\fB$SHFORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+SHF77COMSTR
+.RS 4
+The string displayed when a Fortran 77 source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHF77COM\fR
+or
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF77FLAGS
+.RS 4
+Options that are passed to the Fortran 77 compiler to generated shared\-library objects\&. You only need to set
+\fB$SHF77FLAGS\fR
+if you need to define specific user options for Fortran 77 files\&. You should normally set the
+\fB$SHFORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+SHF77PPCOM
+.RS 4
+The command line used to compile a Fortran 77 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHF77FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$SHF77PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 77 files\&. You should normally set the
+\fB$SHFORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+SHF77PPCOMSTR
+.RS 4
+The string displayed when a Fortran 77 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHF77PPCOM\fR
+or
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF90
+.RS 4
+The Fortran 90 compiler used for generating shared\-library objects\&. You should normally set the
+\fB$SHFORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$SHF90\fR
+if you need to use a specific compiler or compiler version for Fortran 90 files\&.
+.RE
+.PP
+SHF90COM
+.RS 4
+The command line used to compile a Fortran 90 source file to a shared\-library object file\&. You only need to set
+\fB$SHF90COM\fR
+if you need to use a specific command line for Fortran 90 files\&. You should normally set the
+\fB$SHFORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+SHF90COMSTR
+.RS 4
+The string displayed when a Fortran 90 source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHF90COM\fR
+or
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF90FLAGS
+.RS 4
+Options that are passed to the Fortran 90 compiler to generated shared\-library objects\&. You only need to set
+\fB$SHF90FLAGS\fR
+if you need to define specific user options for Fortran 90 files\&. You should normally set the
+\fB$SHFORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+SHF90PPCOM
+.RS 4
+The command line used to compile a Fortran 90 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHF90FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$SHF90PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 90 files\&. You should normally set the
+\fB$SHFORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+SHF90PPCOMSTR
+.RS 4
+The string displayed when a Fortran 90 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHF90PPCOM\fR
+or
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF95
+.RS 4
+The Fortran 95 compiler used for generating shared\-library objects\&. You should normally set the
+\fB$SHFORTRAN\fR
+variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
+\fB$SHF95\fR
+if you need to use a specific compiler or compiler version for Fortran 95 files\&.
+.RE
+.PP
+SHF95COM
+.RS 4
+The command line used to compile a Fortran 95 source file to a shared\-library object file\&. You only need to set
+\fB$SHF95COM\fR
+if you need to use a specific command line for Fortran 95 files\&. You should normally set the
+\fB$SHFORTRANCOM\fR
+variable, which specifies the default command line for all Fortran versions\&.
+.RE
+.PP
+SHF95COMSTR
+.RS 4
+The string displayed when a Fortran 95 source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHF95COM\fR
+or
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHF95FLAGS
+.RS 4
+Options that are passed to the Fortran 95 compiler to generated shared\-library objects\&. You only need to set
+\fB$SHF95FLAGS\fR
+if you need to define specific user options for Fortran 95 files\&. You should normally set the
+\fB$SHFORTRANFLAGS\fR
+variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
+.RE
+.PP
+SHF95PPCOM
+.RS 4
+The command line used to compile a Fortran 95 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHF95FLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&. You only need to set
+\fB$SHF95PPCOM\fR
+if you need to use a specific C\-preprocessor command line for Fortran 95 files\&. You should normally set the
+\fB$SHFORTRANPPCOM\fR
+variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
+.RE
+.PP
+SHF95PPCOMSTR
+.RS 4
+The string displayed when a Fortran 95 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHF95PPCOM\fR
+or
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHFORTRAN
+.RS 4
+The default Fortran compiler used for generating shared\-library objects\&.
+.RE
+.PP
+SHFORTRANCOM
+.RS 4
+The command line used to compile a Fortran source file to a shared\-library object file\&.
+.RE
+.PP
+SHFORTRANCOMSTR
+.RS 4
+The string displayed when a Fortran source file is compiled to a shared\-library object file\&. If this is not set, then
+\fB$SHFORTRANCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHFORTRANFLAGS
+.RS 4
+Options that are passed to the Fortran compiler to generate shared\-library objects\&.
+.RE
+.PP
+SHFORTRANPPCOM
+.RS 4
+The command line used to compile a Fortran source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
+\fB$SHFORTRANFLAGS\fR
+and
+\fB$CPPFLAGS\fR
+construction variables are included on this command line\&.
+.RE
+.PP
+SHFORTRANPPCOMSTR
+.RS 4
+The string displayed when a Fortran source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
+\fB$SHFORTRANPPCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SHLIBEMITTER
+.RS 4
+TODO
+.RE
+.PP
+SHLIBPREFIX
+.RS 4
+The prefix used for shared library file names\&.
+.RE
+.PP
+SHLIBSUFFIX
+.RS 4
+The suffix used for shared library file names\&.
+.RE
+.PP
+SHLIBVERSION
+.RS 4
+When this construction variable is defined, a versioned shared library is created\&. This modifies the
+\fB$SHLINKFLAGS\fR
+as required, adds the version number to the library name, and creates the symlinks that are needed\&.
+\fB$SHLIBVERSION\fR
+needs to be of the form X\&.Y\&.Z, where X and Y are numbers, and Z is a number but can also contain letters to designate alpha, beta, or release candidate patch levels\&.
+.RE
+.PP
+SHLINK
+.RS 4
+The linker for programs that use shared libraries\&.
+.RE
+.PP
+SHLINKCOM
+.RS 4
+The command line used to link programs using shared libraries\&.
+.RE
+.PP
+SHLINKCOMSTR
+.RS 4
+The string displayed when programs using shared libraries are linked\&. If this is not set, then
+\fB$SHLINKCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(SHLINKCOMSTR = "Linking shared $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SHLINKFLAGS
+.RS 4
+General user options passed to the linker for programs using shared libraries\&. Note that this variable should
+\fInot\fR
+contain
+\fB\-l\fR
+(or similar) options for linking with the libraries listed in
+\fB$LIBS\fR, nor
+\fB\-L\fR
+(or similar) include search path options that scons generates automatically from
+\fB$LIBPATH\fR\&. See
+\fB$_LIBFLAGS\fR
+above, for the variable that expands to library\-link options, and
+\fB$_LIBDIRFLAGS\fR
+above, for the variable that expands to library search path options\&.
+.RE
+.PP
+SHOBJPREFIX
+.RS 4
+The prefix used for shared object file names\&.
+.RE
+.PP
+SHOBJSUFFIX
+.RS 4
+The suffix used for shared object file names\&.
+.RE
+.PP
+SOURCE
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+SOURCE_URL
+.RS 4
+The URL (web address) of the location from which the project was retrieved\&. This is used to fill in the
+Source:
+field in the controlling information for Ipkg and RPM packages\&.
+.RE
+.PP
+SOURCES
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+SPAWN
+.RS 4
+A command interpreter function that will be called to execute command line strings\&. The function must expect the following arguments:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def spawn(shell, escape, cmd, args, env):
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+
+\fIsh\fR
+is a string naming the shell program to use\&.
+\fIescape\fR
+is a function that can be called to escape shell special characters in the command line\&.
+\fIcmd\fR
+is the path to the command to be executed\&.
+\fIargs\fR
+is the arguments to the command\&.
+\fIenv\fR
+is a dictionary of the environment variables in which the command should be executed\&.
+.RE
+.PP
+STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME
+.RS 4
+When this variable is true, static objects and shared objects are assumed to be the same; that is, SCons does not check for linking static objects into a shared library\&.
+.RE
+.PP
+SUBST_DICT
+.RS 4
+The dictionary used by the
+\fBSubstfile\fR
+or
+\fBTextfile\fR
+builders for substitution values\&. It can be anything acceptable to the dict() constructor, so in addition to a dictionary, lists of tuples are also acceptable\&.
+.RE
+.PP
+SUBSTFILEPREFIX
+.RS 4
+The prefix used for
+\fBSubstfile\fR
+file names, the null string by default\&.
+.RE
+.PP
+SUBSTFILESUFFIX
+.RS 4
+The suffix used for
+\fBSubstfile\fR
+file names, the null string by default\&.
+.RE
+.PP
+SUMMARY
+.RS 4
+A short summary of what the project is about\&. This is used to fill in the
+Summary:
+field in the controlling information for Ipkg and RPM packages, and as the
+Description:
+field in MSI packages\&.
+.RE
+.PP
+SWIG
+.RS 4
+The scripting language wrapper and interface generator\&.
+.RE
+.PP
+SWIGCFILESUFFIX
+.RS 4
+The suffix that will be used for intermediate C source files generated by the scripting language wrapper and interface generator\&. The default value is
+_wrap\fB$CFILESUFFIX\fR\&. By default, this value is used whenever the
+\fB\-c++\fR
+option is
+\fInot\fR
+specified as part of the
+\fB$SWIGFLAGS\fR
+construction variable\&.
+.RE
+.PP
+SWIGCOM
+.RS 4
+The command line used to call the scripting language wrapper and interface generator\&.
+.RE
+.PP
+SWIGCOMSTR
+.RS 4
+The string displayed when calling the scripting language wrapper and interface generator\&. If this is not set, then
+\fB$SWIGCOM\fR
+(the command line) is displayed\&.
+.RE
+.PP
+SWIGCXXFILESUFFIX
+.RS 4
+The suffix that will be used for intermediate C++ source files generated by the scripting language wrapper and interface generator\&. The default value is
+_wrap\fB$CFILESUFFIX\fR\&. By default, this value is used whenever the
+\-c++
+option is specified as part of the
+\fB$SWIGFLAGS\fR
+construction variable\&.
+.RE
+.PP
+SWIGDIRECTORSUFFIX
+.RS 4
+The suffix that will be used for intermediate C++ header files generated by the scripting language wrapper and interface generator\&. These are only generated for C++ code when the SWIG \*(Aqdirectors\*(Aq feature is turned on\&. The default value is
+_wrap\&.h\&.
+.RE
+.PP
+SWIGFLAGS
+.RS 4
+General options passed to the scripting language wrapper and interface generator\&. This is where you should set
+\fB\-python\fR,
+\fB\-perl5\fR,
+\fB\-tcl\fR, or whatever other options you want to specify to SWIG\&. If you set the
+\fB\-c++\fR
+option in this variable,
+scons
+will, by default, generate a C++ intermediate source file with the extension that is specified as the
+\fB$CXXFILESUFFIX\fR
+variable\&.
+.RE
+.PP
+_SWIGINCFLAGS
+.RS 4
+An automatically\-generated construction variable containing the SWIG command\-line options for specifying directories to be searched for included files\&. The value of
+\fB$_SWIGINCFLAGS\fR
+is created by appending
+\fB$SWIGINCPREFIX\fR
+and
+\fB$SWIGINCSUFFIX\fR
+to the beginning and end of each directory in
+\fB$SWIGPATH\fR\&.
+.RE
+.PP
+SWIGINCPREFIX
+.RS 4
+The prefix used to specify an include directory on the SWIG command line\&. This will be appended to the beginning of each directory in the
+\fB$SWIGPATH\fR
+construction variable when the
+\fB$_SWIGINCFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+SWIGINCSUFFIX
+.RS 4
+The suffix used to specify an include directory on the SWIG command line\&. This will be appended to the end of each directory in the
+\fB$SWIGPATH\fR
+construction variable when the
+\fB$_SWIGINCFLAGS\fR
+variable is automatically generated\&.
+.RE
+.PP
+SWIGOUTDIR
+.RS 4
+Specifies the output directory in which the scripting language wrapper and interface generator should place generated language\-specific files\&. This will be used by SCons to identify the files that will be generated by the
+swig
+call, and translated into the
+swig \-outdir
+option on the command line\&.
+.RE
+.PP
+SWIGPATH
+.RS 4
+The list of directories that the scripting language wrapper and interface generate will search for included files\&. The SWIG implicit dependency scanner will search these directories for include files\&. The default value is an empty list\&.
+.sp
+Don\*(Aqt explicitly put include directory arguments in SWIGFLAGS; the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in SWIGPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
+scons
+to look\-up a directory relative to the root of the source tree use #:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(SWIGPATH=\*(Aq#/include\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory look\-up can also be forced using the
+\fBDir\fR() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+include = Dir(\*(Aqinclude\*(Aq)
+env = Environment(SWIGPATH=include)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The directory list will be added to command lines through the automatically\-generated
+\fB$_SWIGINCFLAGS\fR
+construction variable, which is constructed by appending the values of the
+\fB$SWIGINCPREFIX\fR
+and
+\fB$SWIGINCSUFFIX\fR
+construction variables to the beginning and end of each directory in
+\fB$SWIGPATH\fR\&. Any command lines you define that need the SWIGPATH directory list should include
+\fB$_SWIGINCFLAGS\fR:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(SWIGCOM="my_swig \-o $TARGET $_SWIGINCFLAGS $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SWIGVERSION
+.RS 4
+The version number of the SWIG tool\&.
+.RE
+.PP
+TAR
+.RS 4
+The tar archiver\&.
+.RE
+.PP
+TARCOM
+.RS 4
+The command line used to call the tar archiver\&.
+.RE
+.PP
+TARCOMSTR
+.RS 4
+The string displayed when archiving files using the tar archiver\&. If this is not set, then
+\fB$TARCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(TARCOMSTR = "Archiving $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+TARFLAGS
+.RS 4
+General options passed to the tar archiver\&.
+.RE
+.PP
+TARGET
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+TARGET_ARCH
+.RS 4
+The name of the target hardware architecture for the compiled objects created by this Environment\&. This defaults to the value of HOST_ARCH, and the user can override it\&. Currently only set for Win32\&.
+.sp
+Sets the target architecture for Visual Studio compiler (i\&.e\&. the arch of the binaries generated by the compiler)\&. If not set, default to
+\fB$HOST_ARCH\fR, or, if that is unset, to the architecture of the running machine\*(Aqs OS (note that the python build or architecture has no effect)\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&. This is currently only used on Windows, but in the future it will be used on other OSes as well\&.
+.sp
+Valid values for Windows are
+x86,
+i386
+(for 32 bits);
+amd64,
+emt64,
+x86_64
+(for 64 bits); and
+ia64
+(Itanium)\&. For example, if you want to compile 64\-bit binaries, you would set
+TARGET_ARCH=\*(Aqx86_64\*(Aq
+in your SCons environment\&.
+.RE
+.PP
+TARGET_OS
+.RS 4
+The name of the target operating system for the compiled objects created by this Environment\&. This defaults to the value of HOST_OS, and the user can override it\&. Currently only set for Win32\&.
+.RE
+.PP
+TARGETS
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+TARSUFFIX
+.RS 4
+The suffix used for tar file names\&.
+.RE
+.PP
+TEMPFILEPREFIX
+.RS 4
+The prefix for a temporary file used to execute lines longer than $MAXLINELENGTH\&. The default is \*(Aq@\*(Aq\&. This may be set for toolchains that use other values, such as \*(Aq\-@\*(Aq for the diab compiler or \*(Aq\-via\*(Aq for ARM toolchain\&.
+.RE
+.PP
+TEX
+.RS 4
+The TeX formatter and typesetter\&.
+.RE
+.PP
+TEXCOM
+.RS 4
+The command line used to call the TeX formatter and typesetter\&.
+.RE
+.PP
+TEXCOMSTR
+.RS 4
+The string displayed when calling the TeX formatter and typesetter\&. If this is not set, then
+\fB$TEXCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(TEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+TEXFLAGS
+.RS 4
+General options passed to the TeX formatter and typesetter\&.
+.RE
+.PP
+TEXINPUTS
+.RS 4
+List of directories that the LaTeX program will search for include directories\&. The LaTeX implicit dependency scanner will search these directories for \einclude and \eimport files\&.
+.RE
+.PP
+TEXTFILEPREFIX
+.RS 4
+The prefix used for
+\fBTextfile\fR
+file names, the null string by default\&.
+.RE
+.PP
+TEXTFILESUFFIX
+.RS 4
+The suffix used for
+\fBTextfile\fR
+file names;
+\&.txt
+by default\&.
+.RE
+.PP
+TOOLS
+.RS 4
+A list of the names of the Tool specifications that are part of this construction environment\&.
+.RE
+.PP
+UNCHANGED_SOURCES
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+UNCHANGED_TARGETS
+.RS 4
+A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
+.RE
+.PP
+VENDOR
+.RS 4
+The person or organization who supply the packaged software\&. This is used to fill in the
+Vendor:
+field in the controlling information for RPM packages, and the
+Manufacturer:
+field in the controlling information for MSI packages\&.
+.RE
+.PP
+VERSION
+.RS 4
+The version of the project, specified as a string\&.
+.RE
+.PP
+WIN32_INSERT_DEF
+.RS 4
+A deprecated synonym for
+\fB$WINDOWS_INSERT_DEF\fR\&.
+.RE
+.PP
+WIN32DEFPREFIX
+.RS 4
+A deprecated synonym for
+\fB$WINDOWSDEFPREFIX\fR\&.
+.RE
+.PP
+WIN32DEFSUFFIX
+.RS 4
+A deprecated synonym for
+\fB$WINDOWSDEFSUFFIX\fR\&.
+.RE
+.PP
+WIN32EXPPREFIX
+.RS 4
+A deprecated synonym for
+\fB$WINDOWSEXPSUFFIX\fR\&.
+.RE
+.PP
+WIN32EXPSUFFIX
+.RS 4
+A deprecated synonym for
+\fB$WINDOWSEXPSUFFIX\fR\&.
+.RE
+.PP
+WINDOWS_EMBED_MANIFEST
+.RS 4
+Set this variable to True or 1 to embed the compiler\-generated manifest (normally
+${TARGET}\&.manifest) into all Windows exes and DLLs built with this environment, as a resource during their link step\&. This is done using
+\fB$MT\fR
+and
+\fB$MTEXECOM\fR
+and
+\fB$MTSHLIBCOM\fR\&.
+.RE
+.PP
+WINDOWS_INSERT_DEF
+.RS 4
+When this is set to true, a library build of a Windows shared library (\&.dll
+file) will also build a corresponding
+\&.def
+file at the same time, if a
+\&.def
+file is not already listed as a build target\&. The default is 0 (do not build a
+\&.def
+file)\&.
+.RE
+.PP
+WINDOWS_INSERT_MANIFEST
+.RS 4
+When this is set to true,
+scons
+will be aware of the
+\&.manifest
+files generated by Microsoft Visua C/C++ 8\&.
+.RE
+.PP
+WINDOWSDEFPREFIX
+.RS 4
+The prefix used for Windows
+\&.def
+file names\&.
+.RE
+.PP
+WINDOWSDEFSUFFIX
+.RS 4
+The suffix used for Windows
+\&.def
+file names\&.
+.RE
+.PP
+WINDOWSEXPPREFIX
+.RS 4
+The prefix used for Windows
+\&.exp
+file names\&.
+.RE
+.PP
+WINDOWSEXPSUFFIX
+.RS 4
+The suffix used for Windows
+\&.exp
+file names\&.
+.RE
+.PP
+WINDOWSPROGMANIFESTPREFIX
+.RS 4
+The prefix used for executable program
+\&.manifest
+files generated by Microsoft Visual C/C++\&.
+.RE
+.PP
+WINDOWSPROGMANIFESTSUFFIX
+.RS 4
+The suffix used for executable program
+\&.manifest
+files generated by Microsoft Visual C/C++\&.
+.RE
+.PP
+WINDOWSSHLIBMANIFESTPREFIX
+.RS 4
+The prefix used for shared library
+\&.manifest
+files generated by Microsoft Visual C/C++\&.
+.RE
+.PP
+WINDOWSSHLIBMANIFESTSUFFIX
+.RS 4
+The suffix used for shared library
+\&.manifest
+files generated by Microsoft Visual C/C++\&.
+.RE
+.PP
+X_IPK_DEPENDS
+.RS 4
+This is used to fill in the
+Depends:
+field in the controlling information for Ipkg packages\&.
+.RE
+.PP
+X_IPK_DESCRIPTION
+.RS 4
+This is used to fill in the
+Description:
+field in the controlling information for Ipkg packages\&. The default value is
+$SUMMARY\en$DESCRIPTION
+.RE
+.PP
+X_IPK_MAINTAINER
+.RS 4
+This is used to fill in the
+Maintainer:
+field in the controlling information for Ipkg packages\&.
+.RE
+.PP
+X_IPK_PRIORITY
+.RS 4
+This is used to fill in the
+Priority:
+field in the controlling information for Ipkg packages\&.
+.RE
+.PP
+X_IPK_SECTION
+.RS 4
+This is used to fill in the
+Section:
+field in the controlling information for Ipkg packages\&.
+.RE
+.PP
+X_MSI_LANGUAGE
+.RS 4
+This is used to fill in the
+Language:
+attribute in the controlling information for MSI packages\&.
+.RE
+.PP
+X_MSI_LICENSE_TEXT
+.RS 4
+The text of the software license in RTF format\&. Carriage return characters will be replaced with the RTF equivalent \e\epar\&.
+.RE
+.PP
+X_MSI_UPGRADE_CODE
+.RS 4
+TODO
+.RE
+.PP
+X_RPM_AUTOREQPROV
+.RS 4
+This is used to fill in the
+AutoReqProv:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_BUILD
+.RS 4
+internal, but overridable
+.RE
+.PP
+X_RPM_BUILDREQUIRES
+.RS 4
+This is used to fill in the
+BuildRequires:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_BUILDROOT
+.RS 4
+internal, but overridable
+.RE
+.PP
+X_RPM_CLEAN
+.RS 4
+internal, but overridable
+.RE
+.PP
+X_RPM_CONFLICTS
+.RS 4
+This is used to fill in the
+Conflicts:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_DEFATTR
+.RS 4
+This value is used as the default attributes for the files in the RPM package\&. The default value is
+(\-,root,root)\&.
+.RE
+.PP
+X_RPM_DISTRIBUTION
+.RS 4
+This is used to fill in the
+Distribution:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_EPOCH
+.RS 4
+This is used to fill in the
+Epoch:
+field in the controlling information for RPM packages\&.
+.RE
+.PP
+X_RPM_EXCLUDEARCH
+.RS 4
+This is used to fill in the
+ExcludeArch:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_EXLUSIVEARCH
+.RS 4
+This is used to fill in the
+ExclusiveArch:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_GROUP
+.RS 4
+This is used to fill in the
+Group:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_GROUP_lang
+.RS 4
+This is used to fill in the
+Group(lang):
+field in the RPM
+\&.spec
+file\&. Note that
+\fIlang\fR
+is not literal and should be replaced by the appropriate language code\&.
+.RE
+.PP
+X_RPM_ICON
+.RS 4
+This is used to fill in the
+Icon:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_INSTALL
+.RS 4
+internal, but overridable
+.RE
+.PP
+X_RPM_PACKAGER
+.RS 4
+This is used to fill in the
+Packager:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_POSTINSTALL
+.RS 4
+This is used to fill in the
+%post:
+section in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_POSTUNINSTALL
+.RS 4
+This is used to fill in the
+%postun:
+section in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_PREFIX
+.RS 4
+This is used to fill in the
+Prefix:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_PREINSTALL
+.RS 4
+This is used to fill in the
+%pre:
+section in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_PREP
+.RS 4
+internal, but overridable
+.RE
+.PP
+X_RPM_PREUNINSTALL
+.RS 4
+This is used to fill in the
+%preun:
+section in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_PROVIDES
+.RS 4
+This is used to fill in the
+Provides:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_REQUIRES
+.RS 4
+This is used to fill in the
+Requires:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_SERIAL
+.RS 4
+This is used to fill in the
+Serial:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+X_RPM_URL
+.RS 4
+This is used to fill in the
+Url:
+field in the RPM
+\&.spec
+file\&.
+.RE
+.PP
+XGETTEXT
+.RS 4
+Path to
+\fBxgettext(1)\fR
+program (found via
+\fBDetect()\fR)\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+XGETTEXTCOM
+.RS 4
+Complete xgettext command line\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+XGETTEXTCOMSTR
+.RS 4
+A string that is shown when
+\fBxgettext(1)\fR
+command is invoked (default:
+\*(Aq\*(Aq, which means "print
+\fB$XGETTEXTCOM\fR")\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+_XGETTEXTDOMAIN
+.RS 4
+Internal "macro"\&. Generates
+\fBxgettext\fR
+domain name form source and target (default:
+\*(Aq${TARGET\&.filebase}\*(Aq)\&.
+.RE
+.PP
+XGETTEXTFLAGS
+.RS 4
+Additional flags to
+\fBxgettext(1)\fR\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+XGETTEXTFROM
+.RS 4
+Name of file containing list of
+\fBxgettext(1)\fR\*(Aqs source files\&. Autotools\*(Aq users know this as
+POTFILES\&.in
+so they will in most cases set
+XGETTEXTFROM="POTFILES\&.in"
+here\&. The
+\fB$XGETTEXTFROM\fR
+files have same syntax and semantics as the well known GNU
+POTFILES\&.in\&. See
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+_XGETTEXTFROMFLAGS
+.RS 4
+Internal "macro"\&. Genrates list of
+\-D<dir>
+flags from the
+\fB$XGETTEXTPATH\fR
+list\&.
+.RE
+.PP
+XGETTEXTFROMPREFIX
+.RS 4
+This flag is used to add single
+\fB$XGETTEXTFROM\fR
+file to
+\fBxgettext(1)\fR\*(Aqs commandline (default:
+\*(Aq\-f\*(Aq)\&.
+.RE
+.PP
+XGETTEXTFROMSUFFIX
+.RS 4
+(default:
+\*(Aq\*(Aq)
+.RE
+.PP
+XGETTEXTPATH
+.RS 4
+List of directories, there
+\fBxgettext(1)\fR
+will look for source files (default:
+[])\&.
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBNote\fR
+.ps -1
+.br
+This variable works only together with
+\fB$XGETTEXTFROM\fR
+.sp .5v
+.RE
+See also
+xgettext
+tool and
+\fBPOTUpdate\fR
+builder\&.
+.RE
+.PP
+_XGETTEXTPATHFLAGS
+.RS 4
+Internal "macro"\&. Generates list of
+\-f<file>
+flags from
+\fB$XGETTEXTFROM\fR\&.
+.RE
+.PP
+XGETTEXTPATHPREFIX
+.RS 4
+This flag is used to add single search path to
+\fBxgettext(1)\fR\*(Aqs commandline (default:
+\*(Aq\-D\*(Aq)\&.
+.RE
+.PP
+XGETTEXTPATHSUFFIX
+.RS 4
+(default:
+\*(Aq\*(Aq)
+.RE
+.PP
+YACC
+.RS 4
+The parser generator\&.
+.RE
+.PP
+YACCCOM
+.RS 4
+The command line used to call the parser generator to generate a source file\&.
+.RE
+.PP
+YACCCOMSTR
+.RS 4
+The string displayed when generating a source file using the parser generator\&. If this is not set, then
+\fB$YACCCOM\fR
+(the command line) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(YACCCOMSTR = "Yacc\*(Aqing $TARGET from $SOURCES")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+YACCFLAGS
+.RS 4
+General options passed to the parser generator\&. If
+\fB$YACCFLAGS\fR
+contains a
+\fB\-d\fR
+option, SCons assumes that the call will also create a \&.h file (if the yacc source file ends in a \&.y suffix) or a \&.hpp file (if the yacc source file ends in a \&.yy suffix)
+.RE
+.PP
+YACCHFILESUFFIX
+.RS 4
+The suffix of the C header file generated by the parser generator when the
+\fB\-d\fR
+option is used\&. Note that setting this variable does not cause the parser generator to generate a header file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
+\&.h\&.
+.RE
+.PP
+YACCHXXFILESUFFIX
+.RS 4
+The suffix of the C++ header file generated by the parser generator when the
+\fB\-d\fR
+option is used\&. Note that setting this variable does not cause the parser generator to generate a header file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
+\&.hpp, except on Mac OS X, where the default is
+${TARGET\&.suffix}\&.h\&. because the default
+bison
+parser generator just appends
+\&.h
+to the name of the generated C++ file\&.
+.RE
+.PP
+YACCVCGFILESUFFIX
+.RS 4
+The suffix of the file containing the VCG grammar automaton definition when the
+\fB\-\-graph=\fR
+option is used\&. Note that setting this variable does not cause the parser generator to generate a VCG file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
+\&.vcg\&.
+.RE
+.PP
+ZIP
+.RS 4
+The zip compression and file packaging utility\&.
+.RE
+.PP
+ZIPCOM
+.RS 4
+The command line used to call the zip utility, or the internal Python function used to create a zip archive\&.
+.RE
+.PP
+ZIPCOMPRESSION
+.RS 4
+The
+\fIcompression\fR
+flag from the Python
+zipfile
+module used by the internal Python function to control whether the zip archive is compressed or not\&. The default value is
+zipfile\&.ZIP_DEFLATED, which creates a compressed zip archive\&. This value has no effect if the
+zipfile
+module is unavailable\&.
+.RE
+.PP
+ZIPCOMSTR
+.RS 4
+The string displayed when archiving files using the zip utility\&. If this is not set, then
+\fB$ZIPCOM\fR
+(the command line or internal Python function) is displayed\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(ZIPCOMSTR = "Zipping $TARGET")
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ZIPFLAGS
+.RS 4
+General options passed to the zip utility\&.
+.RE
+.PP
+ZIPROOT
+.RS 4
+An optional zip root directory (default empty)\&. The filenames stored in the zip file will be relative to this directory, if given\&. Otherwise the filenames are relative to the current directory of the command\&. For instance:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.Zip(\*(Aqfoo\&.zip\*(Aq, \*(Aqsubdir1/subdir2/file1\*(Aq, ZIPROOT=\*(Aqsubdir1\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+will produce a zip file
+foo\&.zip
+containing a file with the name
+subdir2/file1
+rather than
+subdir1/subdir2/file1\&.
+.RE
+.PP
+ZIPSUFFIX
+.RS 4
+The suffix used for zip file names\&.
+.RE
+.PP
+Construction variables can be retrieved and set using the
+\fBDictionary\fR
+method of the construction environment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+dict = env\&.Dictionary()
+dict["CC"] = "cc"
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or using the [] operator:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env["CC"] = "cc"
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Construction variables can also be passed to the construction environment constructor:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CC="cc")
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or when copying a construction environment using the
+\fBClone\fR
+method:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env2 = env\&.Clone(CC="cl\&.exe")
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Configure Contexts"
+.PP
+\fBscons\fR
+supports
+\fIconfigure contexts,\fR
+an integrated mechanism similar to the various AC_CHECK macros in GNU autoconf for testing for the existence of C header files, libraries, etc\&. In contrast to autoconf,
+\fBscons\fR
+does not maintain an explicit cache of the tested values, but uses its normal dependency tracking to keep the checked values up to date\&. However, users may override this behaviour with the
+\fB\-\-config\fR
+command line option\&.
+.PP
+The following methods can be used to perform checks:
+.PP
+Configure(\fIenv\fR, [\fIcustom_tests\fR, \fIconf_dir\fR, \fIlog_file\fR, \fIconfig_h\fR, \fIclean\fR, \fIhelp])\fR, env\&.Configure([\fIcustom_tests\fR, \fIconf_dir\fR, \fIlog_file\fR, \fIconfig_h\fR, \fIclean\fR, \fIhelp])\fR
+.RS 4
+This creates a configure context, which can be used to perform checks\&.
+\fIenv\fR
+specifies the environment for building the tests\&. This environment may be modified when performing checks\&.
+\fIcustom_tests\fR
+is a dictionary containing custom tests\&. See also the section about custom tests below\&. By default, no custom tests are added to the configure context\&.
+\fIconf_dir\fR
+specifies a directory where the test cases are built\&. Note that this directory is not used for building normal targets\&. The default value is the directory #/\&.sconf_temp\&.
+\fIlog_file\fR
+specifies a file which collects the output from commands that are executed to check for the existence of header files, libraries, etc\&. The default is the file #/config\&.log\&. If you are using the
+\fBVariantDir\fR() method, you may want to specify a subdirectory under your variant directory\&.
+\fIconfig_h\fR
+specifies a C header file where the results of tests will be written, e\&.g\&. #define HAVE_STDIO_H, #define HAVE_LIBM, etc\&. The default is to not write a
+\fBconfig\&.h\fR
+file\&. You can specify the same
+\fBconfig\&.h\fR
+file in multiple calls to Configure, in which case
+\fBscons\fR
+will concatenate all results in the specified file\&. Note that SCons uses its normal dependency checking to decide if it\*(Aqs necessary to rebuild the specified
+\fIconfig_h\fR
+file\&. This means that the file is not necessarily re\-built each time scons is run, but is only rebuilt if its contents will have changed and some target that depends on the
+\fIconfig_h\fR
+file is being built\&.
+.sp
+The optional
+\fBclean\fR
+and
+\fBhelp\fR
+arguments can be used to suppress execution of the configuration tests when the
+\fB\-c/\-\-clean\fR
+or
+\fB\-H/\-h/\-\-help\fR
+options are used, respectively\&. The default behavior is always to execute configure context tests, since the results of the tests may affect the list of targets to be cleaned or the help text\&. If the configure tests do not affect these, then you may add the
+\fBclean=False\fR
+or
+\fBhelp=False\fR
+arguments (or both) to avoid unnecessary test execution\&.
+.RE
+.PP
+A created
+\fBConfigure\fR
+instance has the following associated methods:
+.PP
+SConf\&.Finish(\fIcontext\fR), \fIsconf\fR\&.Finish()
+.RS 4
+This method should be called after configuration is done\&. It returns the environment as modified by the configuration checks performed\&. After this method is called, no further checks can be performed with this configuration context\&. However, you can create a new Configure context to perform additional checks\&. Only one context should be active at a time\&.
+.sp
+The following Checks are predefined\&. (This list will likely grow larger as time goes by and developers contribute new useful tests\&.)
+.RE
+.PP
+SConf\&.CheckHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckHeader(\fIheader\fR, [\fIinclude_quotes\fR, \fIlanguage\fR])
+.RS 4
+Checks if
+\fIheader\fR
+is usable in the specified language\&.
+\fIheader\fR
+may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
+\fB#include\fR
+lines should precede the header line being checked for\&. The optional argument
+\fIinclude_quotes\fR
+must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote\&. By default, both characters are " (double quote)\&. The optional argument
+\fIlanguage\fR
+should be either
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check\&. Returns 1 on success and 0 on failure\&.
+.RE
+.PP
+SConf\&.CheckCHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR]), \fIsconf\fR\&.CheckCHeader(\fIheader\fR, [\fIinclude_quotes\fR])
+.RS 4
+This is a wrapper around
+\fBSConf\&.CheckHeader\fR
+which checks if
+\fIheader\fR
+is usable in the C language\&.
+\fIheader\fR
+may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
+\fB#include\fR
+lines should precede the header line being checked for\&. The optional argument
+\fIinclude_quotes\fR
+must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote (both default to \eN\*(Aq34\*(Aq)\&. Returns 1 on success and 0 on failure\&.
+.RE
+.PP
+SConf\&.CheckCXXHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR]), \fIsconf\fR\&.CheckCXXHeader(\fIheader\fR, [\fIinclude_quotes\fR])
+.RS 4
+This is a wrapper around
+\fBSConf\&.CheckHeader\fR
+which checks if
+\fIheader\fR
+is usable in the C++ language\&.
+\fIheader\fR
+may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
+\fB#include\fR
+lines should precede the header line being checked for\&. The optional argument
+\fIinclude_quotes\fR
+must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote (both default to \eN\*(Aq34\*(Aq)\&. Returns 1 on success and 0 on failure\&.
+.RE
+.PP
+SConf\&.CheckFunc(\fIcontext,\fR, \fIfunction_name\fR, [\fIheader\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckFunc(\fIfunction_name\fR, [\fIheader\fR, \fIlanguage\fR])
+.RS 4
+Checks if the specified C or C++ function is available\&.
+\fIfunction_name\fR
+is the name of the function to check for\&. The optional
+\fIheader\fR
+argument is a string that will be placed at the top of the test file that will be compiled to check if the function exists; the default is:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+#ifdef __cplusplus
+extern "C"
+#endif
+char function_name();
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The optional
+\fIlanguage\fR
+argument should be
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check; the default is "C"\&.
+.RE
+.PP
+SConf\&.CheckLib(\fIcontext\fR, [\fIlibrary\fR, \fIsymbol\fR, \fIheader\fR, \fIlanguage\fR, \fIautoadd=1\fR]), \fIsconf\fR\&.CheckLib([\fIlibrary\fR, \fIsymbol\fR, \fIheader\fR, \fIlanguage\fR, \fIautoadd=1\fR])
+.RS 4
+Checks if
+\fIlibrary\fR
+provides
+\fIsymbol\fR\&. If the value of
+\fIautoadd\fR
+is 1 and the library provides the specified
+\fIsymbol\fR, appends the library to the LIBS construction environment variable\&.
+\fIlibrary\fR
+may also be None (the default), in which case
+\fIsymbol\fR
+is checked with the current LIBS variable, or a list of library names, in which case each library in the list will be checked for
+\fIsymbol\fR\&. If
+\fIsymbol\fR
+is not set or is
+\fBNone\fR, then
+\fBSConf\&.CheckLib\fR() just checks if you can link against the specified
+\fIlibrary\fR\&. The optional
+\fIlanguage\fR
+argument should be
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check; the default is "C"\&. The default value for
+\fIautoadd\fR
+is 1\&. This method returns 1 on success and 0 on error\&.
+.RE
+.PP
+SConf\&.CheckLibWithHeader(\fIcontext\fR, \fIlibrary\fR, \fIheader\fR, \fIlanguage\fR, [\fIcall\fR, \fIautoadd\fR]), \fIsconf\fR\&.CheckLibWithHeader(\fIlibrary\fR, \fIheader\fR, \fIlanguage\fR, [\fIcall\fR, \fIautoadd\fR])
+.RS 4
+In contrast to the SConf\&.CheckLib call, this call provides a more sophisticated way to check against libraries\&. Again,
+\fIlibrary\fR
+specifies the library or a list of libraries to check\&.
+\fIheader\fR
+specifies a header to check for\&.
+\fIheader\fR
+may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
+\fB#include\fR
+lines should precede the header line being checked for\&.
+\fIlanguage\fR
+may be one of \*(AqC\*(Aq,\*(Aqc\*(Aq,\*(AqCXX\*(Aq,\*(Aqcxx\*(Aq,\*(AqC++\*(Aq and \*(Aqc++\*(Aq\&.
+\fIcall\fR
+can be any valid expression (with a trailing \*(Aq;\*(Aq)\&. If
+\fIcall\fR
+is not set, the default simply checks that you can link against the specified
+\fIlibrary\fR\&.
+\fIautoadd\fR
+specifies whether to add the library to the environment (only if the check succeeds)\&. This method returns 1 on success and 0 on error\&.
+.RE
+.PP
+SConf\&.CheckType(\fIcontext\fR, \fItype_name\fR, [\fIincludes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckType(\fItype_name\fR, [\fIincludes\fR, \fIlanguage\fR])
+.RS 4
+Checks for the existence of a type defined by
+\fBtypedef\fR\&.
+\fItype_name\fR
+specifies the typedef name to check for\&.
+\fIincludes\fR
+is a string containing one or more
+\fB#include\fR
+lines that will be inserted into the program that will be run to test for the existence of the type\&. The optional
+\fIlanguage\fR
+argument should be
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check; the default is "C"\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+sconf\&.CheckType(\*(Aqfoo_type\*(Aq, \*(Aq#include "my_types\&.h"\*(Aq, \*(AqC++\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Configure\&.CheckCC(\fIself\fR)
+.RS 4
+Checks whether the C compiler (as defined by the CC construction variable) works by trying to compile a small source file\&.
+.sp
+By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
+.sp
+This uses the exact same command than the one used by the object builder for C source file, so it can be used to detect if a particular compiler flag works or not\&.
+.RE
+.PP
+Configure\&.CheckCXX(\fIself\fR)
+.RS 4
+Checks whether the C++ compiler (as defined by the CXX construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
+.sp
+This uses the exact same command than the one used by the object builder for CXX source files, so it can be used to detect if a particular compiler flag works or not\&.
+.RE
+.PP
+Configure\&.CheckSHCC(\fIself\fR)
+.RS 4
+Checks whether the C compiler (as defined by the SHCC construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
+.sp
+This uses the exact same command than the one used by the object builder for C source file, so it can be used to detect if a particular compiler flag works or not\&. This does not check whether the object code can be used to build a shared library, only that the compilation (not link) succeeds\&.
+.RE
+.PP
+Configure\&.CheckSHCXX(\fIself\fR)
+.RS 4
+Checks whether the C++ compiler (as defined by the SHCXX construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
+.sp
+This uses the exact same command than the one used by the object builder for CXX source files, so it can be used to detect if a particular compiler flag works or not\&. This does not check whether the object code can be used to build a shared library, only that the compilation (not link) succeeds\&.
+.RE
+.PP
+Example of a typical Configure usage:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+conf = Configure( env )
+if not conf\&.CheckCHeader( \*(Aqmath\&.h\*(Aq ):
+ print \*(AqWe really need math\&.h!\*(Aq
+ Exit(1)
+if conf\&.CheckLibWithHeader( \*(Aqqt\*(Aq, \*(Aqqapp\&.h\*(Aq, \*(Aqc++\*(Aq,
+ \*(AqQApplication qapp(0,0);\*(Aq ):
+ # do stuff for qt \- usage, e\&.g\&.
+ conf\&.env\&.Append( CPPFLAGS = \*(Aq\-DWITH_QT\*(Aq )
+env = conf\&.Finish()
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+SConf\&.CheckTypeSize(\fIcontext\fR, \fItype_name\fR, [\fIheader\fR, \fIlanguage\fR, \fIexpect\fR]), \fIsconf\fR\&.CheckTypeSize(\fItype_name\fR, [\fIheader\fR, \fIlanguage\fR, \fIexpect\fR])
+.RS 4
+Checks for the size of a type defined by
+\fBtypedef\fR\&.
+\fItype_name\fR
+specifies the typedef name to check for\&. The optional
+\fIheader\fR
+argument is a string that will be placed at the top of the test file that will be compiled to check if the function exists; the default is empty\&. The optional
+\fIlanguage\fR
+argument should be
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check; the default is "C"\&. The optional
+\fIexpect\fR
+argument should be an integer\&. If this argument is used, the function will only check whether the type given in type_name has the expected size (in bytes)\&. For example,
+\fBCheckTypeSize(\*(Aqshort\*(Aq, expect = 2)\fR
+will return success only if short is two bytes\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+SConf\&.CheckDeclaration(\fIcontext\fR, \fIsymbol\fR, [\fIincludes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckDeclaration(\fIsymbol\fR, [\fIincludes\fR, \fIlanguage\fR])
+.RS 4
+Checks if the specified
+\fIsymbol\fR
+is declared\&.
+\fIincludes\fR
+is a string containing one or more
+\fB#include\fR
+lines that will be inserted into the program that will be run to test for the existence of the type\&. The optional
+\fIlanguage\fR
+argument should be
+\fBC\fR
+or
+\fBC++\fR
+and selects the compiler to be used for the check; the default is "C"\&.
+.RE
+.PP
+SConf\&.Define(\fIcontext\fR, \fIsymbol\fR, [\fIvalue\fR, \fIcomment\fR]), \fIsconf\fR\&.Define(\fIsymbol\fR, [\fIvalue\fR, \fIcomment\fR])
+.RS 4
+This function does not check for anything, but defines a preprocessor symbol that will be added to the configuration header file\&. It is the equivalent of AC_DEFINE, and defines the symbol
+\fIname\fR
+with the optional
+\fBvalue\fR
+and the optional comment
+\fBcomment\fR\&.
+.RE
+.PP
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+conf = Configure( env )
+
+# Puts the following line in the config header file:
+# #define A_SYMBOL
+conf\&.Define(\*(AqA_SYMBOL\*(Aq)
+
+# Puts the following line in the config header file:
+# #define A_SYMBOL 1
+conf\&.Define(\*(AqA_SYMBOL\*(Aq, 1)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Be careful about quoting string values, though:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+conf = Configure( env )
+
+# Puts the following line in the config header file:
+# #define A_SYMBOL YA
+conf\&.Define(\*(AqA_SYMBOL\*(Aq, "YA")
+
+# Puts the following line in the config header file:
+# #define A_SYMBOL "YA"
+conf\&.Define(\*(AqA_SYMBOL\*(Aq, \*(Aq"YA"\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+For comment:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+conf = Configure( env )
+
+# Puts the following lines in the config header file:
+# /* Set to 1 if you have a symbol */
+# #define A_SYMBOL 1
+conf\&.Define(\*(AqA_SYMBOL\*(Aq, 1, \*(AqSet to 1 if you have a symbol\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+You can define your own custom checks\&. in addition to the predefined checks\&. These are passed in a dictionary to the Configure function\&. This dictionary maps the names of the checks to user defined Python callables (either Python functions or class instances implementing the
+\fI__call__\fR
+method)\&. The first argument of the call is always a
+\fICheckContext\fR
+instance followed by the arguments, which must be supplied by the user of the check\&. These CheckContext instances define the following methods:
+.PP
+CheckContext\&.Message(\fIself\fR, \fItext\fR)
+.RS 4
+Usually called before the check is started\&.
+\fItext\fR
+will be displayed to the user, e\&.g\&. \*(AqChecking for library X\&.\&.\&.\*(Aq
+.RE
+.PP
+CheckContext\&.Result(\fIself,\fR, \fIres\fR)
+.RS 4
+Usually called after the check is done\&.
+\fIres\fR
+can be either an integer or a string\&. In the former case, \*(Aqyes\*(Aq (res != 0) or \*(Aqno\*(Aq (res == 0) is displayed to the user, in the latter case the given string is displayed\&.
+.RE
+.PP
+CheckContext\&.TryCompile(\fIself\fR, \fItext\fR, \fIextension\fR)
+.RS 4
+Checks if a file with the specified
+\fIextension\fR
+(e\&.g\&. \*(Aq\&.c\*(Aq) containing
+\fItext\fR
+can be compiled using the environment\*(Aqs
+\fBObject\fR
+builder\&. Returns 1 on success and 0 on failure\&.
+.RE
+.PP
+CheckContext\&.TryLink(\fIself\fR, \fItext\fR, \fIextension\fR)
+.RS 4
+Checks, if a file with the specified
+\fIextension\fR
+(e\&.g\&. \*(Aq\&.c\*(Aq) containing
+\fItext\fR
+can be compiled using the environment\*(Aqs
+\fBProgram\fR
+builder\&. Returns 1 on success and 0 on failure\&.
+.RE
+.PP
+CheckContext\&.TryRun(\fIself\fR, \fItext\fR, \fIextension\fR)
+.RS 4
+Checks, if a file with the specified
+\fIextension\fR
+(e\&.g\&. \*(Aq\&.c\*(Aq) containing
+\fItext\fR
+can be compiled using the environment\*(Aqs
+\fBProgram\fR
+builder\&. On success, the program is run\&. If the program executes successfully (that is, its return status is 0), a tuple
+\fI(1, outputStr)\fR
+is returned, where
+\fIoutputStr\fR
+is the standard output of the program\&. If the program fails execution (its return status is non\-zero), then (0, \*(Aq\*(Aq) is returned\&.
+.RE
+.PP
+CheckContext\&.TryAction(\fIself\fR, \fIaction\fR, [\fItext\fR, \fIextension\fR])
+.RS 4
+Checks if the specified
+\fIaction\fR
+with an optional source file (contents
+\fItext\fR
+, extension
+\fIextension\fR
+= \*(Aq\*(Aq ) can be executed\&.
+\fIaction\fR
+may be anything which can be converted to a
+\fBscons\fR
+Action\&. On success,
+\fI(1, outputStr)\fR
+is returned, where
+\fIoutputStr\fR
+is the content of the target file\&. On failure
+\fI(0, \*(Aq\*(Aq)\fR
+is returned\&.
+.RE
+.PP
+CheckContext\&.TryBuild(\fIself\fR, \fIbuilder\fR, [\fItext\fR, \fIextension\fR])
+.RS 4
+Low level implementation for testing specific builds; the methods above are based on this method\&. Given the Builder instance
+\fIbuilder\fR
+and the optional
+\fItext\fR
+of a source file with optional
+\fIextension\fR, this method returns 1 on success and 0 on failure\&. In addition,
+\fIself\&.lastTarget\fR
+is set to the build target node, if the build was successful\&.
+.RE
+.PP
+Example for implementing and using custom tests:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def CheckQt(context, qtdir):
+ context\&.Message( \*(AqChecking for qt \&.\&.\&.\*(Aq )
+ lastLIBS = context\&.env[\*(AqLIBS\*(Aq]
+ lastLIBPATH = context\&.env[\*(AqLIBPATH\*(Aq]
+ lastCPPPATH= context\&.env[\*(AqCPPPATH\*(Aq]
+ context\&.env\&.Append(LIBS = \*(Aqqt\*(Aq, LIBPATH = qtdir + \*(Aq/lib\*(Aq, CPPPATH = qtdir + \*(Aq/include\*(Aq )
+ ret = context\&.TryLink("""
+#include <qapp\&.h>
+int main(int argc, char **argv) {
+ QApplication qapp(argc, argv);
+ return 0;
+}
+""")
+ if not ret:
+ context\&.env\&.Replace(LIBS = lastLIBS, LIBPATH=lastLIBPATH, CPPPATH=lastCPPPATH)
+ context\&.Result( ret )
+ return ret
+
+env = Environment()
+conf = Configure( env, custom_tests = { \*(AqCheckQt\*(Aq : CheckQt } )
+if not conf\&.CheckQt(\*(Aq/usr/lib/qt\*(Aq):
+ print \*(AqWe really need qt!\*(Aq
+ Exit(1)
+env = conf\&.Finish()
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Command\-Line Construction Variables"
+.PP
+Often when building software, some variables must be specified at build time\&. For example, libraries needed for the build may be in non\-standard locations, or site\-specific compiler options may need to be passed to the compiler\&.
+\fBscons\fR
+provides a
+\fBVariables\fR
+object to support overriding construction variables on the command line:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons VARIABLE=foo
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The variable values can also be specified in a text\-based SConscript file\&. To create a Variables object, call the Variables() function:
+.PP
+Variables([\fIfiles\fR], [\fIargs\fR])
+.RS 4
+This creates a Variables object that will read construction variables from the file or list of filenames specified in
+\fIfiles\fR\&. If no files are specified, or the
+\fIfiles\fR
+argument is
+\fBNone\fR, then no files will be read\&. The optional argument
+\fIargs\fR
+is a dictionary of values that will override anything read from the specified files; it is primarily intended to be passed the
+\fBARGUMENTS\fR
+dictionary that holds variables specified on the command line\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+vars = Variables(\*(Aqcustom\&.py\*(Aq)
+vars = Variables(\*(Aqoverrides\&.py\*(Aq, ARGUMENTS)
+vars = Variables(None, {FOO:\*(Aqexpansion\*(Aq, BAR:7})
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Variables objects have the following methods:
+.RE
+.PP
+Add(\fIkey\fR, [\fIhelp\fR, \fIdefault\fR, \fIvalidator\fR, \fIconverter\fR])
+.RS 4
+This adds a customizable construction variable to the Variables object\&.
+\fIkey\fR
+is the name of the variable\&.
+\fIhelp\fR
+is the help text for the variable\&.
+\fIdefault\fR
+is the default value of the variable; if the default value is
+\fBNone\fR
+and there is no explicit value specified, the construction variable will
+\fInot\fR
+be added to the construction environment\&.
+\fIvalidator\fR
+is called to validate the value of the variable, and should take three arguments: key, value, and environment\&. The recommended way to handle an invalid value is to raise an exception (see example below)\&.
+\fIconverter\fR
+is called to convert the value before putting it in the environment, and should take either a value, or the value and environment, as parameters\&. The
+\fIconverter\fR
+must return a value, which will be converted into a string before being validated by the
+\fIvalidator\fR
+(if any) and then added to the environment\&.
+.sp
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+vars\&.Add(\*(AqCC\*(Aq, \*(AqThe C compiler\*(Aq)
+
+def validate_color(key, val, env):
+ if not val in [\*(Aqred\*(Aq, \*(Aqblue\*(Aq, \*(Aqyellow\*(Aq]:
+ raise Exception("Invalid color value \*(Aq%s\*(Aq" % val)
+vars\&.Add(\*(AqCOLOR\*(Aq, validator=valid_color)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+AddVariables(\fIlist\fR)
+.RS 4
+A wrapper script that adds multiple customizable construction variables to a Variables object\&.
+\fIlist\fR
+is a list of tuple or list objects that contain the arguments for an individual call to the
+\fBAdd\fR
+method\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+opt\&.AddVariables(
+ (\*(Aqdebug\*(Aq, \*(Aq\*(Aq, 0),
+ (\*(AqCC\*(Aq, \*(AqThe C compiler\*(Aq),
+ (\*(AqVALIDATE\*(Aq, \*(AqAn option for testing validation\*(Aq,
+ \*(Aqnotset\*(Aq, validator, None),
+ )
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Update(\fIenv\fR, [\fIargs\fR])
+.RS 4
+This updates a construction environment
+\fIenv\fR
+with the customized construction variables\&. Any specified variables that are
+\fInot\fR
+configured for the Variables object will be saved and may be retrieved with the
+\fBUnknownVariables\fR() method, below\&.
+.sp
+Normally this method is not called directly, but is called indirectly by passing the Variables object to the Environment() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(variables=vars)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+The text file(s) that were specified when the Variables object was created are executed as Python scripts, and the values of (global) Python variables set in the file are added to the construction environment\&.
+.PP
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+CC = \*(Aqmy_cc\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+UnknownVariables(\fI)\fR
+.RS 4
+Returns a dictionary containing any variables that were specified either in the files or the dictionary with which the Variables object was initialized, but for which the Variables object was not configured\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(variables=vars)
+for key, value in vars\&.UnknownVariables():
+ print "unknown variable: %s=%s" % (key, value)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Save(\fIfilename\fR, \fIenv\fR)
+.RS 4
+This saves the currently set variables into a script file named
+\fIfilename\fR
+that can be used on the next invocation to automatically load the current settings\&. This method combined with the Variables method can be used to support caching of variables between runs\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+vars = Variables([\*(Aqvariables\&.cache\*(Aq, \*(Aqcustom\&.py\*(Aq])
+vars\&.Add(\&.\&.\&.)
+vars\&.Update(env)
+vars\&.Save(\*(Aqvariables\&.cache\*(Aq, env)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+GenerateHelpText(\fIenv\fR, [\fIsort\fR])
+.RS 4
+This generates help text documenting the customizable construction variables suitable to passing in to the Help() function\&.
+\fIenv\fR
+is the construction environment that will be used to get the actual values of customizable variables\&. Calling with an optional
+\fIsort\fR
+function will cause the output to be sorted by the specified argument\&. The specific
+\fIsort\fR
+function should take two arguments and return \-1, 0 or 1 (like the standard Python
+\fIcmp\fR
+function)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Help(vars\&.GenerateHelpText(env))
+Help(vars\&.GenerateHelpText(env, sort=cmp))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+FormatVariableHelpText(\fIenv\fR, \fIopt\fR, \fIhelp\fR, \fIdefault\fR, \fIactual\fR)
+.RS 4
+This method returns a formatted string containing the printable help text for one option\&. It is normally not called directly, but is called by the
+\fIGenerateHelpText\fR() method to create the returned help text\&. It may be overridden with your own function that takes the arguments specified above and returns a string of help text formatted to your liking\&. Note that the
+\fIGenerateHelpText\fR() will not put any blank lines or extra characters in between the entries, so you must add those characters to the returned string if you want the entries separated\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def my_format(env, opt, help, default, actual):
+ fmt = "\en%s: default=%s actual=%s (%s)\en"
+ return fmt % (opt, default\&. actual, help)
+vars\&.FormatVariableHelpText = my_format
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+To make it more convenient to work with customizable Variables,
+\fBscons\fR
+provides a number of functions that make it easy to set up various types of Variables:
+.RE
+.PP
+BoolVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR)
+.RS 4
+Return a tuple of arguments to set up a Boolean option\&. The option will use the specified name
+\fIkey\fR, have a default value of
+\fIdefault\fR, and display the specified
+\fIhelp\fR
+text\&. The option will interpret the values
+\fBy\fR,
+\fByes\fR,
+\fBt\fR,
+\fBtrue\fR,
+1,
+\fBon\fR
+and
+\fBall\fR
+as true, and the values
+\fBn\fR,
+\fBno\fR,
+\fBf\fR,
+\fBfalse\fR,
+0,
+\fBoff\fR
+and
+\fBnone\fR
+as false\&.
+.RE
+.PP
+EnumVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, \fIallowed_values\fR, [\fImap\fR, \fIignorecase\fR])
+.RS 4
+Return a tuple of arguments to set up an option whose value may be one of a specified list of legal enumerated values\&. The option will use the specified name
+\fIkey\fR, have a default value of
+\fIdefault\fR, and display the specified
+\fIhelp\fR
+text\&. The option will only support those values in the
+\fIallowed_values\fR
+list\&. The optional
+\fImap\fR
+argument is a dictionary that can be used to convert input values into specific legal values in the
+\fIallowed_values\fR
+list\&. If the value of
+\fIignore_case\fR
+is
+0
+(the default), then the values are case\-sensitive\&. If the value of
+\fIignore_case\fR
+is
+1, then values will be matched case\-insensitive\&. If the value of
+\fIignore_case\fR
+is
+2, then values will be matched case\-insensitive, and all input values will be converted to lower case\&.
+.RE
+.PP
+ListVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, \fInames\fR, [\fI,\fRmap\fI])\fR
+.RS 4
+Return a tuple of arguments to set up an option whose value may be one or more of a specified list of legal enumerated values\&. The option will use the specified name
+\fIkey\fR, have a default value of
+\fIdefault\fR, and display the specified
+\fIhelp\fR
+text\&. The option will only support the values
+\fBall\fR,
+\fBnone\fR, or the values in the
+\fInames\fR
+list\&. More than one value may be specified, with all values separated by commas\&. The default may be a string of comma\-separated default values, or a list of the default values\&. The optional
+\fImap\fR
+argument is a dictionary that can be used to convert input values into specific legal values in the
+\fInames\fR
+list\&.
+.RE
+.PP
+PackageVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR)
+.RS 4
+Return a tuple of arguments to set up an option whose value is a path name of a package that may be enabled, disabled or given an explicit path name\&. The option will use the specified name
+\fIkey\fR, have a default value of
+\fIdefault\fR, and display the specified
+\fIhelp\fR
+text\&. The option will support the values
+\fByes\fR,
+\fBtrue\fR,
+\fBon\fR,
+\fBenable\fR
+or
+\fBsearch\fR, in which case the specified
+\fIdefault\fR
+will be used, or the option may be set to an arbitrary string (typically the path name to a package that is being enabled)\&. The option will also support the values
+\fBno\fR,
+\fBfalse\fR,
+\fBoff\fR
+or
+\fBdisable\fR
+to disable use of the specified option\&.
+.RE
+.PP
+PathVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, [\fIvalidator\fR])
+.RS 4
+Return a tuple of arguments to set up an option whose value is expected to be a path name\&. The option will use the specified name
+\fIkey\fR, have a default value of
+\fIdefault\fR, and display the specified
+\fIhelp\fR
+text\&. An additional
+\fIvalidator\fR
+may be specified that will be called to verify that the specified path is acceptable\&. SCons supplies the following ready\-made validators:
+\fBPathVariable\&.PathExists\fR
+(the default), which verifies that the specified path exists;
+\fBPathVariable\&.PathIsFile\fR, which verifies that the specified path is an existing file;
+\fBPathVariable\&.PathIsDir\fR, which verifies that the specified path is an existing directory;
+\fBPathVariable\&.PathIsDirCreate\fR, which verifies that the specified path is a directory and will create the specified directory if the path does not exist; and
+\fBPathVariable\&.PathAccept\fR, which simply accepts the specific path name argument without validation, and which is suitable if you want your users to be able to specify a directory path that will be created as part of the build process, for example\&. You may supply your own
+\fIvalidator\fR
+function, which must take three arguments (\fIkey\fR, the name of the variable to be set;
+\fIval\fR, the specified value being checked; and
+\fIenv\fR, the construction environment) and should raise an exception if the specified value is not acceptable\&.
+.RE
+.PP
+These functions make it convenient to create a number of variables with consistent behavior in a single call to the
+\fBAddVariables\fR
+method:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+vars\&.AddVariables(
+ BoolVariable(\*(Aqwarnings\*(Aq, \*(Aqcompilation with \-Wall and similiar\*(Aq, 1),
+ EnumVariable(\*(Aqdebug\*(Aq, \*(Aqdebug output and symbols\*(Aq, \*(Aqno\*(Aq
+ allowed_values=(\*(Aqyes\*(Aq, \*(Aqno\*(Aq, \*(Aqfull\*(Aq),
+ map={}, ignorecase=0), # case sensitive
+ ListVariable(\*(Aqshared\*(Aq,
+ \*(Aqlibraries to build as shared libraries\*(Aq,
+ \*(Aqall\*(Aq,
+ names = list_of_libs),
+ PackageVariable(\*(Aqx11\*(Aq,
+ \*(Aquse X11 installed here (yes = search some places)\*(Aq,
+ \*(Aqyes\*(Aq),
+ PathVariable(\*(Aqqtdir\*(Aq, \*(Aqwhere the root of Qt is installed\*(Aq, qtdir),
+ PathVariable(\*(Aqfoopath\*(Aq, \*(Aqwhere the foo library is installed\*(Aq, foopath,
+ PathVariable\&.PathIsDir),
+
+)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "File and Directory Nodes"
+.PP
+The
+\fIFile\fR() and
+\fIDir\fR() functions return
+\fIFile\fR
+and
+\fIDir\fR
+Nodes, respectively\&. python objects, respectively\&. Those objects have several user\-visible attributes and methods that are often useful:
+.PP
+path
+.RS 4
+The build path of the given file or directory\&. This path is relative to the top\-level directory (where the
+\fBSConstruct\fR
+file is found)\&. The build path is the same as the source path if
+\fIvariant_dir\fR
+is not being used\&.
+.RE
+.PP
+abspath
+.RS 4
+The absolute build path of the given file or directory\&.
+.RE
+.PP
+srcnode()
+.RS 4
+The
+\fIsrcnode\fR() method returns another
+\fIFile\fR
+or
+\fIDir\fR
+object representing the
+\fIsource\fR
+path of the given
+\fIFile\fR
+or
+\fIDir\fR\&. The
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Get the current build dir\*(Aqs path, relative to top\&.
+Dir(\*(Aq\&.\*(Aq)\&.path
+# Current dir\*(Aqs absolute path
+Dir(\*(Aq\&.\*(Aq)\&.abspath
+# Next line is always \*(Aq\&.\*(Aq, because it is the top dir\*(Aqs path relative to itself\&.
+Dir(\*(Aq#\&.\*(Aq)\&.path
+File(\*(Aqfoo\&.c\*(Aq)\&.srcnode()\&.path # source path of the given source file\&.
+
+# Builders also return File objects:
+foo = env\&.Program(\*(Aqfoo\&.c\*(Aq)
+print "foo will be built in %s"%foo\&.path
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+A
+\fIDir\fR
+Node or
+\fIFile\fR
+Node can also be used to create file and subdirectory Nodes relative to the generating Node\&. A
+\fIDir\fR
+Node will place the new Nodes within the directory it represents\&. A
+\fIFile\fR
+node will place the new Nodes within its parent directory (that is, "beside" the file in question)\&. If
+\fId\fR
+is a
+\fIDir\fR
+(directory) Node and
+\fIf\fR
+is a
+\fIFile\fR
+(file) Node, then these methods are available:
+.RE
+.PP
+\fId\fR\&.Dir(\fIname\fR)
+.RS 4
+Returns a directory Node for a subdirectory of
+\fId\fR
+named
+\fIname\fR\&.
+.RE
+.PP
+\fId\fR\&.File(\fIname\fR)
+.RS 4
+Returns a file Node for a file within
+\fId\fR
+named
+\fIname\fR\&.
+.RE
+.PP
+\fId\fR\&.Entry(\fIname\fR)
+.RS 4
+Returns an unresolved Node within
+\fId\fR
+named
+\fIname\fR\&.
+.RE
+.PP
+\fIf\fR\&.Dir(\fIname\fR)
+.RS 4
+Returns a directory named
+\fIname\fR
+within the parent directory of
+\fIf\fR\&.
+.RE
+.PP
+\fIf\fR\&.File(\fIname\fR)
+.RS 4
+Returns a file named
+\fIname\fR
+within the parent directory of
+\fIf\fR\&.
+.RE
+.PP
+\fIf\fR\&.Entry(\fIname\fR)
+.RS 4
+Returns an unresolved Node named
+\fIname\fR
+within the parent directory of
+\fIf\fR\&.
+.RE
+.PP
+For example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Get a Node for a file within a directory
+incl = Dir(\*(Aqinclude\*(Aq)
+f = incl\&.File(\*(Aqheader\&.h\*(Aq)
+
+# Get a Node for a subdirectory within a directory
+dist = Dir(\*(Aqproject\-3\&.2\&.1)
+src = dist\&.Dir(\*(Aqsrc\*(Aq)
+
+# Get a Node for a file in the same directory
+cfile = File(\*(Aqsample\&.c\*(Aq)
+hfile = cfile\&.File(\*(Aqsample\&.h\*(Aq)
+
+# Combined example
+docs = Dir(\*(Aqdocs\*(Aq)
+html = docs\&.Dir(\*(Aqhtml\*(Aq)
+index = html\&.File(\*(Aqindex\&.html\*(Aq)
+css = index\&.File(\*(Aqapp\&.css\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SH "EXTENDING SCONS"
+.SS "Builder Objects"
+.PP
+\fBscons\fR
+can be extended to build different types of targets by adding new Builder objects to a construction environment\&.
+\fIIn general\fR, you should only need to add a new Builder object when you want to build a new type of file or other external target\&. If you just want to invoke a different compiler or other tool to build a Program, Object, Library, or any other type of output file for which
+\fBscons\fR
+already has an existing Builder, it is generally much easier to use those existing Builders in a construction environment that sets the appropriate construction variables (CC, LINK, etc\&.)\&.
+.PP
+Builder objects are created using the
+\fBBuilder\fR
+function\&. The
+\fBBuilder\fR
+function accepts the following arguments:
+.PP
+action
+.RS 4
+The command line string used to build the target from the source\&.
+\fBaction\fR
+can also be: a list of strings representing the command to be executed and its arguments (suitable for enclosing white space in an argument), a dictionary mapping source file name suffixes to any combination of command line strings (if the builder should accept multiple source file extensions), a Python function; an Action object (see the next section); or a list of any of the above\&.
+.sp
+An action function takes three arguments:
+\fIsource\fR
+\- a list of source nodes,
+\fItarget\fR
+\- a list of target nodes,
+\fIenv\fR
+\- the construction environment\&.
+.RE
+.PP
+prefix
+.RS 4
+The prefix that will be prepended to the target file name\&. This may be specified as a:
+*
+\fIstring\fR,
+.sp
+*
+\fIcallable object\fR
+\- a function or other callable that takes two arguments (a construction environment and a list of sources) and returns a prefix,
+.sp
+*
+\fIdictionary\fR
+\- specifies a mapping from a specific source suffix (of the first source specified) to a corresponding target prefix\&. Both the source suffix and target prefix specifications may use environment variable substitution, and the target prefix (the \*(Aqvalue\*(Aq entries in the dictionary) may also be a callable object\&. The default target prefix may be indicated by a dictionary entry with a key value of None\&.
+.RE
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b = Builder("build_it < $SOURCE > $TARGET",
+ prefix = "file\-")
+
+def gen_prefix(env, sources):
+ return "file\-" + env[\*(AqPLATFORM\*(Aq] + \*(Aq\-\*(Aq
+b = Builder("build_it < $SOURCE > $TARGET",
+ prefix = gen_prefix)
+
+b = Builder("build_it < $SOURCE > $TARGET",
+ suffix = { None: "file\-",
+ "$SRC_SFX_A": gen_prefix })
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+suffix
+.RS 4
+The suffix that will be appended to the target file name\&. This may be specified in the same manner as the prefix above\&. If the suffix is a string, then
+\fBscons\fR
+will append a \*(Aq\&.\*(Aq to the beginning of the suffix if it\*(Aqs not already there\&. The string returned by callable object (or obtained from the dictionary) is untouched and must append its own \*(Aq\&.\*(Aq to the beginning if one is desired\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b = Builder("build_it < $SOURCE > $TARGET"
+ suffix = "\-file")
+
+def gen_suffix(env, sources):
+ return "\&." + env[\*(AqPLATFORM\*(Aq] + "\-file"
+b = Builder("build_it < $SOURCE > $TARGET",
+ suffix = gen_suffix)
+
+b = Builder("build_it < $SOURCE > $TARGET",
+ suffix = { None: "\&.sfx1",
+ "$SRC_SFX_A": gen_suffix })
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+ensure_suffix
+.RS 4
+When set to any true value, causes
+\fBscons\fR
+to add the target suffix specified by the
+\fIsuffix\fR
+keyword to any target strings that have a different suffix\&. (The default behavior is to leave untouched any target file name that looks like it already has any suffix\&.)
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b1 = Builder("build_it < $SOURCE > $TARGET"
+ suffix = "\&.out")
+b2 = Builder("build_it < $SOURCE > $TARGET"
+ suffix = "\&.out",
+ ensure_suffix)
+env = Environment()
+env[\*(AqBUILDERS\*(Aq][\*(AqB1\*(Aq] = b1
+env[\*(AqBUILDERS\*(Aq][\*(AqB2\*(Aq] = b2
+
+# Builds "foo\&.txt" because ensure_suffix is not set\&.
+env\&.B1(\*(Aqfoo\&.txt\*(Aq, \*(Aqfoo\&.in\*(Aq)
+
+# Builds "bar\&.txt\&.out" because ensure_suffix is set\&.
+env\&.B2(\*(Aqbar\&.txt\*(Aq, \*(Aqbar\&.in\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+src_suffix
+.RS 4
+The expected source file name suffix\&. This may be a string or a list of strings\&.
+.RE
+.PP
+target_scanner
+.RS 4
+A Scanner object that will be invoked to find implicit dependencies for this target file\&. This keyword argument should be used for Scanner objects that find implicit dependencies based only on the target file and the construction environment,
+\fInot\fR
+for implicit dependencies based on source files\&. (See the section "Scanner Objects" below, for information about creating Scanner objects\&.)
+.RE
+.PP
+source_scanner
+.RS 4
+A Scanner object that will be invoked to find implicit dependencies in any source files used to build this target file\&. This is where you would specify a scanner to find things like
+\fB#include\fR
+lines in source files\&. The pre\-built
+\fBDirScanner\fR
+Scanner object may be used to indicate that this Builder should scan directory trees for on\-disk changes to files that
+\fBscons\fR
+does not know about from other Builder or function calls\&. (See the section "Scanner Objects" below, for information about creating your own Scanner objects\&.)
+.RE
+.PP
+target_factory
+.RS 4
+A factory function that the Builder will use to turn any targets specified as strings into SCons Nodes\&. By default, SCons assumes that all targets are files\&. Other useful target_factory values include
+\fBDir\fR, for when a Builder creates a directory target, and
+\fBEntry\fR, for when a Builder can create either a file or directory target\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+MakeDirectoryBuilder = Builder(action=my_mkdir, target_factory=Dir)
+env = Environment()
+env\&.Append(BUILDERS = {\*(AqMakeDirectory\*(Aq:MakeDirectoryBuilder})
+env\&.MakeDirectory(\*(Aqnew_directory\*(Aq, [])
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Note that the call to the MakeDirectory Builder needs to specify an empty source list to make the string represent the builder\*(Aqs target; without that, it would assume the argument is the source, and would try to deduce the target name from it, which in the absence of an automatically\-added prefix or suffix would lead to a matching target and source name and a circular dependency\&.
+.RE
+.PP
+source_factory
+.RS 4
+A factory function that the Builder will use to turn any sources specified as strings into SCons Nodes\&. By default, SCons assumes that all source are files\&. Other useful source_factory values include
+\fBDir\fR, for when a Builder uses a directory as a source, and
+\fBEntry\fR, for when a Builder can use files or directories (or both) as sources\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+CollectBuilder = Builder(action=my_mkdir, source_factory=Entry)
+env = Environment()
+env\&.Append(BUILDERS = {\*(AqCollect\*(Aq:CollectBuilder})
+env\&.Collect(\*(Aqarchive\*(Aq, [\*(Aqdirectory_name\*(Aq, \*(Aqfile_name\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+emitter
+.RS 4
+A function or list of functions to manipulate the target and source lists before dependencies are established and the target(s) are actually built\&.
+\fBemitter\fR
+can also be a string containing a construction variable to expand to an emitter function or list of functions, or a dictionary mapping source file suffixes to emitter functions\&. (Only the suffix of the first source file is used to select the actual emitter function from an emitter dictionary\&.)
+.sp
+An emitter function takes three arguments:
+\fIsource\fR
+\- a list of source nodes,
+\fItarget\fR
+\- a list of target nodes,
+\fIenv\fR
+\- the construction environment\&. An emitter must return a tuple containing two lists, the list of targets to be built by this builder, and the list of sources for this builder\&.
+.sp
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def e(target, source, env):
+ return (target + [\*(Aqfoo\&.foo\*(Aq], source + [\*(Aqfoo\&.src\*(Aq])
+
+# Simple association of an emitter function with a Builder\&.
+b = Builder("my_build < $TARGET > $SOURCE",
+ emitter = e)
+
+def e2(target, source, env):
+ return (target + [\*(Aqbar\&.foo\*(Aq], source + [\*(Aqbar\&.src\*(Aq])
+
+# Simple association of a list of emitter functions with a Builder\&.
+b = Builder("my_build < $TARGET > $SOURCE",
+ emitter = [e, e2])
+
+# Calling an emitter function through a construction variable\&.
+env = Environment(MY_EMITTER = e)
+b = Builder("my_build < $TARGET > $SOURCE",
+ emitter = \*(Aq$MY_EMITTER\*(Aq)
+
+# Calling a list of emitter functions through a construction variable\&.
+env = Environment(EMITTER_LIST = [e, e2])
+b = Builder("my_build < $TARGET > $SOURCE",
+ emitter = \*(Aq$EMITTER_LIST\*(Aq)
+
+# Associating multiple emitters with different file
+# suffixes using a dictionary\&.
+def e_suf1(target, source, env):
+ return (target + [\*(Aqanother_target_file\*(Aq], source)
+def e_suf2(target, source, env):
+ return (target, source + [\*(Aqanother_source_file\*(Aq])
+b = Builder("my_build < $TARGET > $SOURCE",
+ emitter = {\*(Aq\&.suf1\*(Aq : e_suf1,
+ \*(Aq\&.suf2\*(Aq : e_suf2})
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+multi
+.RS 4
+Specifies whether this builder is allowed to be called multiple times for the same target file(s)\&. The default is 0, which means the builder can not be called multiple times for the same target file(s)\&. Calling a builder multiple times for the same target simply adds additional source files to the target; it is not allowed to change the environment associated with the target, specify addition environment overrides, or associate a different builder with the target\&.
+.RE
+.PP
+env
+.RS 4
+A construction environment that can be used to fetch source code using this Builder\&. (Note that this environment is
+\fInot\fR
+used for normal builds of normal target files, which use the environment that was used to call the Builder for the target file\&.)
+.RE
+.PP
+generator
+.RS 4
+A function that returns a list of actions that will be executed to build the target(s) from the source(s)\&. The returned action(s) may be an Action object, or anything that can be converted into an Action object (see the next section)\&.
+.sp
+The generator function takes four arguments:
+\fIsource\fR
+\- a list of source nodes,
+\fItarget\fR
+\- a list of target nodes,
+\fIenv\fR
+\- the construction environment,
+\fIfor_signature\fR
+\- a Boolean value that specifies whether the generator is being called for generating a build signature (as opposed to actually executing the command)\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def g(source, target, env, for_signature):
+ return [["gcc", "\-c", "\-o"] + target + source]
+
+b = Builder(generator=g)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The
+\fIgenerator\fR
+and
+\fIaction\fR
+arguments must not both be used for the same Builder\&.
+.RE
+.PP
+src_builder
+.RS 4
+Specifies a builder to use when a source file name suffix does not match any of the suffixes of the builder\&. Using this argument produces a multi\-stage builder\&.
+.RE
+.PP
+single_source
+.RS 4
+Specifies that this builder expects exactly one source file per call\&. Giving more than one source file without target files results in implicitly calling the builder multiple times (once for each source given)\&. Giving multiple source files together with target files results in a UserError exception\&.
+.RE
+.PP
+The
+\fIgenerator\fR
+and
+\fIaction\fR
+arguments must not both be used for the same Builder\&.
+.PP
+source_ext_match
+.RS 4
+When the specified
+\fIaction\fR
+argument is a dictionary, the default behavior when a builder is passed multiple source files is to make sure that the extensions of all the source files match\&. If it is legal for this builder to be called with a list of source files with different extensions, this check can be suppressed by setting
+\fBsource_ext_match\fR
+to
+\fBNone\fR
+or some other non\-true value\&. When
+\fBsource_ext_match\fR
+is disable,
+\fBscons\fR
+will use the suffix of the first specified source file to select the appropriate action from the
+\fIaction\fR
+dictionary\&.
+.sp
+In the following example, the setting of
+\fBsource_ext_match\fR
+prevents
+\fBscons\fR
+from exiting with an error due to the mismatched suffixes of
+\fBfoo\&.in\fR
+and
+\fBfoo\&.extra\fR\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b = Builder(action={\*(Aq\&.in\*(Aq : \*(Aqbuild $SOURCES > $TARGET\*(Aq},
+ source_ext_match = None)
+
+env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq:b})
+env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, [\*(Aqfoo\&.in\*(Aq, \*(Aqfoo\&.extra\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+env
+.RS 4
+A construction environment that can be used to fetch source code using this Builder\&. (Note that this environment is
+\fInot\fR
+used for normal builds of normal target files, which use the environment that was used to call the Builder for the target file\&.)
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b = Builder(action="build < $SOURCE > $TARGET")
+env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq : b})
+env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, my_arg = \*(Aqxyzzy\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+chdir
+.RS 4
+A directory from which scons will execute the action(s) specified for this Builder\&. If the
+\fBchdir\fR
+argument is a string or a directory Node, scons will change to the specified directory\&. If the
+\fBchdir\fR
+is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
+.sp
+Note that scons will
+\fInot\fR
+automatically modify its expansion of construction variables like
+\fB$TARGET\fR
+and
+\fB$SOURCE\fR
+when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. Builders created using chdir keyword argument, will need to use construction variable expansions like
+\fB${TARGET\&.file}\fR
+and
+\fB${SOURCE\&.file}\fR
+to use just the filename portion of the targets and source\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+b = Builder(action="build < ${SOURCE\&.file} > ${TARGET\&.file}",
+ chdir=1)
+env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq : b})
+env\&.MyBuild(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+\fBWARNING:\fR
+Python only keeps one current directory location for all of the threads\&. This means that use of the
+\fBchdir\fR
+argument will
+\fInot\fR
+work with the SCons
+\fB\-j\fR
+option, because individual worker threads spawned by SCons interfere with each other when they start changing directory\&.
+.RE
+.PP
+Any additional keyword arguments supplied when a Builder object is created (that is, when the Builder() function is called) will be set in the executing construction environment when the Builder object is called\&. The canonical example here would be to set a construction variable to the repository of a source code system\&.
+.PP
+Any additional keyword arguments supplied when a Builder
+\fIobject\fR
+is called will only be associated with the target created by that particular Builder call (and any other files built as a result of the call)\&.
+.PP
+These extra keyword arguments are passed to the following functions: command generator functions, function Actions, and emitter functions\&.
+.SS "Action Objects"
+.PP
+The
+\fBBuilder\fR() function will turn its
+\fBaction\fR
+keyword argument into an appropriate internal Action object\&. You can also explicitly create Action objects using the
+\fBAction\fR() global function, which can then be passed to the
+\fBBuilder\fR() function\&. This can be used to configure an Action object more flexibly, or it may simply be more efficient than letting each separate Builder object create a separate Action when multiple Builder objects need to do the same thing\&.
+.PP
+The
+\fBAction\fR() global function returns an appropriate object for the action represented by the type of the first argument:
+.PP
+Action
+.RS 4
+If the first argument is already an Action object, the object is simply returned\&.
+.RE
+.PP
+String
+.RS 4
+If the first argument is a string, a command\-line Action is returned\&. Note that the command\-line string may be preceded by an
+\fB@\fR
+(at\-sign) to suppress printing of the specified command line, or by a
+\fB\-\fR
+(hyphen) to ignore the exit status from the specified command:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Action(\*(Aq$CC \-c \-o $TARGET $SOURCES\*(Aq)
+
+# Doesn\*(Aqt print the line being executed\&.
+Action(\*(Aq@build $TARGET $SOURCES\*(Aq)
+
+# Ignores return value
+Action(\*(Aq\-build $TARGET $SOURCES\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+List
+.RS 4
+If the first argument is a list, then a list of Action objects is returned\&. An Action object is created as necessary for each element in the list\&. If an element
+\fIwithin\fR
+the list is itself a list, the internal list is the command and arguments to be executed via the command line\&. This allows white space to be enclosed in an argument by defining a command in a list within a list:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Action([[\*(Aqcc\*(Aq, \*(Aq\-c\*(Aq, \*(Aq\-DWHITE SPACE\*(Aq, \*(Aq\-o\*(Aq, \*(Aq$TARGET\*(Aq, \*(Aq$SOURCES\*(Aq]])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Function
+.RS 4
+If the first argument is a Python function, a function Action is returned\&. The Python function must take three keyword arguments,
+\fBtarget\fR
+(a Node object representing the target file),
+\fBsource\fR
+(a Node object representing the source file) and
+\fBenv\fR
+(the construction environment used for building the target file)\&. The
+\fBtarget\fR
+and
+\fBsource\fR
+arguments may be lists of Node objects if there is more than one target file or source file\&. The actual target and source file name(s) may be retrieved from their Node objects via the built\-in Python str() function:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+target_file_name = str(target)
+source_file_names = map(lambda x: str(x), source)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The function should return
+0
+or
+\fBNone\fR
+to indicate a successful build of the target file(s)\&. The function may raise an exception or return a non\-zero exit status to indicate an unsuccessful build\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def build_it(target = None, source = None, env = None):
+ # build the target from the source
+ return 0
+
+a = Action(build_it)
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the action argument is not one of the above, None is returned\&.
+.RE
+.PP
+The second argument is optional and is used to define the output which is printed when the Action is actually performed\&. In the absence of this parameter, or if it\*(Aqs an empty string, a default output depending on the type of the action is used\&. For example, a command\-line action will print the executed command\&. The argument must be either a Python function or a string\&.
+.PP
+In the first case, it\*(Aqs a function that returns a string to be printed to describe the action being executed\&. The function may also be specified by the
+\fIstrfunction\fR= keyword argument\&. Like a function to build a file, this function must take three keyword arguments:
+\fBtarget\fR
+(a Node object representing the target file),
+\fBsource\fR
+(a Node object representing the source file) and
+\fBenv\fR
+(a construction environment)\&. The
+\fBtarget\fR
+and
+\fBsource\fR
+arguments may be lists of Node objects if there is more than one target file or source file\&.
+.PP
+In the second case, you provide the string itself\&. The string may also be specified by the
+\fIcmdstr\fR= keyword argument\&. The string typically contains variables, notably $TARGET(S) and $SOURCE(S), or consists of just a single variable, which is optionally defined somewhere else\&. SCons itself heavily uses the latter variant\&.
+.PP
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def build_it(target, source, env):
+ # build the target from the source
+ return 0
+
+def string_it(target, source, env):
+ return "building \*(Aq%s\*(Aq from \*(Aq%s\*(Aq" % (target[0], source[0])
+
+# Use a positional argument\&.
+f = Action(build_it, string_it)
+s = Action(build_it, "building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq")
+
+# Alternatively, use a keyword argument\&.
+f = Action(build_it, strfunction=string_it)
+s = Action(build_it, cmdstr="building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq")
+
+# You can provide a configurable variable\&.
+l = Action(build_it, \*(Aq$STRINGIT\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The third and succeeding arguments, if present, may either be a construction variable or a list of construction variables whose values will be included in the signature of the Action when deciding whether a target should be rebuilt because the action changed\&. The variables may also be specified by a
+\fIvarlist\fR= keyword parameter; if both are present, they are combined\&. This is necessary whenever you want a target to be rebuilt when a specific construction variable changes\&. This is not often needed for a string action, as the expanded variables will normally be part of the command line, but may be needed if a Python function action uses the value of a construction variable when generating the command line\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def build_it(target, source, env):
+ # build the target from the \*(AqXXX\*(Aq construction variable
+ open(target[0], \*(Aqw\*(Aq)\&.write(env[\*(AqXXX\*(Aq])
+ return 0
+
+# Use positional arguments\&.
+a = Action(build_it, \*(Aq$STRINGIT\*(Aq, [\*(AqXXX\*(Aq])
+
+# Alternatively, use a keyword argument\&.
+a = Action(build_it, varlist=[\*(AqXXX\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The
+\fBAction\fR() global function can be passed the following optional keyword arguments to modify the Action object\*(Aqs behavior:
+.PP
+\fBchdir\fR
+The
+\fBchdir\fR
+keyword argument specifies that scons will execute the action after changing to the specified directory\&. If the
+\fBchdir\fR
+argument is a string or a directory Node, scons will change to the specified directory\&. If the
+\fBchdir\fR
+argument is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
+.PP
+Note that scons will
+\fInot\fR
+automatically modify its expansion of construction variables like
+\fB$TARGET\fR
+and
+\fB$SOURCE\fR
+when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. Builders created using chdir keyword argument, will need to use construction variable expansions like
+\fB${TARGET\&.file}\fR
+and
+\fB${SOURCE\&.file}\fR
+to use just the filename portion of the targets and source\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}",
+ chdir=1)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\fBexitstatfunc\fR
+The
+\fBAction\fR() global function also takes an
+\fBexitstatfunc\fR
+keyword argument which specifies a function that is passed the exit status (or return value) from the specified action and can return an arbitrary or modified value\&. This can be used, for example, to specify that an Action object\*(Aqs return value should be ignored under special conditions and SCons should, therefore, consider that the action always suceeds:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def always_succeed(s):
+ # Always return 0, which indicates success\&.
+ return 0
+a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}",
+ exitstatfunc=always_succeed)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+\fBbatch_key\fR
+The
+\fBbatch_key\fR
+keyword argument can be used to specify that the Action can create multiple target files by processing multiple independent source files simultaneously\&. (The canonical example is "batch compilation" of multiple object files by passing multiple source files to a single invocation of a compiler such as Microsoft\*(Aqs Visual C / C++ compiler\&.) If the
+\fBbatch_key\fR
+argument is any non\-False, non\-callable Python value, the configured Action object will cause
+\fBscons\fR
+to collect all targets built with the Action object and configured with the same construction environment into single invocations of the Action object\*(Aqs command line or function\&. Command lines will typically want to use the
+\fBCHANGED_SOURCES\fR
+construction variable (and possibly
+\fBCHANGED_TARGETS\fR
+as well) to only pass to the command line those sources that have actually changed since their targets were built\&.
+.PP
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=True)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The
+\fBbatch_key\fR
+argument may also be a callable function that returns a key that will be used to identify different "batches" of target files to be collected for batch building\&. A
+\fBbatch_key\fR
+function must take the following arguments:
+.PP
+action
+.RS 4
+The action object\&.
+.RE
+.PP
+env
+.RS 4
+The construction environment configured for the target\&.
+.RE
+.PP
+target
+.RS 4
+The list of targets for a particular configured action\&.
+.RE
+.PP
+source
+.RS 4
+The list of source for a particular configured action\&.
+.sp
+The returned key should typically be a tuple of values derived from the arguments, using any appropriate logic to decide how multiple invocations should be batched\&. For example, a
+\fBbatch_key\fR
+function may decide to return the value of a specific construction variable from the
+\fBenv\fR
+argument which will cause
+\fBscons\fR
+to batch\-build targets with matching values of that variable, or perhaps return the
+\fBid\fR() of the entire construction environment, in which case
+\fBscons\fR
+will batch\-build all targets configured with the same construction environment\&. Returning
+\fBNone\fR
+indicates that the particular target should
+\fInot\fR
+be part of any batched build, but instead will be built by a separate invocation of action\*(Aqs command or function\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def batch_key(action, env, target, source):
+ tdir = target[0]\&.dir
+ if tdir\&.name == \*(Aqspecial\*(Aq:
+ # Don\*(Aqt batch\-build any target
+ # in the special/ subdirectory\&.
+ return None
+ return (id(action), id(env), tdir)
+a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=batch_key)
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SS "Miscellaneous Action Functions"
+.PP
+\fBscons\fR
+supplies a number of functions that arrange for various common file and directory manipulations to be performed\&. These are similar in concept to "tasks" in the Ant build tool, although the implementation is slightly different\&. These functions do not actually perform the specified action at the time the function is called, but instead return an Action object that can be executed at the appropriate time\&. (In Object\-Oriented terminology, these are actually Action
+\fIFactory\fR
+functions that return Action objects\&.)
+.PP
+In practice, there are two natural ways that these Action Functions are intended to be used\&.
+.PP
+First, if you need to perform the action at the time the SConscript file is being read, you can use the
+\fBExecute\fR
+global function to do so:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Touch(\*(Aqfile\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Second, you can use these functions to supply Actions in a list for use by the
+\fBCommand\fR
+method\&. This can allow you to perform more complicated sequences of file manipulation without relying on platform\-specific external commands: that
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(TMPBUILD = \*(Aq/tmp/builddir\*(Aq)
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ [Mkdir(\*(Aq$TMPBUILD\*(Aq),
+ Copy(\*(Aq$TMPBUILD\*(Aq, \*(Aq${SOURCE\&.dir}\*(Aq),
+ "cd $TMPBUILD && make",
+ Delete(\*(Aq$TMPBUILD\*(Aq)])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Chmod(\fIdest\fR, \fImode\fR)
+.RS 4
+Returns an Action object that changes the permissions on the specified
+\fIdest\fR
+file or directory to the specified
+\fImode\fR\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Chmod(\*(Aqfile\*(Aq, 0755))
+
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ [Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq),
+ Chmod(\*(Aq$TARGET\*(Aq, 0755)])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Copy(\fIdest\fR, \fIsrc\fR)
+.RS 4
+Returns an Action object that will copy the
+\fIsrc\fR
+source file or directory to the
+\fIdest\fR
+destination file or directory\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Copy(\*(Aqfoo\&.output\*(Aq, \*(Aqfoo\&.input\*(Aq))
+
+env\&.Command(\*(Aqbar\&.out\*(Aq, \*(Aqbar\&.in\*(Aq,
+ Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Delete(\fIentry\fR, [\fImust_exist\fR])
+.RS 4
+Returns an Action that deletes the specified
+\fIentry\fR, which may be a file or a directory tree\&. If a directory is specified, the entire directory tree will be removed\&. If the
+\fImust_exist\fR
+flag is set, then a Python error will be thrown if the specified entry does not exist; the default is
+\fBmust_exist=0\fR, that is, the Action will silently do nothing if the entry does not exist\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Delete(\*(Aq/tmp/buildroot\*(Aq))
+
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ [Delete(\*(Aq${TARGET\&.dir}\*(Aq),
+ MyBuildAction])
+
+Execute(Delete(\*(Aqfile_that_must_exist\*(Aq, must_exist=1))
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Mkdir(\fIdir\fR)
+.RS 4
+Returns an Action that creates the specified directory
+\fIdir \&.\fR
+Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Mkdir(\*(Aq/tmp/outputdir\*(Aq))
+
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ [Mkdir(\*(Aq/tmp/builddir\*(Aq),
+ Copy(\*(Aq/tmp/builddir/foo\&.in\*(Aq, \*(Aq$SOURCE\*(Aq),
+ "cd /tmp/builddir && make",
+ Copy(\*(Aq$TARGET\*(Aq, \*(Aq/tmp/builddir/foo\&.out\*(Aq)])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Move(\fIdest\fR, \fIsrc\fR)
+.RS 4
+Returns an Action that moves the specified
+\fIsrc\fR
+file or directory to the specified
+\fIdest\fR
+file or directory\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Move(\*(Aqfile\&.destination\*(Aq, \*(Aqfile\&.source\*(Aq))
+
+env\&.Command(\*(Aqoutput_file\*(Aq, \*(Aqinput_file\*(Aq,
+ [MyBuildAction,
+ Move(\*(Aq$TARGET\*(Aq, \*(Aqfile_created_by_MyBuildAction\*(Aq)])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.PP
+Touch(\fIfile\fR)
+.RS 4
+Returns an Action that updates the modification time on the specified
+\fIfile\fR\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+Execute(Touch(\*(Aqfile_to_be_touched\*(Aq))
+
+env\&.Command(\*(Aqmarker\*(Aq, \*(Aqinput_file\*(Aq,
+ [MyBuildAction,
+ Touch(\*(Aq$TARGET\*(Aq)])
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SS "Variable Substitution"
+.PP
+Before executing a command,
+\fBscons\fR
+performs construction variable interpolation on the strings that make up the command line of builders\&. Variables are introduced by a
+\fB$\fR
+prefix\&. Besides construction variables, scons provides the following variables for each command execution:
+.PP
+CHANGED_SOURCES
+.RS 4
+The file names of all sources of the build command that have changed since the target was last built\&.
+.RE
+.PP
+CHANGED_TARGETS
+.RS 4
+The file names of all targets that would be built from sources that have changed since the target was last built\&.
+.RE
+.PP
+SOURCE
+.RS 4
+The file name of the source of the build command, or the file name of the first source if multiple sources are being built\&.
+.RE
+.PP
+SOURCES
+.RS 4
+The file names of the sources of the build command\&.
+.RE
+.PP
+TARGET
+.RS 4
+The file name of the target being built, or the file name of the first target if multiple targets are being built\&.
+.RE
+.PP
+TARGETS
+.RS 4
+The file names of all targets being built\&.
+.RE
+.PP
+UNCHANGED_SOURCES
+.RS 4
+The file names of all sources of the build command that have
+\fInot\fR
+changed since the target was last built\&.
+.RE
+.PP
+UNCHANGED_TARGETS
+.RS 4
+The file names of all targets that would be built from sources that have
+\fInot\fR
+changed since the target was last built\&.
+.sp
+(Note that the above variables are reserved and may not be set in a construction environment\&.)
+.RE
+.PP
+For example, given the construction variable CC=\*(Aqcc\*(Aq, targets=[\*(Aqfoo\*(Aq], and sources=[\*(Aqfoo\&.c\*(Aq, \*(Aqbar\&.c\*(Aq]:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+action=\*(Aq$CC \-c \-o $TARGET $SOURCES\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+would produce the command line:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+cc \-c \-o foo foo\&.c bar\&.c
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Variable names may be surrounded by curly braces ({}) to separate the name from the trailing characters\&. Within the curly braces, a variable name may have a Python slice subscript appended to select one or more items from a list\&. In the previous example, the string:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+${SOURCES[1]}
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+would produce:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+bar\&.c
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Additionally, a variable name may have the following special modifiers appended within the enclosing curly braces to modify the interpolated string:
+.PP
+base
+.RS 4
+The base path of the file name, including the directory path but excluding any suffix\&.
+.RE
+.PP
+dir
+.RS 4
+The name of the directory in which the file exists\&.
+.RE
+.PP
+file
+.RS 4
+The file name, minus any directory portion\&.
+.RE
+.PP
+filebase
+.RS 4
+Just the basename of the file, minus any suffix and minus the directory\&.
+.RE
+.PP
+suffix
+.RS 4
+Just the file suffix\&.
+.RE
+.PP
+abspath
+.RS 4
+The absolute path name of the file\&.
+.RE
+.PP
+posix
+.RS 4
+The POSIX form of the path, with directories separated by
+\fB/\fR
+(forward slashes) not backslashes\&. This is sometimes necessary on Windows systems when a path references a file on other (POSIX) systems\&.
+.RE
+.PP
+srcpath
+.RS 4
+The directory and file name to the source file linked to this file through
+\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory and filename unchanged\&.
+.RE
+.PP
+srcdir
+.RS 4
+The directory containing the source file linked to this file through
+\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory part of the filename\&.
+.RE
+.PP
+rsrcpath
+.RS 4
+The directory and file name to the source file linked to this file through
+\fBVariantDir\fR()\&. If the file does not exist locally but exists in a Repository, the path in the Repository is returned\&. If this file isn\*(Aqt linked, it just returns the directory and filename unchanged\&.
+.RE
+.PP
+rsrcdir
+.RS 4
+The Repository directory containing the source file linked to this file through
+\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory part of the filename\&.
+.RE
+.PP
+For example, the specified target will expand as follows for the corresponding modifiers:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$TARGET => sub/dir/file\&.x
+${TARGET\&.base} => sub/dir/file
+${TARGET\&.dir} => sub/dir
+${TARGET\&.file} => file\&.x
+${TARGET\&.filebase} => file
+${TARGET\&.suffix} => \&.x
+${TARGET\&.abspath} => /top/dir/sub/dir/file\&.x
+
+SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqsub/dir\*(Aq)
+$SOURCE => sub/dir/file\&.x
+${SOURCE\&.srcpath} => src/file\&.x
+${SOURCE\&.srcdir} => src
+
+Repository(\*(Aq/usr/repository\*(Aq)
+$SOURCE => sub/dir/file\&.x
+${SOURCE\&.rsrcpath} => /usr/repository/src/file\&.x
+${SOURCE\&.rsrcdir} => /usr/repository/src
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note that curly braces braces may also be used to enclose arbitrary Python code to be evaluated\&. (In fact, this is how the above modifiers are substituted, they are simply attributes of the Python objects that represent TARGET, SOURCES, etc\&.) See the section "Python Code Substitution" below, for more thorough examples of how this can be used\&.
+.PP
+Lastly, a variable name may be a callable Python function associated with a construction variable in the environment\&. The function should take four arguments:
+\fItarget\fR
+\- a list of target nodes,
+\fIsource\fR
+\- a list of source nodes,
+\fIenv\fR
+\- the construction environment,
+\fIfor_signature\fR
+\- a Boolean value that specifies whether the function is being called for generating a build signature\&. SCons will insert whatever the called function returns into the expanded string:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def foo(target, source, env, for_signature):
+ return "bar"
+
+# Will expand $BAR to "bar baz"
+env=Environment(FOO=foo, BAR="$FOO baz")
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+You can use this feature to pass arguments to a Python function by creating a callable class that stores one or more arguments in an object, and then uses them when the
+\fB__call__()\fR
+method is called\&. Note that in this case, the entire variable expansion must be enclosed by curly braces so that the arguments will be associated with the instantiation of the class:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+class foo(object):
+ def __init__(self, arg):
+ self\&.arg = arg
+
+ def __call__(self, target, source, env, for_signature):
+ return self\&.arg + " bar"
+
+# Will expand $BAR to "my argument bar baz"
+env=Environment(FOO=foo, BAR="${FOO(\*(Aqmy argument\*(Aq)} baz")
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The special pseudo\-variables
+\fB$(\fR
+and
+\fB$)\fR
+may be used to surround parts of a command line that may change
+\fIwithout\fR
+causing a rebuild\-\-that is, which are not included in the signature of target files built with this command\&. All text between
+\fB$(\fR
+and
+\fB$)\fR
+will be removed from the command line before it is added to file signatures, and the
+\fB$(\fR
+and
+\fB$)\fR
+will be removed before the command is executed\&. For example, the command line:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+echo Last build occurred $( $TODAY $)\&. > $TARGET
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+would execute the command:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+echo Last build occurred $TODAY\&. > $TARGET
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+but the command signature added to any target files would be:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+echo Last build occurred \&. > $TARGET
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Python Code Substitution"
+.PP
+Any python code within
+\fB${\fR\-\fB}\fR
+pairs gets evaluated by python \*(Aqeval\*(Aq, with the python globals set to the current environment\*(Aqs set of construction variables\&. So in the following case:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env[\*(AqCOND\*(Aq] = 0
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ \*(Aq\*(Aq\*(Aqecho ${COND==1 and \*(AqFOO\*(Aq or \*(AqBAR\*(Aq} > $TARGET\*(Aq\*(Aq\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+the command executed will be either
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+echo FOO > foo\&.out
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+echo BAR > foo\&.out
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+according to the current value of env[\*(AqCOND\*(Aq] when the command is executed\&. The evaluation occurs when the target is being built, not when the SConscript is being read\&. So if env[\*(AqCOND\*(Aq] is changed later in the SConscript, the final value will be used\&.
+.PP
+Here\*(Aqs a more interesting example\&. Note that all of COND, FOO, and BAR are environment variables, and their values are substituted into the final command\&. FOO is a list, so its elements are interpolated separated by spaces\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env=Environment()
+env[\*(AqCOND\*(Aq] = 0
+env[\*(AqFOO\*(Aq] = [\*(Aqfoo1\*(Aq, \*(Aqfoo2\*(Aq]
+env[\*(AqBAR\*(Aq] = \*(Aqbarbar\*(Aq
+env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
+ \*(Aqecho ${COND==1 and FOO or BAR} > $TARGET\*(Aq)
+
+# Will execute this:
+# echo foo1 foo2 > foo\&.out
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+SCons uses the following rules when converting construction variables into command lines:
+.PP
+String
+.RS 4
+When the value is a string it is interpreted as a space delimited list of command line arguments\&.
+.RE
+.PP
+List
+.RS 4
+When the value is a list it is interpreted as a list of command line arguments\&. Each element of the list is converted to a string\&.
+.RE
+.PP
+Other
+.RS 4
+Anything that is not a list or string is converted to a string and interpreted as a single command line argument\&.
+.RE
+.PP
+Newline
+.RS 4
+Newline characters (\en) delimit lines\&. The newline parsing is done after all other parsing, so it is not possible for arguments (e\&.g\&. file names) to contain embedded newline characters\&. This limitation will likely go away in a future version of SCons\&.
+.RE
+.SS "Scanner Objects"
+.PP
+You can use the
+\fBScanner\fR
+function to define objects to scan new file types for implicit dependencies\&. The
+\fBScanner\fR
+function accepts the following arguments:
+.PP
+function
+.RS 4
+This can be either: 1) a Python function that will process the Node (file) and return a list of File Nodes representing the implicit dependencies (file names) found in the contents; or: 2) a dictionary that maps keys (typically the file suffix, but see below for more discussion) to other Scanners that should be called\&.
+.sp
+If the argument is actually a Python function, the function must take three or four arguments:
+.sp
+def scanner_function(node, env, path):
+.sp
+def scanner_function(node, env, path, arg=None):
+.sp
+The
+\fBnode\fR
+argument is the internal SCons node representing the file\&. Use
+\fBstr(node)\fR
+to fetch the name of the file, and
+\fBnode\&.get_contents()\fR
+to fetch contents of the file\&. Note that the file is
+\fInot\fR
+guaranteed to exist before the scanner is called, so the scanner function should check that if there\*(Aqs any chance that the scanned file might not exist (for example, if it\*(Aqs built from other files)\&.
+.sp
+The
+\fBenv\fR
+argument is the construction environment for the scan\&. Fetch values from it using the
+\fBenv\&.Dictionary()\fR
+method\&.
+.sp
+The
+\fBpath\fR
+argument is a tuple (or list) of directories that can be searched for files\&. This will usually be the tuple returned by the
+\fBpath_function\fR
+argument (see below)\&.
+.sp
+The
+\fBarg\fR
+argument is the argument supplied when the scanner was created, if any\&.
+.RE
+.PP
+name
+.RS 4
+The name of the Scanner\&. This is mainly used to identify the Scanner internally\&.
+.RE
+.PP
+argument
+.RS 4
+An optional argument that, if specified, will be passed to the scanner function (described above) and the path function (specified below)\&.
+.RE
+.PP
+skeys
+.RS 4
+An optional list that can be used to determine which scanner should be used for a given Node\&. In the usual case of scanning for file names, this argument will be a list of suffixes for the different file types that this Scanner knows how to scan\&. If the argument is a string, then it will be expanded into a list by the current environment\&.
+.RE
+.PP
+path_function
+.RS 4
+A Python function that takes four or five arguments: a construction environment, a Node for the directory containing the SConscript file in which the first target was defined, a list of target nodes, a list of source nodes, and an optional argument supplied when the scanner was created\&. The
+\fBpath_function\fR
+returns a tuple of directories that can be searched for files to be returned by this Scanner object\&. (Note that the
+\fBFindPathDirs\fR() function can be used to return a ready\-made
+\fBpath_function\fR
+for a given construction variable name, instead of having to write your own function from scratch\&.)
+.RE
+.PP
+node_class
+.RS 4
+The class of Node that should be returned by this Scanner object\&. Any strings or other objects returned by the scanner function that are not of this class will be run through the
+\fBnode_factory\fR
+function\&.
+.RE
+.PP
+node_factory
+.RS 4
+A Python function that will take a string or other object and turn it into the appropriate class of Node to be returned by this Scanner object\&.
+.RE
+.PP
+scan_check
+.RS 4
+An optional Python function that takes two arguments, a Node (file) and a construction environment, and returns whether the Node should, in fact, be scanned for dependencies\&. This check can be used to eliminate unnecessary calls to the scanner function when, for example, the underlying file represented by a Node does not yet exist\&.
+.RE
+.PP
+recursive
+.RS 4
+An optional flag that specifies whether this scanner should be re\-invoked on the dependency files returned by the scanner\&. When this flag is not set, the Node subsystem will only invoke the scanner on the file being scanned, and not (for example) also on the files specified by the #include lines in the file being scanned\&.
+\fIrecursive\fR
+may be a callable function, in which case it will be called with a list of Nodes found and should return a list of Nodes that should be scanned recursively; this can be used to select a specific subset of Nodes for additional scanning\&.
+.RE
+.PP
+Note that
+\fBscons\fR
+has a global
+\fBSourceFileScanner\fR
+object that is used by the
+\fBObject\fR(),
+\fBSharedObject\fR(), and
+\fBStaticObject\fR() builders to decide which scanner should be used for different file extensions\&. You can using the
+\fBSourceFileScanner\&.add_scanner\fR() method to add your own Scanner object to the
+\fBscons\fR
+infrastructure that builds target programs or libraries from a list of source files of different types:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+def xyz_scan(node, env, path):
+ contents = node\&.get_text_contents()
+ # Scan the contents and return the included files\&.
+
+XYZScanner = Scanner(xyz_scan)
+
+SourceFileScanner\&.add_scanner(\*(Aq\&.xyz\*(Aq, XYZScanner)
+
+env\&.Program(\*(Aqmy_prog\*(Aq, [\*(Aqfile1\&.c\*(Aq, \*(Aqfile2\&.f\*(Aq, \*(Aqfile3\&.xyz\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.SH "SYSTEM-SPECIFIC BEHAVIOR"
+.PP
+SCons and its configuration files are very portable, due largely to its implementation in Python\&. There are, however, a few portability issues waiting to trap the unwary\&.
+.SS "\&.C file suffix"
+.PP
+SCons handles the upper\-case
+\fB\&.C\fR
+file suffix differently, depending on the capabilities of the underlying system\&. On a case\-sensitive system such as Linux or UNIX, SCons treats a file with a
+\fB\&.C\fR
+suffix as a C++ source file\&. On a case\-insensitive system such as Windows, SCons treats a file with a
+\fB\&.C\fR
+suffix as a C source file\&.
+.SS "\&.F file suffix"
+.PP
+SCons handles the upper\-case
+\fB\&.F\fR
+file suffix differently, depending on the capabilities of the underlying system\&. On a case\-sensitive system such as Linux or UNIX, SCons treats a file with a
+\fB\&.F\fR
+suffix as a Fortran source file that is to be first run through the standard C preprocessor\&. On a case\-insensitive system such as Windows, SCons treats a file with a
+\fB\&.F\fR
+suffix as a Fortran source file that should
+\fInot\fR
+be run through the C preprocessor\&.
+.SS "Windows: Cygwin Tools and Cygwin Python vs\&. Windows Pythons"
+.PP
+Cygwin supplies a set of tools and utilities that let users work on a Windows system using a more POSIX\-like environment\&. The Cygwin tools, including Cygwin Python, do this, in part, by sharing an ability to interpret UNIX\-like path names\&. For example, the Cygwin tools will internally translate a Cygwin path name like /cygdrive/c/mydir to an equivalent Windows pathname of C:/mydir (equivalent to C:\emydir)\&.
+.PP
+Versions of Python that are built for native Windows execution, such as the python\&.org and ActiveState versions, do not have the Cygwin path name semantics\&. This means that using a native Windows version of Python to build compiled programs using Cygwin tools (such as gcc, bison, and flex) may yield unpredictable results\&. "Mixing and matching" in this way can be made to work, but it requires careful attention to the use of path names in your SConscript files\&.
+.PP
+In practice, users can sidestep the issue by adopting the following rules: When using gcc, use the Cygwin\-supplied Python interpreter to run SCons; when using Microsoft Visual C/C++ (or some other Windows compiler) use the python\&.org or ActiveState version of Python to run SCons\&.
+.SS "Windows: scons\&.bat file"
+.PP
+On Windows systems, SCons is executed via a wrapper
+\fBscons\&.bat\fR
+file\&. This has (at least) two ramifications:
+.PP
+First, Windows command\-line users that want to use variable assignment on the command line may have to put double quotes around the assignments:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons "FOO=BAR" "BAZ=BLEH"
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Second, the Cygwin shell does not recognize this file as being the same as an
+\fBscons\fR
+command issued at the command\-line prompt\&. You can work around this either by executing
+\fBscons\&.bat\fR
+from the Cygwin command line, or by creating a wrapper shell script named
+\fBscons \&.\fR
+.SS "MinGW"
+.PP
+The MinGW bin directory must be in your PATH environment variable or the PATH variable under the ENV construction variable for SCons to detect and use the MinGW tools\&. When running under the native Windows Python interpreter, SCons will prefer the MinGW tools over the Cygwin tools, if they are both installed, regardless of the order of the bin directories in the PATH variable\&. If you have both MSVC and MinGW installed and you want to use MinGW instead of MSVC, then you must explicitly tell SCons to use MinGW by passing
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+tools=[\*(Aqmingw\*(Aq]
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+to the Environment() function, because SCons will prefer the MSVC tools over the MinGW tools\&.
+.SH "EXAMPLES"
+.PP
+To help you get started using SCons, this section contains a brief overview of some common tasks\&.
+.SS "Basic Compilation From a Single Source File"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note: Build the file by specifying the target as an argument ("scons foo" or "scons foo\&.exe")\&. or by specifying a dot ("scons \&.")\&.
+.SS "Basic Compilation From Multiple Source Files"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.Program(target = \*(Aqfoo\*(Aq, source = Split(\*(Aqf1\&.c f2\&.c f3\&.c\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Setting a Compilation Flag"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
+env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Search The Local Directory For \&.h Files"
+.PP
+Note: You do
+\fInot\fR
+need to set CCFLAGS to specify \-I options by hand\&. SCons will construct the right \-I options from CPPPATH\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CPPPATH = [\*(Aq\&.\*(Aq])
+env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Search Multiple Directories For \&.h Files"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(CPPPATH = [\*(Aqinclude1\*(Aq, \*(Aqinclude2\*(Aq])
+env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Building a Static Library"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.StaticLibrary(target = \*(Aqfoo\*(Aq, source = Split(\*(Aql1\&.c l2\&.c\*(Aq))
+env\&.StaticLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aql3\&.c\*(Aq, \*(Aql4\&.c\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Building a Shared Library"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env\&.SharedLibrary(target = \*(Aqfoo\*(Aq, source = [\*(Aql5\&.c\*(Aq, \*(Aql6\&.c\*(Aq])
+env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = Split(\*(Aql7\&.c l8\&.c\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Linking a Local Library Into a Program"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment(LIBS = \*(Aqmylib\*(Aq, LIBPATH = [\*(Aq\&.\*(Aq])
+env\&.Library(target = \*(Aqmylib\*(Aq, source = Split(\*(Aql1\&.c l2\&.c\*(Aq))
+env\&.Program(target = \*(Aqprog\*(Aq, source = [\*(Aqp1\&.c\*(Aq, \*(Aqp2\&.c\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Defining Your Own Builder Object"
+.PP
+Notice that when you invoke the Builder, you can leave off the target file suffix, and SCons will add it automatically\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+bld = Builder(action = \*(Aqpdftex < $SOURCES > $TARGET\*(Aq
+ suffix = \*(Aq\&.pdf\*(Aq,
+ src_suffix = \*(Aq\&.tex\*(Aq)
+env = Environment(BUILDERS = {\*(AqPDFBuilder\*(Aq : bld})
+env\&.PDFBuilder(target = \*(Aqfoo\&.pdf\*(Aq, source = \*(Aqfoo\&.tex\*(Aq)
+
+# The following creates "bar\&.pdf" from "bar\&.tex"
+env\&.PDFBuilder(target = \*(Aqbar\*(Aq, source = \*(Aqbar\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note also that the above initialization overwrites the default Builder objects, so the Environment created above can not be used call Builders like env\&.Program(), env\&.Object(), env\&.StaticLibrary(), etc\&.
+.SS "Adding Your Own Builder Object to an Environment"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+bld = Builder(action = \*(Aqpdftex < $SOURCES > $TARGET\*(Aq
+ suffix = \*(Aq\&.pdf\*(Aq,
+ src_suffix = \*(Aq\&.tex\*(Aq)
+env = Environment()
+env\&.Append(BUILDERS = {\*(AqPDFBuilder\*(Aq : bld})
+env\&.PDFBuilder(target = \*(Aqfoo\&.pdf\*(Aq, source = \*(Aqfoo\&.tex\*(Aq)
+env\&.Program(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+You also can use other Pythonic techniques to add to the BUILDERS construction variable, such as:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env = Environment()
+env[\*(AqBUILDERS][\*(AqPDFBuilder\*(Aq] = bld
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Defining Your Own Scanner Object"
+.PP
+The following example shows an extremely simple scanner (the
+\fBkfile_scan\fR() function) that doesn\*(Aqt use a search path at all and simply returns the file names present on any
+\fBinclude\fR
+lines in the scanned file\&. This would implicitly assume that all included files live in the top\-level directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import re
+
+include_re = re\&.compile(r\*(Aq^include\es+(\eS+)$\*(Aq, re\&.M)
+
+def kfile_scan(node, env, path, arg):
+ contents = node\&.get_text_contents()
+ includes = include_re\&.findall(contents)
+ return env\&.File(includes)
+
+kscan = Scanner(name = \*(Aqkfile\*(Aq,
+ function = kfile_scan,
+ argument = None,
+ skeys = [\*(Aq\&.k\*(Aq])
+scanners = Environment()\&.Dictionary(\*(AqSCANNERS\*(Aq)
+env = Environment(SCANNERS = scanners + [kscan])
+
+env\&.Command(\*(Aqfoo\*(Aq, \*(Aqfoo\&.k\*(Aq, \*(Aqkprocess < $SOURCES > $TARGET\*(Aq)
+
+bar_in = File(\*(Aqbar\&.in\*(Aq)
+env\&.Command(\*(Aqbar\*(Aq, bar_in, \*(Aqkprocess $SOURCES > $TARGET\*(Aq)
+bar_in\&.target_scanner = kscan
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+It is important to note that you have to return a list of File nodes from the scan function, simple strings for the file names won\*(Aqt do\&. As in the examples we are showing here, you can use the
+\fBFile()\fR
+function of your current Environment in order to create nodes on the fly from a sequence of file names with relative paths\&.
+.PP
+Here is a similar but more complete example that searches a path of directories (specified as the
+\fBMYPATH\fR
+construction variable) for files that actually exist:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+import re
+import os
+include_re = re\&.compile(r\*(Aq^include\es+(\eS+)$\*(Aq, re\&.M)
+
+def my_scan(node, env, path, arg):
+ contents = node\&.get_text_contents()
+ includes = include_re\&.findall(contents)
+ if includes == []:
+ return []
+ results = []
+ for inc in includes:
+ for dir in path:
+ file = str(dir) + os\&.sep + inc
+ if os\&.path\&.exists(file):
+ results\&.append(file)
+ break
+ return env\&.File(results)
+
+scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
+ function = my_scan,
+ argument = None,
+ skeys = [\*(Aq\&.x\*(Aq],
+ path_function = FindPathDirs(\*(AqMYPATH\*(Aq)
+ )
+scanners = Environment()\&.Dictionary(\*(AqSCANNERS\*(Aq)
+env = Environment(SCANNERS = scanners + [scanner],
+ MYPATH = [\*(Aqincs\*(Aq])
+
+env\&.Command(\*(Aqfoo\*(Aq, \*(Aqfoo\&.x\*(Aq, \*(Aqxprocess < $SOURCES > $TARGET\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The
+\fBFindPathDirs\fR() function used in the previous example returns a function (actually a callable Python object) that will return a list of directories specified in the
+\fB$MYPATH\fR
+construction variable\&. It lets SCons detect the file
+\fBincs/foo\&.inc\fR
+, even if
+\fBfoo\&.x\fR
+contains the line
+\fBinclude foo\&.inc\fR
+only\&. If you need to customize how the search path is derived, you would provide your own
+\fBpath_function\fR
+argument when creating the Scanner object, as follows:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# MYPATH is a list of directories to search for files in
+def pf(env, dir, target, source, arg):
+ top_dir = Dir(\*(Aq#\*(Aq)\&.abspath
+ results = []
+ if \*(AqMYPATH\*(Aq in env:
+ for p in env[\*(AqMYPATH\*(Aq]:
+ results\&.append(top_dir + os\&.sep + p)
+ return results
+
+scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
+ function = my_scan,
+ argument = None,
+ skeys = [\*(Aq\&.x\*(Aq],
+ path_function = pf
+ )
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Creating a Hierarchical Build"
+.PP
+Notice that the file names specified in a subdirectory\*(Aqs SConscript file are relative to that subdirectory\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConstruct:
+
+ env = Environment()
+ env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+
+ SConscript(\*(Aqsub/SConscript\*(Aq)
+
+sub/SConscript:
+
+ env = Environment()
+ # Builds sub/foo from sub/foo\&.c
+ env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+
+ SConscript(\*(Aqdir/SConscript\*(Aq)
+
+sub/dir/SConscript:
+
+ env = Environment()
+ # Builds sub/dir/foo from sub/dir/foo\&.c
+ env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Sharing Variables Between SConscript Files"
+.PP
+You must explicitly Export() and Import() variables that you want to share between SConscript files\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConstruct:
+
+ env = Environment()
+ env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+
+ Export("env")
+ SConscript(\*(Aqsubdirectory/SConscript\*(Aq)
+
+subdirectory/SConscript:
+
+ Import("env")
+ env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Building Multiple Variants From the Same Source"
+.PP
+Use the variant_dir keyword argument to the SConscript function to establish one or more separate variant build directory trees for a given source directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConstruct:
+
+ cppdefines = [\*(AqFOO\*(Aq]
+ Export("cppdefines")
+ SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqfoo\*(Aq)
+
+ cppdefines = [\*(AqBAR\*(Aq]
+ Export("cppdefines")
+ SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbar\*(Aq)
+
+src/SConscript:
+
+ Import("cppdefines")
+ env = Environment(CPPDEFINES = cppdefines)
+ env\&.Program(target = \*(Aqsrc\*(Aq, source = \*(Aqsrc\&.c\*(Aq)
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Note the use of the Export() method to set the "cppdefines" variable to a different value each time we call the SConscript function\&.
+.SS "Hierarchical Build of Two Libraries Linked With a Program"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+SConstruct:
+
+ env = Environment(LIBPATH = [\*(Aq#libA\*(Aq, \*(Aq#libB\*(Aq])
+ Export(\*(Aqenv\*(Aq)
+ SConscript(\*(AqlibA/SConscript\*(Aq)
+ SConscript(\*(AqlibB/SConscript\*(Aq)
+ SConscript(\*(AqMain/SConscript\*(Aq)
+
+libA/SConscript:
+
+ Import(\*(Aqenv\*(Aq)
+ env\&.Library(\*(Aqa\*(Aq, Split(\*(Aqa1\&.c a2\&.c a3\&.c\*(Aq))
+
+libB/SConscript:
+
+ Import(\*(Aqenv\*(Aq)
+ env\&.Library(\*(Aqb\*(Aq, Split(\*(Aqb1\&.c b2\&.c b3\&.c\*(Aq))
+
+Main/SConscript:
+
+ Import(\*(Aqenv\*(Aq)
+ e = env\&.Copy(LIBS = [\*(Aqa\*(Aq, \*(Aqb\*(Aq])
+ e\&.Program(\*(Aqfoo\*(Aq, Split(\*(Aqm1\&.c m2\&.c m3\&.c\*(Aq))
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The \*(Aq#\*(Aq in the LIBPATH directories specify that they\*(Aqre relative to the top\-level directory, so they don\*(Aqt turn into "Main/libA" when they\*(Aqre used in Main/SConscript\&.
+.PP
+Specifying only \*(Aqa\*(Aq and \*(Aqb\*(Aq for the library names allows SCons to append the appropriate library prefix and suffix for the current platform (for example, \*(Aqliba\&.a\*(Aq on POSIX systems, \*(Aqa\&.lib\*(Aq on Windows)\&.
+.SS "Customizing construction variables from the command line\&."
+.PP
+The following would allow the C compiler to be specified on the command line or in the file custom\&.py\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+vars = Variables(\*(Aqcustom\&.py\*(Aq)
+vars\&.Add(\*(AqCC\*(Aq, \*(AqThe C compiler\&.\*(Aq)
+env = Environment(variables=vars)
+Help(vars\&.GenerateHelpText(env))
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The user could specify the C compiler on the command line:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+scons "CC=my_cc"
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or in the custom\&.py file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+CC = \*(Aqmy_cc\*(Aq
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+or get documentation on the options:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+$ scons \-h
+
+CC: The C compiler\&.
+ default: None
+ actual: cc
+
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Using Microsoft Visual C++ precompiled headers"
+.PP
+Since windows\&.h includes everything and the kitchen sink, it can take quite some time to compile it over and over again for a bunch of object files, so Microsoft provides a mechanism to compile a set of headers once and then include the previously compiled headers in any object file\&. This technology is called precompiled headers\&. The general recipe is to create a file named "StdAfx\&.cpp" that includes a single header named "StdAfx\&.h", and then include every header you want to precompile in "StdAfx\&.h", and finally include "StdAfx\&.h" as the first header in all the source files you are compiling to object files\&. For example:
+.PP
+StdAfx\&.h:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+#include <windows\&.h>
+#include <my_big_header\&.h>
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+StdAfx\&.cpp:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+#include <StdAfx\&.h>
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Foo\&.cpp:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+#include <StdAfx\&.h>
+
+/* do some stuff */
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+Bar\&.cpp:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+#include <StdAfx\&.h>
+
+/* do some other stuff */
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+SConstruct:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env=Environment()
+env[\*(AqPCHSTOP\*(Aq] = \*(AqStdAfx\&.h\*(Aq
+env[\*(AqPCH\*(Aq] = env\&.PCH(\*(AqStdAfx\&.cpp\*(Aq)[0]
+env\&.Program(\*(AqMyApp\*(Aq, [\*(AqFoo\&.cpp\*(Aq, \*(AqBar\&.cpp\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+For more information see the document for the PCH builder, and the PCH and PCHSTOP construction variables\&. To learn about the details of precompiled headers consult the MSDN documention for /Yc, /Yu, and /Yp\&.
+.SS "Using Microsoft Visual C++ external debugging information"
+.PP
+Since including debugging information in programs and shared libraries can cause their size to increase significantly, Microsoft provides a mechanism for including the debugging information in an external file called a PDB file\&. SCons supports PDB files through the PDB construction variable\&.
+.PP
+SConstruct:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+env=Environment()
+env[\*(AqPDB\*(Aq] = \*(AqMyApp\&.pdb\*(Aq
+env\&.Program(\*(AqMyApp\*(Aq, [\*(AqFoo\&.cpp\*(Aq, \*(AqBar\&.cpp\*(Aq])
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+For more information see the document for the PDB construction variable\&.
+.SH "ENVIRONMENT"
+.PP
+SCONS_LIB_DIR
+.RS 4
+Specifies the directory that contains the SCons Python module directory (e\&.g\&. /home/aroach/scons\-src\-0\&.01/src/engine)\&.
+.RE
+.PP
+SCONSFLAGS
+.RS 4
+A string of options that will be used by scons in addition to those passed on the command line\&.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBscons\fR
+User Manual,
+\fBscons\fR
+Design Document,
+\fBscons\fR
+source code\&.
+.SH "AUTHORS"
+.PP
+Originally: Steven Knight <knight@baldmt\&.com> and Anthony Roach <aroach@electriceyeball\&.com> Since 2010: The SCons Development Team <scons\-dev@scons\&.org>
+.SH "AUTHORS"
+.PP
+\fBSteven Knight\fR
+.RS 4
+Author.
+.RE
+.PP
+\fBSteven Knight and the SCons Development Team\fR
+.SH "COPYRIGHT"
+.br
+Copyright \(co 2004 - 2015 The SCons Foundation
+.br
diff --git a/3rdParty/SCons/scons-2.4.0/sconsign.1 b/3rdParty/SCons/scons-2.4.0/sconsign.1
new file mode 100644
index 0000000..ea9335c
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/sconsign.1
@@ -0,0 +1,164 @@
+'\" t
+.\" Title: SCONSIGN
+.\" Author: [see the "AUTHORS" section]
+.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
+.\" Date: 09/21/2015
+.\" Manual: SCons 2.4.0
+.\" Source: SCons 2.4.0
+.\" Language: English
+.\"
+.TH "SCONSIGN" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\" -----------------------------------------------------------------
+.\" * set default formatting
+.\" -----------------------------------------------------------------
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.\" -----------------------------------------------------------------
+.\" * MAIN CONTENT STARTS HERE *
+.\" -----------------------------------------------------------------
+.SH "NAME"
+sconsign \- print SCons \&.sconsign file information
+.SH "SYNOPSIS"
+.HP \w'\fBsconsign\fR\ 'u
+\fBsconsign\fR [\fIoptions\fR...] \fIfile\fR [\fI\&.\&.\&.\fR]
+.SH "DESCRIPTION"
+.PP
+The
+\fBsconsign\fR
+command displays the contents of one or more
+\fB\&.sconsign\fR
+files specified by the user\&.
+.PP
+By default,
+\fBsconsign\fR
+dumps the entire contents of the specified file(s)\&. Each entry is printed in the following format:
+.PP
+file: signature timestamp length implicit_dependency_1: signature timestamp length implicit_dependency_2: signature timestamp length action_signature [action string]
+.PP
+\fBNone\fR
+is printed in place of any missing timestamp, bsig, or csig values for any entry or any of its dependencies\&. If the entry has no implicit dependencies, or no build action, the lines are simply omitted\&.
+.PP
+By default,
+\fBsconsign\fR
+assumes that any
+\fIfile\fR
+arguments that end with a
+\fB\&.dbm\fR
+suffix contains signature entries for more than one directory (that is, was specified by the
+\fBSConsignFile ()\fR
+function)\&. Any
+\fIfile\fR
+argument that does not end in
+\fB\&.dbm\fR
+is assumed to be a traditional
+\fB\&.sconsign\fR
+file containing the signature entries for a single directory\&. An explicit format may be specified using the
+\fB\-f\fR
+or
+\fB\-\-file=\fR
+options\&.
+.SH "OPTIONS"
+.PP
+Various options control what information is printed and the format:
+.PP
+\-a, \-\-act, \-\-action
+.RS 4
+Prints the build action information for all entries or the specified entries\&.
+.RE
+.PP
+\-c, \-\-csig
+.RS 4
+Prints the content signature (csig) information for all entries or the specified entries\&.
+.RE
+.PP
+\-d DIRECTORY, \-\-dir=DIRECTORY
+.RS 4
+When the signatures are being read from a
+\fB\&.dbm\fR
+file, or the
+\fB\-f dbm\fR
+or
+\fB\-\-format=dbm\fR
+options are used, prints information about only the signatures for entries in the specified
+\fIDIRECTORY\fR\&.
+.RE
+.PP
+\-e ENTRY, \-\-entry=ENTRY
+.RS 4
+Prints information about only the specified
+\fIENTRY\fR\&. Multiple \-e options may be used, in which case information about each
+\fIENTRY\fR
+is printed in the order in which the options are specified on the command line\&.
+.RE
+.PP
+\-f FORMAT, \-\-format=FORMAT
+.RS 4
+The file(s) to be printed are in the specified
+\fIFORMAT\fR\&. Legal values are
+\fBdbm\fR
+(the DBM format used when the
+\fBSConsignFile\fR() function is used) or
+\fBsconsign\fR
+(the default format used for an individual
+\fB\&.sconsign\fR
+file in each directory)\&.
+.RE
+.PP
+\-h, \-\-help
+.RS 4
+Prints a help message and exits\&.
+.RE
+.PP
+\-i, \-\-implicit
+.RS 4
+Prints the list of cached implicit dependencies for all entries or the the specified entries\&.
+.RE
+.PP
+\-\-raw
+.RS 4
+Prints a pretty\-printed representation of the raw Python dictionary that holds build information about individual entry (both the entry itself or its implicit dependencies)\&. An entry\*(Aqs build action is still printed in its usual format\&.
+.RE
+.PP
+\-r, \-\-readable
+.RS 4
+Prints timestamps in a human\-readable string, enclosed in single quotes\&.
+.RE
+.PP
+\-t, \-\-timestamp
+.RS 4
+Prints the timestamp information for all entries or the specified entries\&.
+.RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Prints labels identifying each field being printed\&.
+.RE
+.SH "ENVIRONMENT"
+.PP
+SCONS_LIB_DIR
+.RS 4
+Specifies the directory that contains the SCons Python module directory (e\&.g\&. /home/aroach/scons\-src\-0\&.01/src/engine)\&. on the command line\&.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBscons\fR,
+\fBscons\fR
+User Manual,
+\fBscons\fR
+Design Document,
+\fBscons\fR
+source code\&.
+.SH "AUTHORS"
+.PP
+Steven Knight <knight at baldmt dot com>
diff --git a/3rdParty/SCons/scons.py b/3rdParty/SCons/scons-2.4.0/script/scons
index c95bfac..0e59647 100755..100644
--- a/3rdParty/SCons/scons.py
+++ b/3rdParty/SCons/scons-2.4.0/script/scons
@@ -2,7 +2,7 @@
#
# SCons - a Software Constructor
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -22,24 +22,23 @@
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-__revision__ = "src/script/scons.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/script/scons.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-__version__ = "2.0.0.final.0"
+__version__ = "2.4.0"
-__build__ = "r5023"
+__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-__buildsys__ = "scons-dev"
+__buildsys__ = "hpmicrodog"
-__date__ = "2010/06/14 22:05:46"
+__date__ = "2015/09/21 14:03:43"
-__developer__ = "scons"
+__developer__ = "bdbaddog"
import os
-import os.path
import sys
+
##############################################################################
# BEGIN STANDARD SCons SCRIPT HEADER
#
@@ -57,17 +56,12 @@ import sys
# engine modules if they're in either directory.
-# Check to see if the python version is > 3.0 which is currently unsupported
-# If so exit with error message
-try:
- if sys.version_info >= (3,0,0):
- msg = "scons: *** SCons version %s does not run under Python version %s.\n"
- sys.stderr.write(msg % (__version__, sys.version.split()[0]))
- sys.exit(1)
-except AttributeError:
- # Pre-1.6 Python has no sys.version_info
- # No need to check version as we then know the version is < 3.0.0 and supported
- pass
+if sys.version_info >= (3,0,0):
+ msg = "scons: *** SCons version %s does not run under Python version %s.\n\
+Python 3 is not yet supported.\n"
+ sys.stderr.write(msg % (__version__, sys.version.split()[0]))
+ sys.exit(1)
+
script_dir = sys.path[0]
@@ -79,6 +73,11 @@ libs = []
if "SCONS_LIB_DIR" in os.environ:
libs.append(os.environ["SCONS_LIB_DIR"])
+# - running from source takes priority (since 2.3.2), excluding SCONS_LIB_DIR settings
+script_path = os.path.abspath(os.path.dirname(__file__))
+source_path = os.path.join(script_path, '..', 'engine')
+libs.append(source_path)
+
local_version = 'scons-local-' + __version__
local = 'scons-local'
if script_dir:
@@ -89,8 +88,24 @@ libs.append(os.path.abspath(local))
scons_version = 'scons-%s' % __version__
+# preferred order of scons lookup paths
prefs = []
+
+# - running from egg check
+try:
+ import pkg_resources
+except ImportError:
+ pass
+else:
+ # when running from an egg add the egg's directory
+ try:
+ d = pkg_resources.get_distribution('scons')
+ except pkg_resources.DistributionNotFound:
+ pass
+ else:
+ prefs.append(d.location)
+
if sys.platform == 'win32':
# sys.prefix is (likely) C:\Python*;
# check only C:\Python*.
@@ -159,19 +174,6 @@ else:
# Check /usr/libfoo/scons*.
prefs.append(libpath)
- try:
- import pkg_resources
- except ImportError:
- pass
- else:
- # when running from an egg add the egg's directory
- try:
- d = pkg_resources.get_distribution('scons')
- except pkg_resources.DistributionNotFound:
- pass
- else:
- prefs.append(d.location)
-
# Look first for 'scons-__version__' in all of our preference libs,
# then for 'scons'.
libs.extend([os.path.join(x, scons_version) for x in prefs])
@@ -184,7 +186,14 @@ sys.path = libs + sys.path
##############################################################################
if __name__ == "__main__":
- import SCons.Script
+ try:
+ import SCons.Script
+ except:
+ print("Import failed. Unable to find SCons files in:")
+ for path in libs:
+ print(" %s" % path)
+ raise
+
# this does all the work, and calls sys.exit
# with the proper exit status when done.
SCons.Script.main()
diff --git a/3rdParty/SCons/scons-time.py b/3rdParty/SCons/scons-2.4.0/script/scons-time
index 36c1134..f37d906 100755..100644
--- a/3rdParty/SCons/scons-time.py
+++ b/3rdParty/SCons/scons-2.4.0/script/scons-time
@@ -9,7 +9,7 @@
#
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -32,7 +32,7 @@
from __future__ import division
from __future__ import nested_scopes
-__revision__ = "src/script/scons-time.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/script/scons-time.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
import getopt
import glob
diff --git a/3rdParty/SCons/scons-2.4.0/script/scons.bat b/3rdParty/SCons/scons-2.4.0/script/scons.bat
new file mode 100644
index 0000000..bda2baa
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/script/scons.bat
@@ -0,0 +1,34 @@
+@REM Copyright (c) 2001 - 2015 The SCons Foundation
+@REM src/script/scons.bat rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
+@echo off
+set SCONS_ERRORLEVEL=
+if "%OS%" == "Windows_NT" goto WinNT
+
+@REM for 9x/Me you better not have more than 9 args
+python -c "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-2.4.0'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons-2.4.0'), join(sys.prefix, 'scons')] + sys.path; import SCons.Script; SCons.Script.main()" %1 %2 %3 %4 %5 %6 %7 %8 %9
+@REM no way to set exit status of this script for 9x/Me
+goto endscons
+
+@REM Credit where credit is due: we return the exit code despite our
+@REM use of setlocal+endlocal using a technique from Bear's Journal:
+@REM http://code-bear.com/bearlog/2007/06/01/getting-the-exit-code-from-a-batch-file-that-is-run-from-a-python-program/
+
+:WinNT
+setlocal
+@REM ensure the script will be executed with the Python it was installed for
+set path=%~dp0;%~dp0..;%path%
+@REM try the script named as the .bat file in current dir, then in Scripts subdir
+set scriptname=%~dp0%~n0.py
+if not exist "%scriptname%" set scriptname=%~dp0Scripts\%~n0.py
+python "%scriptname%" %*
+endlocal & set SCONS_ERRORLEVEL=%ERRORLEVEL%
+
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto returncode
+if errorlevel 9009 echo you do not have python in your PATH
+goto endscons
+
+:returncode
+exit /B %SCONS_ERRORLEVEL%
+
+:endscons
+call :returncode %SCONS_ERRORLEVEL%
diff --git a/3rdParty/SCons/sconsign.py b/3rdParty/SCons/scons-2.4.0/script/sconsign
index c1f9632..35dad8a 100755..100644
--- a/3rdParty/SCons/sconsign.py
+++ b/3rdParty/SCons/scons-2.4.0/script/sconsign
@@ -2,7 +2,7 @@
#
# SCons - a Software Constructor
#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
+# Copyright (c) 2001 - 2015 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -23,21 +23,20 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-__revision__ = "src/script/sconsign.py 5023 2010/06/14 22:05:46 scons"
+__revision__ = "src/script/sconsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-__version__ = "2.0.0.final.0"
+__version__ = "2.4.0"
-__build__ = "r5023"
+__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-__buildsys__ = "scons-dev"
+__buildsys__ = "hpmicrodog"
-__date__ = "2010/06/14 22:05:46"
+__date__ = "2015/09/21 14:03:43"
-__developer__ = "scons"
+__developer__ = "bdbaddog"
import os
import sys
-import time
##############################################################################
# BEGIN STANDARD SCons SCRIPT HEADER
@@ -75,8 +74,22 @@ libs.append(os.path.abspath(local))
scons_version = 'scons-%s' % __version__
+# preferred order of scons lookup paths
prefs = []
+try:
+ import pkg_resources
+except ImportError:
+ pass
+else:
+ # when running from an egg add the egg's directory
+ try:
+ d = pkg_resources.get_distribution('scons')
+ except pkg_resources.DistributionNotFound:
+ pass
+ else:
+ prefs.append(d.location)
+
if sys.platform == 'win32':
# sys.prefix is (likely) C:\Python*;
# check only C:\Python*.
@@ -145,19 +158,6 @@ else:
# Check /usr/libfoo/scons*.
prefs.append(libpath)
- try:
- import pkg_resources
- except ImportError:
- pass
- else:
- # when running from an egg add the egg's directory
- try:
- d = pkg_resources.get_distribution('scons')
- except pkg_resources.DistributionNotFound:
- pass
- else:
- prefs.append(d.location)
-
# Look first for 'scons-__version__' in all of our preference libs,
# then for 'scons'.
libs.extend([os.path.join(x, scons_version) for x in prefs])
@@ -172,6 +172,7 @@ sys.path = libs + sys.path
import SCons.compat # so pickle will import cPickle instead
import whichdb
+import time
import pickle
import imp
@@ -277,7 +278,7 @@ def field(name, entry, verbose=Verbose):
def nodeinfo_raw(name, ninfo, prefix=""):
# This just formats the dictionary, which we would normally use str()
# to do, except that we want the keys sorted for deterministic output.
- d = ninfo.__dict__
+ d = ninfo.__getstate__()
try:
keys = ninfo.field_list + ['_version_id']
except AttributeError:
diff --git a/3rdParty/SCons/scons-2.4.0/setup.cfg b/3rdParty/SCons/scons-2.4.0/setup.cfg
new file mode 100644
index 0000000..f04ca1b
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/setup.cfg
@@ -0,0 +1,5 @@
+[bdist_rpm]
+group = Development/Tools
+
+[bdist_wininst]
+title = SCons - a software construction tool
diff --git a/3rdParty/SCons/scons-2.4.0/setup.py b/3rdParty/SCons/scons-2.4.0/setup.py
new file mode 100644
index 0000000..d5bcc10
--- /dev/null
+++ b/3rdParty/SCons/scons-2.4.0/setup.py
@@ -0,0 +1,515 @@
+#
+# Copyright (c) 2001 - 2015 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+"""
+NOTE: Installed SCons is not importable like usual Python packages. It is
+ executed explicitly with command line scripts. This allows multiple
+ SCons versions to coexist within single Python installation, which
+ is critical for enterprise build cases. Explicit invokation is
+ necessary to avoid confusion over which version of SCons is active.
+
+ By default SCons is installed into versioned directory, e.g.
+ site-packages/scons-2.1.0.alpha.20101125 and much of the stuff
+ below is dedicated to make it happen on various platforms.
+"""
+
+__revision__ = "src/setup.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
+
+import os
+import stat
+import sys
+
+Version = "2.4.0"
+
+man_pages = [
+ 'scons.1',
+ 'sconsign.1',
+ 'scons-time.1',
+]
+
+# Exit with error if trying to install with Python >= 3.0
+if sys.version_info >= (3,0,0):
+ msg = "scons: *** SCons does not run under Python version %s.\n\
+Python 3 and above are not yet supported.\n"
+ sys.stderr.write(msg % (sys.version.split()[0]))
+ sys.exit(1)
+
+
+# change to setup.py directory if it was executed from other dir
+(head, tail) = os.path.split(sys.argv[0])
+if head:
+ os.chdir(head)
+ sys.argv[0] = tail
+
+
+# flag if setup.py is run on win32 or _for_ win32 platform,
+# (when building windows installer on linux, for example)
+is_win32 = 0
+if not sys.platform == 'win32':
+ try:
+ if sys.argv[1] == 'bdist_wininst':
+ is_win32 = 1
+ except IndexError:
+ pass
+else:
+ is_win32 = 1
+
+
+import distutils
+import distutils.core
+import distutils.command.install
+import distutils.command.install_data
+import distutils.command.install_lib
+import distutils.command.install_scripts
+import distutils.command.build_scripts
+import distutils.msvccompiler
+
+def get_build_version():
+ """ monkey patch distutils msvc version if we're not on windows.
+ We need to use vc version 9 for python 2.7.x and it defaults to 6
+ for non-windows platforms and there is no way to override it besides
+ monkey patching"""
+ return 9
+
+distutils.msvccompiler.get_build_version = get_build_version
+
+_install = distutils.command.install.install
+_install_data = distutils.command.install_data.install_data
+_install_lib = distutils.command.install_lib.install_lib
+_install_scripts = distutils.command.install_scripts.install_scripts
+_build_scripts = distutils.command.build_scripts.build_scripts
+
+class _options(object):
+ pass
+
+Options = _options()
+
+Installed = []
+
+def set_explicitly(name, args):
+ """
+ Return if the installation directory was set explicitly by the
+ user on the command line. This is complicated by the fact that
+ "install --install-lib=/foo" gets turned into "install_lib
+ --install-dir=/foo" internally.
+ """
+ if args[0] == "install_" + name:
+ s = "--install-dir="
+ else:
+ # The command is something else (usually "install")
+ s = "--install-%s=" % name
+ set = 0
+ length = len(s)
+ for a in args[1:]:
+ if a[:length] == s:
+ set = 1
+ break
+ return set
+
+class install(_install):
+ user_options = _install.user_options + [
+ ('no-scons-script', None,
+ "don't install 'scons', only install 'scons-%s'" % Version),
+ ('no-version-script', None,
+ "don't install 'scons-%s', only install 'scons'" % Version),
+ ('install-bat', None,
+ "install 'scons.bat' script"),
+ ('no-install-bat', None,
+ "do not install 'scons.bat' script"),
+ ('install-man', None,
+ "install SCons man pages"),
+ ('no-install-man', None,
+ "do not install SCons man pages"),
+ ('standard-lib', None,
+ "install SCons library in standard Python location"),
+ ('standalone-lib', None,
+ "install SCons library in separate standalone directory"),
+ ('version-lib', None,
+ "install SCons library in version-numbered directory"),
+ ]
+ boolean_options = _install.boolean_options + [
+ 'no-scons-script',
+ 'no-version-script',
+ 'install-bat',
+ 'no-install-bat',
+ 'install-man',
+ 'no-install-man',
+ 'standard-lib',
+ 'standalone-lib',
+ 'version-lib'
+ ]
+
+ if hasattr(os, 'link'):
+ user_options.append(
+ ('hardlink-scons', None,
+ "hard link 'scons' to the version-numbered script, don't make a separate 'scons' copy"),
+ )
+ boolean_options.append('hardlink-script')
+
+ if hasattr(os, 'symlink'):
+ user_options.append(
+ ('symlink-scons', None,
+ "make 'scons' a symbolic link to the version-numbered script, don't make a separate 'scons' copy"),
+ )
+ boolean_options.append('symlink-script')
+
+ def initialize_options(self):
+ _install.initialize_options(self)
+ self.no_scons_script = 0
+ self.no_version_script = 0
+ self.install_bat = 0
+ self.no_install_bat = not is_win32
+ self.install_man = 0
+ self.no_install_man = is_win32
+ self.standard_lib = 0
+ self.standalone_lib = 0
+ self.version_lib = 0
+ self.hardlink_scons = 0
+ self.symlink_scons = 0
+ # Don't warn about having to put the library directory in the
+ # search path.
+ self.warn_dir = 0
+
+ def finalize_options(self):
+ _install.finalize_options(self)
+ if self.install_bat:
+ Options.install_bat = 1
+ else:
+ Options.install_bat = not self.no_install_bat
+ if self.install_man:
+ Options.install_man = 1
+ else:
+ Options.install_man = not self.no_install_man
+ Options.standard_lib = self.standard_lib
+ Options.standalone_lib = self.standalone_lib
+ Options.version_lib = self.version_lib
+ Options.install_scons_script = not self.no_scons_script
+ Options.install_version_script = not self.no_version_script
+ Options.hardlink_scons = self.hardlink_scons
+ Options.symlink_scons = self.symlink_scons
+
+def get_scons_prefix(libdir, is_win32):
+ """
+ Return the right prefix for SCons library installation. Find
+ this by starting with the library installation directory
+ (.../site-packages, most likely) and crawling back up until we reach
+ a directory name beginning with "python" (or "Python").
+ """
+ drive, head = os.path.splitdrive(libdir)
+ while head:
+ if head == os.sep:
+ break
+ head, tail = os.path.split(head)
+ if tail.lower()[:6] == "python":
+ # Found the Python library directory...
+ if is_win32:
+ # ...on Win32 systems, "scons" goes in the directory:
+ # C:\PythonXX => C:\PythonXX\scons
+ return os.path.join(drive + head, tail)
+ else:
+ # ...on other systems, "scons" goes above the directory:
+ # /usr/lib/pythonX.X => /usr/lib/scons
+ return os.path.join(drive + head)
+ return libdir
+
+def force_to_usr_local(self):
+ """
+ A hack to decide if we need to "force" the installation directories
+ to be under /usr/local. This is because Mac Os X Tiger and
+ Leopard, by default, put the libraries and scripts in their own
+ directories under /Library or /System/Library.
+ """
+ return (sys.platform[:6] == 'darwin' and
+ (self.install_dir[:9] == '/Library/' or
+ self.install_dir[:16] == '/System/Library/'))
+
+class install_lib(_install_lib):
+ def finalize_options(self):
+ _install_lib.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local/lib'
+ args = self.distribution.script_args
+ if not set_explicitly("lib", args):
+ # They didn't explicitly specify the installation
+ # directory for libraries...
+ is_win32 = sys.platform == "win32" or args[0] == 'bdist_wininst'
+ prefix = get_scons_prefix(self.install_dir, is_win32)
+ if Options.standalone_lib:
+ # ...but they asked for a standalone directory.
+ self.install_dir = os.path.join(prefix, "scons")
+ elif Options.version_lib or not Options.standard_lib:
+ # ...they asked for a version-specific directory,
+ # or they get it by default.
+ self.install_dir = os.path.join(prefix, "scons-%s" % Version)
+
+ msg = "Installed SCons library modules into %s" % self.install_dir
+ Installed.append(msg)
+
+class install_scripts(_install_scripts):
+ def finalize_options(self):
+ _install_scripts.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local/bin'
+ self.build_dir = os.path.join('build', 'scripts')
+ msg = "Installed SCons scripts into %s" % self.install_dir
+ Installed.append(msg)
+
+ def do_nothing(self, *args, **kw):
+ pass
+
+ def hardlink_scons(self, src, dst, ver):
+ try: os.unlink(dst)
+ except OSError: pass
+ os.link(ver, dst)
+
+ def symlink_scons(self, src, dst, ver):
+ try: os.unlink(dst)
+ except OSError: pass
+ os.symlink(os.path.split(ver)[1], dst)
+
+ def copy_scons(self, src, dst, *args):
+ try: os.unlink(dst)
+ except OSError: pass
+ self.copy_file(src, dst)
+ self.outfiles.append(dst)
+
+ def run(self):
+ # --- distutils copy/paste ---
+ if not self.skip_build:
+ self.run_command('build_scripts')
+ # --- /distutils copy/paste ---
+
+ # Custom SCons installation stuff.
+ if Options.hardlink_scons:
+ create_basename_script = self.hardlink_scons
+ elif Options.symlink_scons:
+ create_basename_script = self.symlink_scons
+ elif Options.install_scons_script:
+ create_basename_script = self.copy_scons
+ else:
+ create_basename_script = self.do_nothing
+
+ if Options.install_version_script:
+ create_version_script = self.copy_scons
+ else:
+ create_version_script = self.do_nothing
+
+ inputs = self.get_inputs()
+ bat_scripts = [x for x in inputs if x[-4:] == '.bat']
+ non_bat_scripts = [x for x in inputs if x[-4:] != '.bat']
+
+ self.outfiles = []
+ self.mkpath(self.install_dir)
+
+ for src in non_bat_scripts:
+ base = os.path.basename(src)
+ scons = os.path.join(self.install_dir, base)
+ scons_ver = scons + '-' + Version
+ if is_win32:
+ scons += '.py'
+ scons_ver += '.py'
+ create_version_script(src, scons_ver)
+ create_basename_script(src, scons, scons_ver)
+
+ if Options.install_bat:
+ if is_win32:
+ bat_install_dir = get_scons_prefix(self.install_dir, is_win32)
+ else:
+ bat_install_dir = self.install_dir
+ for src in bat_scripts:
+ scons_bat = os.path.join(bat_install_dir, 'scons.bat')
+ scons_version_bat = os.path.join(bat_install_dir,
+ 'scons-' + Version + '.bat')
+ self.copy_scons(src, scons_bat)
+ self.copy_scons(src, scons_version_bat)
+
+ # --- distutils copy/paste ---
+ if os.name == 'posix':
+ # Set the executable bits (owner, group, and world) on
+ # all the scripts we just installed.
+ for file in self.get_outputs():
+ if self.dry_run:
+ # log.info("changing mode of %s", file)
+ pass
+ else:
+ # Use symbolic versions of permissions so this script doesn't fail to parse under python3.x
+ exec_and_read_permission = stat.S_IXOTH | stat.S_IXUSR | stat.S_IXGRP | stat.S_IROTH | stat.S_IRUSR | stat.S_IRGRP
+ mode_mask = 4095 # Octal 07777 used because python3 has different octal syntax than python 2
+ mode = ((os.stat(file)[stat.ST_MODE]) | exec_and_read_permission) & mode_mask
+ # log.info("changing mode of %s to %o", file, mode)
+ os.chmod(file, mode)
+ # --- /distutils copy/paste ---
+
+class build_scripts(_build_scripts):
+ def finalize_options(self):
+ _build_scripts.finalize_options(self)
+ self.build_dir = os.path.join('build', 'scripts')
+
+class install_data(_install_data):
+ def initialize_options(self):
+ _install_data.initialize_options(self)
+ def finalize_options(self):
+ _install_data.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local'
+ if Options.install_man:
+ if is_win32:
+ dir = 'Doc'
+ else:
+ dir = os.path.join('man', 'man1')
+ self.data_files = [(dir, man_pages)]
+ man_dir = os.path.join(self.install_dir, dir)
+ msg = "Installed SCons man pages into %s" % man_dir
+ Installed.append(msg)
+ else:
+ self.data_files = []
+
+description = "Open Source next-generation build tool."
+
+long_description = """Open Source next-generation build tool.
+Improved, cross-platform substitute for the classic Make
+utility. In short, SCons is an easier, more reliable
+and faster way to build software."""
+
+scripts = [
+ 'script/scons',
+ 'script/sconsign',
+ 'script/scons-time',
+
+ # We include scons.bat in the list of scripts, even on UNIX systems,
+ # because we provide an option to allow it be installed explicitly,
+ # for example if you're installing from UNIX on a share that's
+ # accessible to Windows and you want the scons.bat.
+ 'script/scons.bat',
+]
+
+arguments = {
+ 'name' : "scons",
+ 'version' : Version,
+ 'description' : description,
+ 'long_description' : long_description,
+ 'author' : 'Steven Knight',
+ 'author_email' : 'knight@baldmt.com',
+ 'url' : "http://www.scons.org/",
+ 'packages' : ["SCons",
+ "SCons.compat",
+ "SCons.Node",
+ "SCons.Options",
+ "SCons.Platform",
+ "SCons.Scanner",
+ "SCons.Script",
+ "SCons.Tool",
+ "SCons.Tool.docbook",
+ "SCons.Tool.MSCommon",
+ "SCons.Tool.packaging",
+ "SCons.Variables",
+ ],
+ 'package_dir' : {'' : 'engine',
+ 'SCons.Tool.docbook' : 'engine/SCons/Tool/docbook'},
+ 'package_data' : {'SCons.Tool.docbook' : ['docbook-xsl-1.76.1/*',
+ 'docbook-xsl-1.76.1/common/*',
+ 'docbook-xsl-1.76.1/docsrc/*',
+ 'docbook-xsl-1.76.1/eclipse/*',
+ 'docbook-xsl-1.76.1/epub/*',
+ 'docbook-xsl-1.76.1/epub/bin/*',
+ 'docbook-xsl-1.76.1/epub/bin/lib/*',
+ 'docbook-xsl-1.76.1/epub/bin/xslt/*',
+ 'docbook-xsl-1.76.1/extensions/*',
+ 'docbook-xsl-1.76.1/fo/*',
+ 'docbook-xsl-1.76.1/highlighting/*',
+ 'docbook-xsl-1.76.1/html/*',
+ 'docbook-xsl-1.76.1/htmlhelp/*',
+ 'docbook-xsl-1.76.1/images/*',
+ 'docbook-xsl-1.76.1/images/callouts/*',
+ 'docbook-xsl-1.76.1/images/colorsvg/*',
+ 'docbook-xsl-1.76.1/javahelp/*',
+ 'docbook-xsl-1.76.1/lib/*',
+ 'docbook-xsl-1.76.1/manpages/*',
+ 'docbook-xsl-1.76.1/params/*',
+ 'docbook-xsl-1.76.1/profiling/*',
+ 'docbook-xsl-1.76.1/roundtrip/*',
+ 'docbook-xsl-1.76.1/slides/browser/*',
+ 'docbook-xsl-1.76.1/slides/fo/*',
+ 'docbook-xsl-1.76.1/slides/graphics/*',
+ 'docbook-xsl-1.76.1/slides/graphics/active/*',
+ 'docbook-xsl-1.76.1/slides/graphics/inactive/*',
+ 'docbook-xsl-1.76.1/slides/graphics/toc/*',
+ 'docbook-xsl-1.76.1/slides/html/*',
+ 'docbook-xsl-1.76.1/slides/htmlhelp/*',
+ 'docbook-xsl-1.76.1/slides/keynote/*',
+ 'docbook-xsl-1.76.1/slides/keynote/xsltsl/*',
+ 'docbook-xsl-1.76.1/slides/svg/*',
+ 'docbook-xsl-1.76.1/slides/xhtml/*',
+ 'docbook-xsl-1.76.1/template/*',
+ 'docbook-xsl-1.76.1/tests/*',
+ 'docbook-xsl-1.76.1/tools/bin/*',
+ 'docbook-xsl-1.76.1/tools/make/*',
+ 'docbook-xsl-1.76.1/webhelp/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/css/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/search/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/*',
+ 'docbook-xsl-1.76.1/webhelp/docsrc/*',
+ 'docbook-xsl-1.76.1/webhelp/template/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/css/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/content/search/*',
+ 'docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/*',
+ 'docbook-xsl-1.76.1/webhelp/xsl/*',
+ 'docbook-xsl-1.76.1/website/*',
+ 'docbook-xsl-1.76.1/xhtml/*',
+ 'docbook-xsl-1.76.1/xhtml-1_1/*',
+ 'utils/*']},
+ 'data_files' : [('man/man1', man_pages)],
+ 'scripts' : scripts,
+ 'cmdclass' : {'install' : install,
+ 'install_lib' : install_lib,
+ 'install_data' : install_data,
+ 'install_scripts' : install_scripts,
+ 'build_scripts' : build_scripts}
+}
+
+distutils.core.setup(**arguments)
+
+if Installed:
+ for i in Installed:
+ print(i)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-README b/3rdParty/SCons/scons-README
deleted file mode 100644
index 32b691c..0000000
--- a/3rdParty/SCons/scons-README
+++ /dev/null
@@ -1,204 +0,0 @@
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
-
- SCons - a software construction tool
-
-This is the scons-README file for a version of SCons packaged for local
-execution--that is, execution out of a specific local directory, without
-having to install SCons as a system-wide utility.
-
-You are likely reading this file in one of the following two situations:
-
- 1) You have unpacked an scons-local-{version} package and are
- examining the contents.
-
- In this case, you are presumably interested in using this
- package to include a local copy of SCons with some other
- software that you package, so that you can use SCons to build
- your software without forcing all of your users to have it fully
- installed. Instructions for this can be found below.
-
- If you are not looking to use SCons in this way, then please
- use either the scons-{version} package to install SCons on your
- system, or the scons-src-{version} package if you want the full
- source to SCons, including its packaging code and underlying
- tests and testing infrastructure.
-
- 2) This file was included in some other software package so that
- the package could be built using SCons.
-
- In this case, follow the instructions provided with the
- rest of the software package for how to use SCons to build
- and/or install the software. The file containing build and
- installation instructions will typically be named README or
- INSTALL.
-
-LATEST VERSION
-==============
-
-Before going further, you can check for the latest version of the
-scons-local package, or any SCons package, at the SCons download page:
-
- http://www.scons.org/download.html
-
-
-EXECUTION REQUIREMENTS
-======================
-
-Running SCons requires Python version 2.4 or later. There should be
-no other dependencies or requirements to run SCons.
-
-The default SCons configuration assumes use of the Microsoft Visual C++
-compiler suite on WIN32 systems, and assumes a C compiler named 'cc',
-a C++ compiler named 'c++', and a Fortran compiler named 'g77' (such
-as found in the GNU C compiler suite) on any other type of system.
-You may, of course, override these default values by appropriate
-configuration of Environment construction variables.
-
-
-INSTALLATION
-============
-
-Installation of this package should be as simple as unpacking the
-archive (either .tar.gz or .zip) in any directory (top-level or a
-subdirectory) within the software package with which you want to ship
-SCons.
-
-Once you have installed this package, you should write an SConstruct
-file at the top level of your source tree to build your software as you
-see fit.
-
-Then modify the build/install instructions for your package to instruct
-your users to execute SCons as follows (if you installed this package in
-your top-level directory):
-
- $ python scons.py
-
-Or (if, for example, you installed this package in a subdirectory named
-"scons"):
-
- $ python scons/scons.py
-
-That should be all you have to do. (If it isn't that simple, please let
-us know!)
-
-
-CONTENTS OF THIS PACKAGE
-========================
-
-This scons-local package consists of the following:
-
-scons-LICENSE
- A copy of the copyright and terms under which SCons is
- distributed (the Open Source Initiative-approved MIT license).
-
- A disclaimer has been added to the beginning to make clear that
- this license applies only to SCons, and not to any separate
- software you've written with which you're planning to package
- SCons.
-
-scons-README
- What you're looking at right now.
-
-scons-local-{version}/
- The SCons build engine. This is structured as a Python
- library.
-
-scons.py
- The SCons script itself. The script sets up the Python
- sys.path variable to use the build engine found in the
- scons-local-{version}/ directory in preference to any other
- SCons build engine installed on your system.
-
-
-DOCUMENTATION
-=============
-
-Because this package is intended to be included with other software by
-experienced users, we have not included any SCons documentation in this
-package (other than this scons-README file you're reading right now).
-
-If, however, you need documentation about SCons, then consult any of the
-following from the corresponding scons-{version} or scons-src-{version}
-package:
-
- The RELEASE.txt file (src/RELEASE.txt file in the
- scons-src-{version} package), which contains notes about this
- specific release, including known problems.
-
- The CHANGES.txt file (src/CHANGES.txt file in the
- scons-src-{version} package), which contains a list of changes
- since the previous release.
-
- The scons.1 man page (doc/man/scons.1 in the scons-src-{version}
- package), which contains a section of small examples for getting
- started using SCons.
-
-Additional documentation for SCons is available at:
-
- http://www.scons.org/doc.html
-
-
-LICENSING
-=========
-
-SCons is distributed under the MIT license, a full copy of which is
-available in the scons-LICENSE file in this package. The MIT license is
-an approved Open Source license, which means:
-
- This software is OSI Certified Open Source Software. OSI
- Certified is a certification mark of the Open Source Initiative.
-
-More information about OSI certifications and Open Source software is
-available at:
-
- http://www.opensource.org/
-
-
-REPORTING BUGS
-==============
-
-You can report bugs either by following the "Tracker - Bugs" link
-on the SCons project page:
-
- http://sourceforge.net/projects/scons/
-
-or by sending mail to the SCons developers mailing list:
-
- scons-devel@lists.sourceforge.net
-
-
-MAILING LISTS
-=============
-
-A mailing list for users of SCons is available. You may send questions
-or comments to the list at:
-
- scons-users@lists.sourceforge.net
-
-You may subscribe to the scons-users mailing list at:
-
- http://lists.sourceforge.net/lists/listinfo/scons-users
-
-
-FOR MORE INFORMATION
-====================
-
-Check the SCons web site at:
-
- http://www.scons.org/
-
-
-AUTHOR INFO
-===========
-
-Steven Knight
-knight at baldmt dot com
-http://www.baldmt.com/~knight/
-
-With plenty of help from the SCons Development team:
- Chad Austin
- Charles Crain
- Steve Leblanc
- Anthony Roach
- Terrel Shumway
-
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/posix.py b/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/posix.py
deleted file mode 100644
index 1f19277..0000000
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Platform/posix.py
+++ /dev/null
@@ -1,263 +0,0 @@
-"""SCons.Platform.posix
-
-Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/posix.py 5023 2010/06/14 22:05:46 scons"
-
-import errno
-import os
-import os.path
-import subprocess
-import sys
-import select
-
-import SCons.Util
-from SCons.Platform import TempFileMunge
-
-exitvalmap = {
- 2 : 127,
- 13 : 126,
-}
-
-def escape(arg):
- "escape shell special characters"
- slash = '\\'
- special = '"$()'
-
- arg = arg.replace(slash, slash+slash)
- for c in special:
- arg = arg.replace(c, slash+c)
-
- return '"' + arg + '"'
-
-def exec_system(l, env):
- stat = os.system(' '.join(l))
- if stat & 0xff:
- return stat | 0x80
- return stat >> 8
-
-def exec_spawnvpe(l, env):
- stat = os.spawnvpe(os.P_WAIT, l[0], l, env)
- # os.spawnvpe() returns the actual exit code, not the encoding
- # returned by os.waitpid() or os.system().
- return stat
-
-def exec_fork(l, env):
- pid = os.fork()
- if not pid:
- # Child process.
- exitval = 127
- try:
- os.execvpe(l[0], l, env)
- except OSError, e:
- exitval = exitvalmap.get(e[0], e[0])
- sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
- os._exit(exitval)
- else:
- # Parent process.
- pid, stat = os.waitpid(pid, 0)
- if stat & 0xff:
- return stat | 0x80
- return stat >> 8
-
-def _get_env_command(sh, escape, cmd, args, env):
- s = ' '.join(args)
- if env:
- l = ['env', '-'] + \
- [escape(t[0])+'='+escape(t[1]) for t in env.items()] + \
- [sh, '-c', escape(s)]
- s = ' '.join(l)
- return s
-
-def env_spawn(sh, escape, cmd, args, env):
- return exec_system([_get_env_command( sh, escape, cmd, args, env)], env)
-
-def spawnvpe_spawn(sh, escape, cmd, args, env):
- return exec_spawnvpe([sh, '-c', ' '.join(args)], env)
-
-def fork_spawn(sh, escape, cmd, args, env):
- return exec_fork([sh, '-c', ' '.join(args)], env)
-
-def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr):
- stdout_eof = stderr_eof = 0
- while not (stdout_eof and stderr_eof):
- try:
- (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], [])
- if cmd_stdout in i:
- str = cmd_stdout.read()
- if len(str) == 0:
- stdout_eof = 1
- elif stdout is not None:
- stdout.write(str)
- if cmd_stderr in i:
- str = cmd_stderr.read()
- if len(str) == 0:
- #sys.__stderr__.write( "stderr_eof=1\n" )
- stderr_eof = 1
- else:
- #sys.__stderr__.write( "str(stderr) = %s\n" % str )
- stderr.write(str)
- except select.error, (_errno, _strerror):
- if _errno != errno.EINTR:
- raise
-
-def exec_popen3(l, env, stdout, stderr):
- proc = subprocess.Popen(' '.join(l),
- stdout=stdout,
- stderr=stderr,
- shell=True)
- stat = proc.wait()
- if stat & 0xff:
- return stat | 0x80
- return stat >> 8
-
-def exec_piped_fork(l, env, stdout, stderr):
- # spawn using fork / exec and providing a pipe for the command's
- # stdout / stderr stream
- if stdout != stderr:
- (rFdOut, wFdOut) = os.pipe()
- (rFdErr, wFdErr) = os.pipe()
- else:
- (rFdOut, wFdOut) = os.pipe()
- rFdErr = rFdOut
- wFdErr = wFdOut
- # do the fork
- pid = os.fork()
- if not pid:
- # Child process
- os.close( rFdOut )
- if rFdOut != rFdErr:
- os.close( rFdErr )
- os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ?
- os.dup2( wFdErr, 2 )
- os.close( wFdOut )
- if stdout != stderr:
- os.close( wFdErr )
- exitval = 127
- try:
- os.execvpe(l[0], l, env)
- except OSError, e:
- exitval = exitvalmap.get(e[0], e[0])
- stderr.write("scons: %s: %s\n" % (l[0], e[1]))
- os._exit(exitval)
- else:
- # Parent process
- pid, stat = os.waitpid(pid, 0)
- os.close( wFdOut )
- if stdout != stderr:
- os.close( wFdErr )
- childOut = os.fdopen( rFdOut )
- if stdout != stderr:
- childErr = os.fdopen( rFdErr )
- else:
- childErr = childOut
- process_cmd_output(childOut, childErr, stdout, stderr)
- os.close( rFdOut )
- if stdout != stderr:
- os.close( rFdErr )
- if stat & 0xff:
- return stat | 0x80
- return stat >> 8
-
-def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr):
- # spawn using Popen3 combined with the env command
- # the command name and the command's stdout is written to stdout
- # the command's stderr is written to stderr
- return exec_popen3([_get_env_command(sh, escape, cmd, args, env)],
- env, stdout, stderr)
-
-def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr):
- # spawn using fork / exec and providing a pipe for the command's
- # stdout / stderr stream
- return exec_piped_fork([sh, '-c', ' '.join(args)],
- env, stdout, stderr)
-
-
-
-def generate(env):
- # If os.spawnvpe() exists, we use it to spawn commands. Otherwise
- # if the env utility exists, we use os.system() to spawn commands,
- # finally we fall back on os.fork()/os.exec().
- #
- # os.spawnvpe() is prefered because it is the most efficient. But
- # for Python versions without it, os.system() is prefered because it
- # is claimed that it works better with threads (i.e. -j) and is more
- # efficient than forking Python.
- #
- # NB: Other people on the scons-users mailing list have claimed that
- # os.fork()/os.exec() works better than os.system(). There may just
- # not be a default that works best for all users.
-
- if 'spawnvpe' in os.__dict__:
- spawn = spawnvpe_spawn
- elif env.Detect('env'):
- spawn = env_spawn
- else:
- spawn = fork_spawn
-
- if env.Detect('env'):
- pspawn = piped_env_spawn
- else:
- pspawn = piped_fork_spawn
-
- if 'ENV' not in env:
- env['ENV'] = {}
- env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin'
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.o'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = ''
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
- env['SHLIBPREFIX'] = '$LIBPREFIX'
- env['SHLIBSUFFIX'] = '.so'
- env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
- env['PSPAWN'] = pspawn
- env['SPAWN'] = spawn
- env['SHELL'] = 'sh'
- env['ESCAPE'] = escape
- env['TEMPFILE'] = TempFileMunge
- env['TEMPFILEPREFIX'] = '@'
- #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
- #Note: specific platforms might rise or lower this value
- env['MAXLINELENGTH'] = 128072
-
- # This platform supports RPATH specifications.
- env['__RPATH'] = '$_RPATH'
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py b/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py
deleted file mode 100644
index a269354..0000000
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py
+++ /dev/null
@@ -1,223 +0,0 @@
-"""SCons.Tool.dmd
-
-Tool-specific initialization for the Digital Mars D compiler.
-(http://digitalmars.com/d)
-
-Coded by Andy Friesen (andy@ikagames.com)
-15 November 2003
-
-There are a number of problems with this script at this point in time.
-The one that irritates me the most is the Windows linker setup. The D
-linker doesn't have a way to add lib paths on the commandline, as far
-as I can see. You have to specify paths relative to the SConscript or
-use absolute paths. To hack around it, add '#/blah'. This will link
-blah.lib from the directory where SConstruct resides.
-
-Compiler variables:
- DC - The name of the D compiler to use. Defaults to dmd or gdmd,
- whichever is found.
- DPATH - List of paths to search for import modules.
- DVERSIONS - List of version tags to enable when compiling.
- DDEBUG - List of debug tags to enable when compiling.
-
-Linker related variables:
- LIBS - List of library files to link in.
- DLINK - Name of the linker to use. Defaults to dmd or gdmd.
- DLINKFLAGS - List of linker flags.
-
-Lib tool variables:
- DLIB - Name of the lib tool to use. Defaults to lib.
- DLIBFLAGS - List of flags to pass to the lib tool.
- LIBS - Same as for the linker. (libraries to pull into the .lib)
-"""
-
-#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/dmd.py 5023 2010/06/14 22:05:46 scons"
-
-import os
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Scanner.D
-import SCons.Tool
-
-# Adapted from c++.py
-def isD(source):
- if not source:
- return 0
-
- for s in source:
- if s.sources:
- ext = os.path.splitext(str(s.sources[0]))[1]
- if ext == '.d':
- return 1
- return 0
-
-smart_link = {}
-
-smart_lib = {}
-
-def generate(env):
- global smart_link
- global smart_lib
-
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- DAction = SCons.Action.Action('$DCOM', '$DCOMSTR')
-
- static_obj.add_action('.d', DAction)
- shared_obj.add_action('.d', DAction)
- static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
-
- dc = env.Detect(['dmd', 'gdmd'])
- env['DC'] = dc
- env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
- env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
- env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)} $)'
- env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)'
- env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)'
-
- env['DPATH'] = ['#/']
- env['DFLAGS'] = []
- env['DVERSIONS'] = []
- env['DDEBUG'] = []
-
- if dc:
- # Add the path to the standard library.
- # This is merely for the convenience of the dependency scanner.
- dmd_path = env.WhereIs(dc)
- if dmd_path:
- x = dmd_path.rindex(dc)
- phobosDir = dmd_path[:x] + '/../src/phobos'
- if os.path.isdir(phobosDir):
- env.Append(DPATH = [phobosDir])
-
- env['DINCPREFIX'] = '-I'
- env['DINCSUFFIX'] = ''
- env['DVERPREFIX'] = '-version='
- env['DVERSUFFIX'] = ''
- env['DDEBUGPREFIX'] = '-debug='
- env['DDEBUGSUFFIX'] = ''
- env['DFLAGPREFIX'] = '-'
- env['DFLAGSUFFIX'] = ''
- env['DFILESUFFIX'] = '.d'
-
- # Need to use the Digital Mars linker/lib on windows.
- # *nix can just use GNU link.
- if env['PLATFORM'] == 'win32':
- env['DLINK'] = '$DC'
- env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS'
- env['DLIB'] = 'lib'
- env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS'
-
- env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
- env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)'
- env['DLINKFLAGS'] = []
- env['DLIBLINKPREFIX'] = ''
- env['DLIBLINKSUFFIX'] = '.lib'
- env['DLIBFLAGPREFIX'] = '-'
- env['DLIBFLAGSUFFIX'] = ''
- env['DLINKFLAGPREFIX'] = '-'
- env['DLINKFLAGSUFFIX'] = ''
-
- SCons.Tool.createStaticLibBuilder(env)
-
- # Basically, we hijack the link and ar builders with our own.
- # these builders check for the presence of D source, and swap out
- # the system's defaults for the Digital Mars tools. If there's no D
- # source, then we silently return the previous settings.
- linkcom = env.get('LINKCOM')
- try:
- env['SMART_LINKCOM'] = smart_link[linkcom]
- except KeyError:
- def _smartLink(source, target, env, for_signature,
- defaultLinker=linkcom):
- if isD(source):
- # XXX I'm not sure how to add a $DLINKCOMSTR variable
- # so that it works with this _smartLink() logic,
- # and I don't have a D compiler/linker to try it out,
- # so we'll leave it alone for now.
- return '$DLINKCOM'
- else:
- return defaultLinker
- env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink
-
- arcom = env.get('ARCOM')
- try:
- env['SMART_ARCOM'] = smart_lib[arcom]
- except KeyError:
- def _smartLib(source, target, env, for_signature,
- defaultLib=arcom):
- if isD(source):
- # XXX I'm not sure how to add a $DLIBCOMSTR variable
- # so that it works with this _smartLib() logic, and
- # I don't have a D compiler/archiver to try it out,
- # so we'll leave it alone for now.
- return '$DLIBCOM'
- else:
- return defaultLib
- env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib
-
- # It is worth noting that the final space in these strings is
- # absolutely pivotal. SCons sees these as actions and not generators
- # if it is not there. (very bad)
- env['ARCOM'] = '$SMART_ARCOM '
- env['LINKCOM'] = '$SMART_LINKCOM '
- else: # assuming linux
- linkcom = env.get('LINKCOM')
- try:
- env['SMART_LINKCOM'] = smart_link[linkcom]
- except KeyError:
- def _smartLink(source, target, env, for_signature,
- defaultLinker=linkcom, dc=dc):
- if isD(source):
- try:
- libs = env['LIBS']
- except KeyError:
- libs = []
- if 'phobos' not in libs and 'gphobos' not in libs:
- if dc is 'dmd':
- env.Append(LIBS = ['phobos'])
- elif dc is 'gdmd':
- env.Append(LIBS = ['gphobos'])
- if 'pthread' not in libs:
- env.Append(LIBS = ['pthread'])
- if 'm' not in libs:
- env.Append(LIBS = ['m'])
- return defaultLinker
- env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink
-
- env['LINKCOM'] = '$SMART_LINKCOM '
-
-def exists(env):
- return env.Detect(['dmd', 'gdmd'])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/install.py b/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/install.py
deleted file mode 100644
index 7b61bde..0000000
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/install.py
+++ /dev/null
@@ -1,229 +0,0 @@
-"""SCons.Tool.install
-
-Tool-specific initialization for the install tool.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/install.py 5023 2010/06/14 22:05:46 scons"
-
-import os
-import shutil
-import stat
-
-import SCons.Action
-from SCons.Util import make_path_relative
-
-#
-# We keep track of *all* installed files.
-_INSTALLED_FILES = []
-_UNIQUE_INSTALLED_FILES = None
-
-#
-# Functions doing the actual work of the Install Builder.
-#
-def copyFunc(dest, source, env):
- """Install a source file or directory into a destination by copying,
- (including copying permission/mode bits)."""
-
- if os.path.isdir(source):
- if os.path.exists(dest):
- if not os.path.isdir(dest):
- raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
- else:
- parent = os.path.split(dest)[0]
- if not os.path.exists(parent):
- os.makedirs(parent)
- shutil.copytree(source, dest)
- else:
- shutil.copy2(source, dest)
- st = os.stat(source)
- os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
-
- return 0
-
-def installFunc(target, source, env):
- """Install a source file into a target using the function specified
- as the INSTALL construction variable."""
- try:
- install = env['INSTALL']
- except KeyError:
- raise SCons.Errors.UserError('Missing INSTALL construction variable.')
-
- assert len(target)==len(source), \
- "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
- for t,s in zip(target,source):
- if install(t.get_path(),s.get_path(),env):
- return 1
-
- return 0
-
-def stringFunc(target, source, env):
- installstr = env.get('INSTALLSTR')
- if installstr:
- return env.subst_target_source(installstr, 0, target, source)
- target = str(target[0])
- source = str(source[0])
- if os.path.isdir(source):
- type = 'directory'
- else:
- type = 'file'
- return 'Install %s: "%s" as "%s"' % (type, source, target)
-
-#
-# Emitter functions
-#
-def add_targets_to_INSTALLED_FILES(target, source, env):
- """ an emitter that adds all target files to the list stored in the
- _INSTALLED_FILES global variable. This way all installed files of one
- scons call will be collected.
- """
- global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
- _INSTALLED_FILES.extend(target)
- _UNIQUE_INSTALLED_FILES = None
- return (target, source)
-
-class DESTDIR_factory(object):
- """ a node factory, where all files will be relative to the dir supplied
- in the constructor.
- """
- def __init__(self, env, dir):
- self.env = env
- self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
-
- def Entry(self, name):
- name = make_path_relative(name)
- return self.dir.Entry(name)
-
- def Dir(self, name):
- name = make_path_relative(name)
- return self.dir.Dir(name)
-
-#
-# The Builder Definition
-#
-install_action = SCons.Action.Action(installFunc, stringFunc)
-installas_action = SCons.Action.Action(installFunc, stringFunc)
-
-BaseInstallBuilder = None
-
-def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
- if target and dir:
- import SCons.Errors
- raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
- if not dir:
- dir=target
-
- import SCons.Script
- install_sandbox = SCons.Script.GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- try:
- dnodes = env.arg2nodes(dir, target_factory.Dir)
- except TypeError:
- raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
- sources = env.arg2nodes(source, env.fs.Entry)
- tgt = []
- for dnode in dnodes:
- for src in sources:
- # Prepend './' so the lookup doesn't interpret an initial
- # '#' on the file name portion as meaning the Node should
- # be relative to the top-level SConstruct directory.
- target = env.fs.Entry('.'+os.sep+src.name, dnode)
- #tgt.extend(BaseInstallBuilder(env, target, src, **kw))
- tgt.extend(BaseInstallBuilder(env, target, src, **kw))
- return tgt
-
-def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
- result = []
- for src, tgt in map(lambda x, y: (x, y), source, target):
- #result.extend(BaseInstallBuilder(env, tgt, src, **kw))
- result.extend(BaseInstallBuilder(env, tgt, src, **kw))
- return result
-
-added = None
-
-def generate(env):
-
- from SCons.Script import AddOption, GetOption
- global added
- if not added:
- added = 1
- AddOption('--install-sandbox',
- dest='install_sandbox',
- type="string",
- action="store",
- help='A directory under which all installed files will be placed.')
-
- global BaseInstallBuilder
- if BaseInstallBuilder is None:
- install_sandbox = GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- BaseInstallBuilder = SCons.Builder.Builder(
- action = install_action,
- target_factory = target_factory.Entry,
- source_factory = env.fs.Entry,
- multi = 1,
- emitter = [ add_targets_to_INSTALLED_FILES, ],
- name = 'InstallBuilder')
-
- env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
- env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
-
- # We'd like to initialize this doing something like the following,
- # but there isn't yet support for a ${SOURCE.type} expansion that
- # will print "file" or "directory" depending on what's being
- # installed. For now we punt by not initializing it, and letting
- # the stringFunc() that we put in the action fall back to the
- # hand-crafted default string if it's not set.
- #
- #try:
- # env['INSTALLSTR']
- #except KeyError:
- # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
-
- try:
- env['INSTALL']
- except KeyError:
- env['INSTALL'] = copyFunc
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/link.py b/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/link.py
deleted file mode 100644
index 5905fe9..0000000
--- a/3rdParty/SCons/scons-local-2.0.0.final.0/SCons/Tool/link.py
+++ /dev/null
@@ -1,121 +0,0 @@
-"""SCons.Tool.link
-
-Tool-specific initialization for the generic Posix linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/link.py 5023 2010/06/14 22:05:46 scons"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-import SCons.Warnings
-
-from SCons.Tool.FortranCommon import isfortran
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-issued_mixed_link_warning = False
-
-def smart_link(source, target, env, for_signature):
- has_cplusplus = cplusplus.iscplusplus(source)
- has_fortran = isfortran(env, source)
- if has_cplusplus and has_fortran:
- global issued_mixed_link_warning
- if not issued_mixed_link_warning:
- msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
- "This may generate a buggy executable if the '%s'\n\t" + \
- "compiler does not know how to deal with Fortran runtimes."
- SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
- msg % env.subst('$CXX'))
- issued_mixed_link_warning = True
- return '$CXX'
- elif has_fortran:
- return '$FORTRAN'
- elif has_cplusplus:
- return '$CXX'
- return '$CC'
-
-def shlib_emitter(target, source, env):
- for tgt in target:
- tgt.attributes.shared = 1
- return (target, source)
-
-def generate(env):
- """Add Builders and construction variables for gnulink to an Environment."""
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- # don't set up the emitter, cause AppendUnique will generate a list
- # starting with None :-(
- env.Append(SHLIBEMITTER = [shlib_emitter])
- env['SMARTLINK'] = smart_link
- env['LINK'] = "$SMARTLINK"
- env['LINKFLAGS'] = SCons.Util.CLVar('')
- env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- env['LIBDIRPREFIX']='-L'
- env['LIBDIRSUFFIX']=''
- env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
- env['LIBLINKPREFIX']='-l'
- env['LIBLINKSUFFIX']=''
-
- if env['PLATFORM'] == 'hpux':
- env['SHLIBSUFFIX'] = '.sl'
- elif env['PLATFORM'] == 'aix':
- env['SHLIBSUFFIX'] = '.a'
-
- # For most platforms, a loadable module is the same as a shared
- # library. Platforms which are different can override these, but
- # setting them the same means that LoadableModule works everywhere.
- SCons.Tool.createLoadableModuleBuilder(env)
- env['LDMODULE'] = '$SHLINK'
- # don't set up the emitter, cause AppendUnique will generate a list
- # starting with None :-(
- env.Append(LDMODULEEMITTER='$SHLIBEMITTER')
- env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
- env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
- env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
- env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
-
-
-def exists(env):
- # This module isn't really a Tool on its own, it's common logic for
- # other linkers.
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4: