Commits

Anonymous committed 541d495

Merged revisions 1502-1677,1679-1682,1684-1918,1920-1968,1970-2116,2118-2125,2127-2136,2138 via svnmerge from
http://scons.tigris.org/svn/scons/branches/packaging

................
r1509 | pscholl | 2006-05-30 13:33:58 -0500 (Tue, 30 May 2006) | 5 lines

The first commit:
* a failing testcase.
* a Package() Builder.
................
r1510 | pscholl | 2006-05-31 15:39:42 -0500 (Wed, 31 May 2006) | 4 lines

The test passes, so this doesn't do much but calling the Tar Builder through a
different interface.
................
r1511 | pscholl | 2006-06-01 15:18:21 -0500 (Thu, 01 Jun 2006) | 3 lines

Add targz and tarbz2 packagers.
................
r1512 | pscholl | 2006-06-02 14:16:09 -0500 (Fri, 02 Jun 2006) | 4 lines

* package name generation from "projectname" and "version"
* targz and tarbz2 packager
................
r1513 | pscholl | 2006-06-02 14:24:53 -0500 (Fri, 02 Jun 2006) | 4 lines

* forgot the test for package name generation.
* add the zip packager.
................
r1514 | pscholl | 2006-06-10 15:02:50 -0500 (Sat, 10 Jun 2006) | 6 lines

* add support for "subdir".
* add support for more than one "type" of packager.
* add more testcases.
* add an example/.
................
r1516 | pscholl | 2006-06-19 14:51:44 -0500 (Mon, 19 Jun 2006) | 2 lines

* add a simple rpm testcase
* activate the builddir testcase
................
r1519 | pscholl | 2006-06-22 05:38:40 -0500 (Thu, 22 Jun 2006) | 7 lines

* add a rpm Tool.
* add a rpm Packager abstraction.
* add a new Error Class: EnvironmentError, for errors where the Environment
doesn't supply neccessary tools.
* Change Environment to include the rpm tool per default.
................
r1520 | pscholl | 2006-06-23 13:11:23 -0500 (Fri, 23 Jun 2006) | 5 lines

* create a fake_root_emitter, which puts source file under a new root
* create a rpm_spec_file emitter and actions to create a rpm specfile from a
list of files and a dict with specific keywords.
................
r1521 | pscholl | 2006-06-23 16:19:11 -0500 (Fri, 23 Jun 2006) | 8 lines

* fix the testcase/example. Problem: Proper Installation needs to be done form
rpm. Proper does mean that at least the "Installation Prefix" of the install
target can be specified.
* add an assertion to the rpm builder, that the target of the builder are the
files created by the rpmbuild call.
* hack the rpm_emitter to add possibly created targets of the rpmbuild call.
................
r1522 | pscholl | 2006-06-24 16:41:08 -0500 (Sat, 24 Jun 2006) | 11 lines

* make create_default_target() able to call a create_default_target() in a
chosen packager. This makes it possible to change the default targets for rpm
for example.

* rename fake_root to package_root

* rename subdir argument to package_root

* add method create_default_package_root()
................
r1523 | pscholl | 2006-06-25 09:12:45 -0500 (Sun, 25 Jun 2006) | 4 lines

* make international tags work.
* able to build a rpms iff with a highly specialized "install" target
................
r1524 | pscholl | 2006-06-25 09:55:00 -0500 (Sun, 25 Jun 2006) | 3 lines

* fix older testcases and change to new api
................
r1525 | pscholl | 2006-06-25 13:48:11 -0500 (Sun, 25 Jun 2006) | 1 line

set the rpm _topdir to something under the current build directory, so /usr/src/redhat does not need to be writable
................
r1526 | pscholl | 2006-06-27 09:16:31 -0500 (Tue, 27 Jun 2006) | 4 lines

* towards file tagging
* seperated source and binary packages automatically.
................
r1527 | pscholl | 2006-06-27 15:37:24 -0500 (Tue, 27 Jun 2006) | 1 line

better layout for specfile
................
r1528 | pscholl | 2006-06-28 02:43:29 -0500 (Wed, 28 Jun 2006) | 3 lines

use copy function instead of InstallAs for package_root_emitter()
................
r1529 | pscholl | 2006-06-28 06:40:17 -0500 (Wed, 28 Jun 2006) | 6 lines

* add a Tag() Builder to add packager tag to files.
* add examples for the packaging builder.
* prevent SCons from showing the stderr pipe from rpmbuild.
* clarify the compile() function of rpm specfile builder.
................
r1530 | pscholl | 2006-06-28 09:31:28 -0500 (Wed, 28 Jun 2006) | 3 lines

encoding ...
................
r1531 | pscholl | 2006-07-02 10:35:34 -0500 (Sun, 02 Jul 2006) | 8 lines

* introduce a DESTDIR command line arguments that is honored by the Install()
builders. Major caveat: SCons calculates default targets from the current
working directory. So if DESTDIR is outside of cwd, those files will not be
installed unless part of their path is given as a target ("/" will not work)

* adapt the rpm specfile accordingly.
................
r1532 | pscholl | 2006-07-09 15:52:58 -0500 (Sun, 09 Jul 2006) | 4 lines

Possible to generate WiX xml files and using the wix toolset from
http://wix.sf.net/ it is possible to create non-interactive installs.
................
r1545 | pscholl | 2006-07-26 02:34:38 -0500 (Wed, 26 Jul 2006) | 6 lines

* kill the packageversion tag.
* possible to create msi packages with the default Wix_mondo gui.
* msi honours the installation location of a File.
* x_msi_feature tag is available to split the package up into several parts.
................
r1548 | pscholl | 2006-07-27 10:32:48 -0500 (Thu, 27 Jul 2006) | 4 lines

* fix testcases
* fix wix toolchain lookup
................
r1549 | pscholl | 2006-07-27 11:13:58 -0500 (Thu, 27 Jul 2006) | 4 lines

* add license and license_tag file tags.
* add an example for msi package building.
................
r1591 | pscholl | 2006-08-14 13:32:07 -0500 (Mon, 14 Aug 2006) | 6 lines

Packaging framework refactoring:
* move common code to a superclass.
* Create BinaryPackager and SourcePackager.
* move TagCompiler from rpm to package.py
................
r1592 | pscholl | 2006-08-14 13:42:39 -0500 (Mon, 14 Aug 2006) | 3 lines

change DESTDIR to --install-sandbox
................
r1593 | pscholl | 2006-08-14 14:18:59 -0500 (Mon, 14 Aug 2006) | 1 line

fix msi builder.
................
r1595 | pscholl | 2006-08-15 09:19:05 -0500 (Tue, 15 Aug 2006) | 3 lines

add a ipkg packager.
................
r1596 | pscholl | 2006-08-15 12:09:17 -0500 (Tue, 15 Aug 2006) | 3 lines

small fix for ipk.
................
r1597 | pscholl | 2006-08-15 12:10:13 -0500 (Tue, 15 Aug 2006) | 3 lines

add some forgotten tests.
................
r1598 | pscholl | 2006-08-16 08:49:19 -0500 (Wed, 16 Aug 2006) | 11 lines

* add an ipk packaging example
* fix outstanding problems with ipk:
* split the strip_install_emitter, which strips the InstallBuilder of the
given source list and adds the install_location tag, from the
specfile_emitter.
* therefore the .ipk file is now independent of the *installed* files.

* add a 'architecture' PackageTag for ipk and rpm packages.
* rpm support is currently not working.
................
r1599 | pscholl | 2006-08-16 08:59:39 -0500 (Wed, 16 Aug 2006) | 3 lines

rename x_ipk_architecture -> architecture
................
r1601 | pscholl | 2006-08-17 04:35:00 -0500 (Thu, 17 Aug 2006) | 7 lines

First implementation of new Installer:
* is split off as a Tool in Tool/install.py and added to the 'default' tools.
* honors the --install-sandbox option

* fix the rpm package building in the process
................
r1602 | pscholl | 2006-08-17 15:20:35 -0500 (Thu, 17 Aug 2006) | 1 line

change default INSTALLSTR
................
r1603 | pscholl | 2006-08-17 16:28:44 -0500 (Thu, 17 Aug 2006) | 6 lines

* strip Install_old and InstallAs_old from Environment.py
* fix the source package building part of the rpm builder.
* add '--package-type=' option.
* add 'package' default alias.
................
r1604 | pscholl | 2006-08-17 16:39:12 -0500 (Thu, 17 Aug 2006) | 3 lines

* forgot the test
................
r1605 | pscholl | 2006-08-17 17:37:07 -0500 (Thu, 17 Aug 2006) | 5 lines

* introduce 'src_zip', 'src_tarbz2', 'src_targz' packagers. Their difference to
'zip', 'tarbz2', 'targz' is an emitter that only accepts files that have an
'InstallBuilder' attached.
................
r1606 | pscholl | 2006-08-17 17:58:54 -0500 (Thu, 17 Aug 2006) | 4 lines

* rename x_ipk_source and x_ipk_source to source_url.
* let rpm honor source_url accordingly.
................
r1607 | pscholl | 2006-08-18 09:35:53 -0500 (Fri, 18 Aug 2006) | 7 lines

* merge with trunk from r1501 to 1594
* add Environment.FindInstalledFiles(), which returns the
env['_INSTALLEDFILES'] list.
* add Environment.FindSourceFiles() which tries to find all files by inspecting
the '.' directory.
................
r1608 | pscholl | 2006-08-19 09:04:15 -0500 (Sat, 19 Aug 2006) | 3 lines

Create a Tool/filesystem.py, which creates the CopyTo() and CopyAs() builders.
................
r1609 | pscholl | 2006-08-19 09:51:50 -0500 (Sat, 19 Aug 2006) | 5 lines

add a 'change_specfile' packagetag which takes a function, that will be called
with the target and source parameters to enable the user to change the specfile
after it has been generated.
................
r1610 | pscholl | 2006-08-19 09:58:42 -0500 (Sat, 19 Aug 2006) | 1 line

fix msi packaging
................
r1612 | pscholl | 2006-08-20 12:03:28 -0500 (Sun, 20 Aug 2006) | 1 line

To fix issues with a set BuildDir, copy all tag information to the srcnode() of the file the tags are attached to.
................
r1613 | pscholl | 2006-08-20 15:20:12 -0500 (Sun, 20 Aug 2006) | 3 lines

last minute fixes.
................
r1614 | pscholl | 2006-08-20 21:38:02 -0500 (Sun, 20 Aug 2006) | 1 line

fix some smaller problems with msi.
................
r1615 | pscholl | 2006-08-20 21:44:04 -0500 (Sun, 20 Aug 2006) | 1 line

get rid of ambiguous shortname warnings.
................
r1616 | pscholl | 2006-08-21 05:55:10 -0500 (Mon, 21 Aug 2006) | 3 lines

change conf filetag in ipk to config
................
r1618 | pscholl | 2006-08-22 06:09:52 -0500 (Tue, 22 Aug 2006) | 1 line

fix bug where no builder is attached to source files
................
r1624 | pscholl | 2006-09-09 07:14:40 -0500 (Sat, 09 Sep 2006) | 35 lines

* move stip_abs.path() to SCons.Util

* Optik.option_parsers does not raise an error on interspersed option that
start with '--' or '-', while loosing the capability to raise an error on
a given commandline option that is not defined.

* change Tool/install.py to use the builder functions which were in
Environment.py

* Tools might now define their own command line options, by modifying a
env-wide Options() object. Their help text is automatically generated for
each Tool initialization. For example running 'scons -h' in a directory with
a SConstruct that uses the install builder gives this result:

scons: Reading SConscript files ...
scons: done reading SConscript files.

DESTDIR: A directory under which all installed files will be placed. (
/path/to/DESTDIR )
default: None
actual: None
aliases: ['--install-sandbox']

prefix: The prefix which can be configured for every installed
files. ( /path/to/prefix )
default: /usr/local
actual: /usr/local
aliases: ['--install-prefix']

Use scons -H for help about command-line options.

* fix packaging and filesystem from unneeded references to install internals.
................
r1669 | stevenknight | 2006-11-02 12:33:48 -0600 (Thu, 02 Nov 2006) | 2 lines

Ignore the *.pyc files.
................
r1670 | stevenknight | 2006-11-02 19:42:36 -0600 (Thu, 02 Nov 2006) | 2 lines

Changes to fix various test failures on the packaging branch.
................
r1671 | stevenknight | 2006-11-03 00:00:59 -0600 (Fri, 03 Nov 2006) | 2 lines

Map the i[456]86 flavors to i386 for RPM testing purposes.
................
r1679 | pscholl | 2006-11-04 05:34:44 -0600 (Sat, 04 Nov 2006) | 14 lines

* exclude the packaging from the default tool listing, change tests accordingly.

* remove get_tags and set_tags method from FS/Node.py, replaced by hasattr(),
setattr() and getattr()

* rename strip_abs_path to make_path_relative

* make tool initilisation only try to zipimport if the exception thrown is "No
module named <xyz>". This way you get the real error that causes problems
importing the module.

* Start the packaging.xml doc
................
r1680 | pscholl | 2006-11-04 05:42:12 -0600 (Sat, 04 Nov 2006) | 1 line

fix the filesystem tool
................
r1681 | pscholl | 2006-11-04 07:51:11 -0600 (Sat, 04 Nov 2006) | 3 lines

Packaging -> packaging
................
r1682 | pscholl | 2006-11-04 07:52:58 -0600 (Sat, 04 Nov 2006) | 3 lines

somehow I managed to let svn forget about those file through a rename ;)
................
r1685 | pscholl | 2006-11-05 03:42:52 -0600 (Sun, 05 Nov 2006) | 3 lines

Those have been missing on the last commit
................
r1686 | pscholl | 2006-11-05 15:12:13 -0600 (Sun, 05 Nov 2006) | 3 lines

add test skipping
................
r1734 | pscholl | 2006-12-15 09:07:51 -0600 (Fri, 15 Dec 2006) | 5 lines

* change rpm, tarbz, targz, ipk, zip packager to new api
* instead of hardcoding the packager type mapping use a __all__ of the
packaging submodule.
................
r1911 | pscholl | 2007-05-19 09:13:57 -0500 (Sat, 19 May 2007) | 10 lines

* convert Package() build parameters to uppercase (incomplete)

* let optik_parser pass undefined command line options starting with "-" and
"--" to the Options() parses, instead of failing with a undefined option
error.

* Small fix for a subsequent bug in handling gnu long opts, see comment in
code.
................
r1912 | stevenknight | 2007-05-19 10:21:45 -0500 (Sat, 19 May 2007) | 4 lines

Minor fixes for Python 1.5 (no list comprehensions, no +=, string.split()
instead of .split() string method). Python 2.x code has been left
in place, commented out, for when we drop 1.5.
................
r1913 | stevenknight | 2007-05-19 21:40:51 -0500 (Sat, 19 May 2007) | 2 lines

Remove the leftover "import SCons.Tool.Packaging" line so tests can pass.
................
r1915 | pscholl | 2007-05-20 10:00:20 -0500 (Sun, 20 May 2007) | 6 lines

* uppercasing construction variables complete. change tests accordingly.

* start of the man page doc xml, see SCons/Tool/packaging/__init.xml, which
lists all construction variables and all builders.
................
r1918 | stevenknight | 2007-05-21 07:20:46 -0500 (Mon, 21 May 2007) | 4 lines

Propagate a fix from the trunk: prepend './' when interpreting the file
name to install so we don't treat a file actually named '#...' as being
relative to the top-level SConstruct directory.
................
r1922 | pscholl | 2007-05-22 18:16:38 -0500 (Tue, 22 May 2007) | 3 lines

fix CopyTo builder.
................
r1923 | pscholl | 2007-05-22 19:02:33 -0500 (Tue, 22 May 2007) | 1 line

fix the try block
................
r1926 | stevenknight | 2007-05-22 22:45:48 -0500 (Tue, 22 May 2007) | 747 lines

Merged revisions 1679-1917 via svnmerge from
http://scons.tigris.org/svn/scons/trunk

(Not completely clean; some tests still fail. The failures are the same,
though, before and after the merge.)

................
r1684 | stevenknight | 2006-11-04 14:26:57 -0600 (Sat, 04 Nov 2006) | 3 lines

Update the instructions to correct a few errors in setting up svnmerge
on branches. Add a few clarifying comments.
................
r1688 | stevenknight | 2006-11-06 13:27:39 -0600 (Mon, 06 Nov 2006) | 2 lines

Change announcement etc. for 0.96.93.
................
r1738 | stevenknight | 2006-12-15 19:43:01 -0600 (Fri, 15 Dec 2006) | 195 lines

Merged revisions 1675-1736 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1689 | stevenknight | 2006-11-06 20:56:29 -0600 (Mon, 06 Nov 2006) | 1 line

0.96.D483 - Merge changes for 0.96.93 packaging from the subsidiary branch.
........
r1690 | stevenknight | 2006-11-06 20:59:30 -0600 (Mon, 06 Nov 2006) | 1 line

0.96.D484 - Update HOWTO for releases. Fix name type in src/CHANGES.txt.
........
r1691 | stevenknight | 2006-11-08 13:55:36 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D485 - Fix MergeFlags() handling of None values. (John Pye)
........
r1692 | stevenknight | 2006-11-08 17:15:05 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D486 - Directly execute commands on Windows when possible. (Jay Kint)
........
r1693 | stevenknight | 2006-11-08 18:54:49 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D487 - Remove the semi-colon from the list of characters that determine when we use cmd
........
r1694 | stevenknight | 2006-11-09 01:34:06 -0600 (Thu, 09 Nov 2006) | 1 line

0.96.D488 - Pick up latex/bibtex 'Rerun to get citations correct' messages. (Dmitry Mikhin)
........
r1695 | stevenknight | 2006-11-11 08:36:33 -0600 (Sat, 11 Nov 2006) | 1 line

0.96.D489 - Back out the direct-execution-on-Windows change until we solve a corner case.
........
r1696 | stevenknight | 2006-11-15 10:33:10 -0600 (Wed, 15 Nov 2006) | 1 line

0.96.D490 - Fix the sconsign script when the .sconsign.dblite file is specified with its suf
........
r1697 | stevenknight | 2006-11-18 10:45:50 -0600 (Sat, 18 Nov 2006) | 4 lines

Complete move of test/sconsign/script.py to underneath test/sconsign/script/.
(This got left out of the previous checkin due to an error in the
script that resubmits Aegis changes to Subversion.)
........
r1698 | stevenknight | 2006-11-18 11:05:26 -0600 (Sat, 18 Nov 2006) | 1 line

0.96.D491 - Allow an Options converter to take the construction environment as a parameter.
........
r1699 | stevenknight | 2006-11-30 15:34:37 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D492 - Reverse the order in which we try the arguments Options converters, first a sing
........
r1700 | stevenknight | 2006-11-30 16:03:09 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D493 - Speed up rel_path() by avoiding recomputation of intermediate directory relative
........
r1701 | stevenknight | 2006-11-30 16:14:16 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D494 - More efficient get_suffix(): compute it once when we set the name.
........
r1702 | stevenknight | 2006-11-30 16:22:55 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D495 - Fix missing XML end tags.
........
r1703 | stevenknight | 2006-11-30 17:15:25 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D496 - Turn Memoizer into a simple counter for --debug=memoizer, not something that doe
........
r1704 | stevenknight | 2006-11-30 20:30:50 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D497 - Add the scons-time script, with doc and tests.
........
r1705 | stevenknight | 2006-11-30 23:28:20 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D498 - Update the copyright years string.
........
r1706 | stevenknight | 2006-12-01 11:54:22 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D499 - Fix _do_Lookup => _doLookup value-caching misspellings. (Ben Leslie)
........
r1707 | stevenknight | 2006-12-01 12:03:46 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D500 - Fix copyright test against debian build. (Walter Franzini)
........
r1708 | stevenknight | 2006-12-01 14:23:29 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D501 - Add #include lines for test portability. (Gary Oberbrunner)
........
r1709 | stevenknight | 2006-12-01 14:51:12 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D502 - Fix tests under Python versions with no profiler (pstats module).
........
r1710 | stevenknight | 2006-12-01 20:04:49 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D503 - Remove unnecessary os.path.normpath() calls. (Gary Oberbrunner)
........
r1711 | stevenknight | 2006-12-01 20:34:31 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D504 - Accomodate arbitray white space after a SWIG %module keyword. (Anonymous)
........
r1712 | stevenknight | 2006-12-05 14:49:54 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D506 - Cache substitutions of of Builder source suffixes. Use a new PathList module, and a refactor Node.FS.Rfindalldirs() method, to cache calculations of values like CPPPATH.
........
r1713 | stevenknight | 2006-12-05 18:43:36 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D507 - Use cached stat() values in diskchecks.
........
r1714 | stevenknight | 2006-12-05 21:11:24 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D508 - Fix Memoizer hit counts for methods memoizing simple values. Clean up the code for memoizing return values in a dictionary. Fix comments.
........
r1715 | stevenknight | 2006-12-06 07:23:18 -0600 (Wed, 06 Dec 2006) | 1 line

0.96.D369 - More efficient Node.FS.Dir.current() check. Fix some Windows test portability issues.
........
r1716 | stevenknight | 2006-12-06 12:24:32 -0600 (Wed, 06 Dec 2006) | 2 lines

Undo previous checkin (distributed incorrect Aegis change number).
........
r1717 | stevenknight | 2006-12-06 12:34:53 -0600 (Wed, 06 Dec 2006) | 1 line

0.96.D505 - Update ae-{cvs,svn}-ci for newer versions of aetar, and to not truncate descriptions.
........
r1718 | stevenknight | 2006-12-07 23:01:41 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D509 - Only look for mslink on Windows systems. (Sohail Somani)
........
r1719 | stevenknight | 2006-12-07 23:18:33 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D510 - Have the D compiler Tool use the same logic for shared libraries, too. (Paolo Invernizzi)
........
r1720 | stevenknight | 2006-12-07 23:29:47 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D511 - Generalize a JobTests.py test so it doesn't assume a specific order in which the operating system executes the threads.
........
r1721 | stevenknight | 2006-12-07 23:39:37 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D512 - Back out the Tool/dmd.py change; it breaks shared library linking for other lanuages beside D in the construction environment.
........
r1722 | stevenknight | 2006-12-07 23:47:11 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D513 - Test fixes: Windows portability, handle changes to Python 2.5 messages.
........
r1723 | stevenknight | 2006-12-08 00:00:13 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D514 - Change how the 'as' Tool is imported to accomodate the Python 2.6 'as' keyword.
........
r1724 | stevenknight | 2006-12-08 11:19:27 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D515 - Cache both Node.FS.find_file() and Node.FS.Dri.srcdir_find_file().
........
r1725 | stevenknight | 2006-12-08 17:27:35 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D516 - Better error when we try to fetch contents from an Entry that doesn't exist. (Tom Parker)
........
r1726 | stevenknight | 2006-12-08 23:28:55 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D517 - Make sure we pick up the scons-local directory regardless of where we chdir internally.
........
r1727 | stevenknight | 2006-12-11 16:25:53 -0600 (Mon, 11 Dec 2006) | 1 line

0.96.D518 - Cache results of Executor.get_unignored_sources() and Executor.process_sources(). Eliminate some map() and disambiguate() calls when scanning for implicit dependencies.
........
r1728 | stevenknight | 2006-12-12 14:32:22 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D519 - Fix SideEffect() when -j is used.
........
r1729 | stevenknight | 2006-12-12 16:58:15 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D520 - Add a srcdir keyword to Builder calls.
........
r1730 | stevenknight | 2006-12-12 21:40:59 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D521 - TeX/LaTeX updates, including handling files in subdirectories. (Joel B. Mohler, Rob Managan, Dmitry Mikhin)
........
r1731 | stevenknight | 2006-12-14 15:01:02 -0600 (Thu, 14 Dec 2006) | 1 line

0.96.D522 - Propogate TypeErrors during variable substitution for display to the user.
........
r1732 | stevenknight | 2006-12-14 20:01:49 -0600 (Thu, 14 Dec 2006) | 1 line

0.96.D523 - Fix the os.path.join() calls in EnvironmentTests.py.
........
r1733 | stevenknight | 2006-12-15 07:48:22 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D524 - Fix source directories as dependencies of an Alias (0.96.93 problem found by LilyPond).
........
r1735 | stevenknight | 2006-12-15 12:43:45 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D525 - Allow printing Debug.caller() output (or other end-of-run debugging info) when using -h.
........
r1736 | stevenknight | 2006-12-15 16:30:08 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D526 - Add an option to debug IndexError and NameError exceptions during variable substitution.
........
................
r1740 | stevenknight | 2006-12-15 21:17:20 -0600 (Fri, 15 Dec 2006) | 13 lines

Merged revisions 1440-1541,1543-1582,1584-1667,1669-1675,1677-1738 via svnmerge from
http://scons.tigris.org/svn/scons/branches/tools

........
r1646 | stevenknight | 2006-10-17 17:21:58 -0500 (Tue, 17 Oct 2006) | 6 lines

Move all the scons.org stuff from the scons source tree itself to a
directory next to the trunk, and delete the copies from the branches.
There's a lot of stuff there (what with all of the documentation of
the different versions) and it's ridiculous to make everyone sync it
just to work on the code.
........
................
r1757 | stevenknight | 2007-01-07 01:23:05 -0600 (Sun, 07 Jan 2007) | 65 lines

Merged revisions 1738-1754,1756 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1741 | stevenknight | 2006-12-16 22:51:07 -0600 (Sat, 16 Dec 2006) | 1 line

0.96.D527 - Give the f90 and f95 Tool modules knowledge of how to build source files of earlier Fortran versions.
........
r1742 | stevenknight | 2006-12-16 23:22:54 -0600 (Sat, 16 Dec 2006) | 1 line

0.96.D528 - Better handling of timestamp fallback if there's no md5 module.
........
r1743 | stevenknight | 2006-12-17 00:21:31 -0600 (Sun, 17 Dec 2006) | 1 line

0.96.D529 - Fix portability of new tests on systems that don't have TeX installed.
........
r1744 | stevenknight | 2006-12-19 15:30:16 -0600 (Tue, 19 Dec 2006) | 1 line

0.96.D530 - Eliminate the ListBuilder subclass in favor of using the Executor's target lists.
........
r1745 | stevenknight | 2006-12-19 18:54:26 -0600 (Tue, 19 Dec 2006) | 1 line

0.96.D531 - Eliminate of MultiStepBuilder as a separate Builder subclass.
........
r1746 | garyo | 2006-12-21 13:21:08 -0600 (Thu, 21 Dec 2006) | 1 line

Minor doc fix, thanks to Douglas Landgraf.
........
r1747 | stevenknight | 2006-12-21 17:13:55 -0600 (Thu, 21 Dec 2006) | 1 line

0.96.D533 - Add CFLAGS for options common to C/C++. (Gary Oberbrunner)
........
r1748 | stevenknight | 2007-01-03 19:48:05 -0600 (Wed, 03 Jan 2007) | 1 line

0.96.D534 - Fix signature storage when targets are retrieved from CacheDir().
........
r1749 | stevenknight | 2007-01-04 16:48:47 -0600 (Thu, 04 Jan 2007) | 1 line

0.96.D535 - Teach the lex and yacc tools about target files generated by different flex/bison options, and about Objective C suffixes. (Pupeno)
........
r1750 | stevenknight | 2007-01-04 17:14:38 -0600 (Thu, 04 Jan 2007) | 1 line

0.96.D536 - Refactor duplicate disambiguation logic in Entry.get_contents().
........
r1751 | stevenknight | 2007-01-05 13:00:54 -0600 (Fri, 05 Jan 2007) | 1 line

0.96.D537 - Fix lprof regression from 0.96.92.
........
r1752 | stevenknight | 2007-01-05 20:43:48 -0600 (Fri, 05 Jan 2007) | 1 line

0.96.D538 - Fix caching of Builder suffix matching (to fix lprof regression).
........
r1753 | stevenknight | 2007-01-06 00:03:16 -0600 (Sat, 06 Jan 2007) | 1 line

0.96.D539 - Fix --include-dir when using MinGW. (Paul)
........
r1754 | stevenknight | 2007-01-06 00:24:53 -0600 (Sat, 06 Jan 2007) | 1 line

0.96.D540 - Make bootstrap.py something useful to execute SCons out of a source directory.
........
r1756 | stevenknight | 2007-01-06 21:32:11 -0600 (Sat, 06 Jan 2007) | 1 line

0.96.D541 - Update the Copyright year string to include 2007. Automate updating the month+year string in man page title headers. Fix hard-coded __revision__ strings that crept into some older tests.
........
................
r1764 | stevenknight | 2007-01-08 01:13:59 -0600 (Mon, 08 Jan 2007) | 2 lines

Add announcements for 0.96.94.
................
r1767 | stevenknight | 2007-01-08 11:33:58 -0600 (Mon, 08 Jan 2007) | 13 lines

Merged revisions 1757-1765 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1759 | stevenknight | 2007-01-07 09:36:37 -0600 (Sun, 07 Jan 2007) | 1 line

0.96.D541 - Update the Copyright year string to include 2007. Automate updating the month+year string in man page title headers. Fix hard-coded __revision__ strings that crept into some older tests.
........
r1765 | stevenknight | 2007-01-08 11:28:02 -0600 (Mon, 08 Jan 2007) | 1 line

0.96.D543 - Update development line for 0.96.94.
........
................
r1784 | stevenknight | 2007-01-21 14:13:49 -0600 (Sun, 21 Jan 2007) | 57 lines

Merged revisions 1767-1783 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1771 | stevenknight | 2007-01-11 10:42:17 -0600 (Thu, 11 Jan 2007) | 1 line

0.96.D544 - Fix maximum recursion depth exceeded when writing .sconsign files after using Nodes on two different Windows drive letters.
........
r1772 | stevenknight | 2007-01-11 12:15:07 -0600 (Thu, 11 Jan 2007) | 1 line

0.96.D545 - Restore caching of file contents in Node.FS.File.get_contents().
........
r1773 | stevenknight | 2007-01-12 10:22:40 -0600 (Fri, 12 Jan 2007) | 1 line

0.96.D405 - Add MergeFlags() and AddFlags() methods. (Greg Noel) Support recognizing compiler flags that begin with +. (Kent Boortz)
........
r1774 | stevenknight | 2007-01-16 15:58:39 -0600 (Tue, 16 Jan 2007) | 2 lines

Back out previous modification; the wrong change was distributed.
........
r1775 | stevenknight | 2007-01-16 16:08:26 -0600 (Tue, 16 Jan 2007) | 1 line

0.96.D546 - Back out previous change that cached get_contents().
........
r1776 | stevenknight | 2007-01-17 14:30:59 -0600 (Wed, 17 Jan 2007) | 1 line

0.96.D547 - Document the use of ${} to evaluate arbitrary Python code. (Gary Oberbrunner)
........
r1777 | stevenknight | 2007-01-17 15:43:18 -0600 (Wed, 17 Jan 2007) | 1 line

0.96.D548 - Better man page Scanner example (Matt Doar); add FindPathDirs() to the publicly-available functions, and document it.
........
r1778 | stevenknight | 2007-01-17 17:01:03 -0600 (Wed, 17 Jan 2007) | 1 line

0.96.D549 - Return MSVC default paths for versions >= 8.0. (Anonymous)
........
r1779 | stevenknight | 2007-01-18 08:37:58 -0600 (Thu, 18 Jan 2007) | 1 line

0.96.D550 - Windows fix for the rel_path() unit test.
........
r1780 | stevenknight | 2007-01-18 14:01:32 -0600 (Thu, 18 Jan 2007) | 1 line

0.96.D551 - Fix use of __builtins__ in Subst.py.
........
r1781 | stevenknight | 2007-01-18 16:00:27 -0600 (Thu, 18 Jan 2007) | 1 line

0.96.D552 - Collect compatibility code in its own SCons.compat subpackage.
........
r1782 | stevenknight | 2007-01-18 16:22:52 -0600 (Thu, 18 Jan 2007) | 1 line

0.96.D553 - Add the vanilla Python 2.5 subprocess.py module (currently unused) as a baseline for our backwards-compatibility changes to that module.
........
r1783 | stevenknight | 2007-01-18 17:09:39 -0600 (Thu, 18 Jan 2007) | 1 line

0.96.D554 - Change env.ParseConfig() to use the new subprocess module.
........
................
r1814 | stevenknight | 2007-02-08 09:40:05 -0600 (Thu, 08 Feb 2007) | 2 lines

Add links to queries for ENHANCEMENT issues.
................
r1826 | stevenknight | 2007-02-10 23:02:05 -0600 (Sat, 10 Feb 2007) | 137 lines

Merged revisions 1784-1824 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1786 | stevenknight | 2007-01-25 15:29:15 -0600 (Thu, 25 Jan 2007) | 1 line

0.96.D555 - Doc string updates for TaskMaster to better describe the architecture. Get rid of some no-longer-used code.
........
r1787 | stevenknight | 2007-01-25 23:24:31 -0600 (Thu, 25 Jan 2007) | 1 line

0.96.D556 - Packaging changes to support building packages in an arbitrary directory.
........
r1788 | stevenknight | 2007-01-30 20:35:39 -0600 (Tue, 30 Jan 2007) | 1 line

0.96.D557 - Make the Scanner.Base class able to handle Scanner.Selector functionality (i.e., a dictionary to select other scanners) and prepare to deprecate Scanner.Selector and Scanner.Scanner() in the future.
........
r1789 | stevenknight | 2007-01-30 20:45:23 -0600 (Tue, 30 Jan 2007) | 1 line

0.96.D558 - Add support for a site-scons subdirectory. (Gary Oberbrunner)
........
r1790 | stevenknight | 2007-01-31 00:36:20 -0600 (Wed, 31 Jan 2007) | 1 line

0.96.D559 - Clean up various module imports and other pychecker-detected problems.
........
r1791 | stevenknight | 2007-01-31 11:51:04 -0600 (Wed, 31 Jan 2007) | 1 line

0.96.D560 - Fix detection of Java anonymous classes if a newline precedes the opening brace. (Leanid Nazdrynau)
........
r1792 | stevenknight | 2007-02-02 11:57:59 -0600 (Fri, 02 Feb 2007) | 1 line

0.96.D561 - Add a --bootstrap_src option to bootstrap.py; search the bootstrap.py directory by default. (Greg Noel)
........
r1793 | stevenknight | 2007-02-02 18:04:52 -0600 (Fri, 02 Feb 2007) | 1 line

0.96.D562 - Don't check the build/*/gentoo directories for copyright strings.
........
r1794 | stevenknight | 2007-02-02 18:12:43 -0600 (Fri, 02 Feb 2007) | 1 line

0.96.D563 - Fix pychecker clean-ups on later Python versions.
........
r1795 | stevenknight | 2007-02-02 18:38:47 -0600 (Fri, 02 Feb 2007) | 1 line

0.96.D564 - Add a NoCache() function to allow marking targets as not being suitable for propagating/ to (or retrieving from) CacheDir(). (Dave Vitek)
........
r1796 | stevenknight | 2007-02-02 20:08:33 -0600 (Fri, 02 Feb 2007) | 1 line

0.96.D565 - Add a --tree= option, to make the interface to dumping dependency graphs a little clearner, and give it a 'prune' option to avoid repeating the dependency walk for Nodes we've already visited.
........
r1797 | stevenknight | 2007-02-03 20:37:25 -0600 (Sat, 03 Feb 2007) | 1 line

0.96.D566 - Packaging fix: don't add '#' to the beginning of a build_dir name if it's already an absolute path.
........
r1798 | stevenknight | 2007-02-03 20:53:42 -0600 (Sat, 03 Feb 2007) | 1 line

0.96.D567 - Add backwards-compatibility for set() types, and restore the line that used them in the compatibility _subprocess.py module.
........
r1799 | stevenknight | 2007-02-05 10:30:28 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D568 - Capture outline and build configuration for a possible future Developer's Guide.
........
r1800 | stevenknight | 2007-02-05 11:03:37 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D569 - Exclude the new developer guide MANIFEST from Copyright string checks.
........
r1801 | stevenknight | 2007-02-05 11:16:04 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D570 - Track fix in upstream subprocess.py. (Ralf W. Grosse-Kunstleve)
........
r1802 | stevenknight | 2007-02-05 20:05:59 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D571 - Change the Windows installer to register scons.bat as an 'App Path', so the directory doesn't need to be added to %PATH%.
........
r1803 | stevenknight | 2007-02-05 21:33:01 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D572 - Prepare SConf for use with the subprocess module by refactoring the Unbuffered class.
........
r1804 | stevenknight | 2007-02-05 22:37:09 -0600 (Mon, 05 Feb 2007) | 1 line

0.96.D573 - Get rid of left-over Node.Node.{pre,post}_actions attributes.
........
r1805 | stevenknight | 2007-02-06 12:04:14 -0600 (Tue, 06 Feb 2007) | 1 line

0.96.D574 - Remove leftover print in the test/CacheDir/NoCache.py test.
........
r1806 | stevenknight | 2007-02-06 17:11:03 -0600 (Tue, 06 Feb 2007) | 1 line

0.96.D575 - Support the ability to evaluate a ${} construction variable to select the spawner function.
........
r1809 | stevenknight | 2007-02-07 00:30:10 -0600 (Wed, 07 Feb 2007) | 1 line

0.96.D576 - Documentation fixes and updates.
........
r1810 | stevenknight | 2007-02-07 15:51:20 -0600 (Wed, 07 Feb 2007) | 1 line

0.96.D577 - Don't expect a bootstrap.py runtest.py file to be generated when swig -noproxy is used.
........
r1811 | stevenknight | 2007-02-07 16:55:06 -0600 (Wed, 07 Feb 2007) | 1 line

0.96.D578 - Make --srcdir a synonym for -Y/--repository.
........
r1812 | stevenknight | 2007-02-07 23:46:22 -0600 (Wed, 07 Feb 2007) | 1 line

0.96.D579 - More doc updates: PathAccept, #include+Repository double-quote limitation.
........
r1817 | stevenknight | 2007-02-08 12:46:42 -0600 (Thu, 08 Feb 2007) | 1 line

0.96.D580 - Fix use of toolpath with BuildDir.
........
r1818 | stevenknight | 2007-02-08 12:59:23 -0600 (Thu, 08 Feb 2007) | 1 line

0.96.D581 - Enable build of the text version of the User's Guide.
........
r1819 | stevenknight | 2007-02-08 14:21:31 -0600 (Thu, 08 Feb 2007) | 1 line

0.96.D582 - Fix handling of Java inner classes with JARCHDIR.
........
r1820 | stevenknight | 2007-02-08 14:39:33 -0600 (Thu, 08 Feb 2007) | 1 line

0.96.D583 - Add linking with -lm to the dmd.py Tool smart linker. (Anonymous)
........
r1821 | stevenknight | 2007-02-08 17:26:29 -0600 (Thu, 08 Feb 2007) | 1 line

0.96.D584 - Fix ParseConfig() when *FLAGS variables have been replaced with strings.
........
r1822 | stevenknight | 2007-02-09 12:21:17 -0600 (Fri, 09 Feb 2007) | 1 line

0.96.D585 - Fix installation of file names beginning with #. (Dave Weber)
........
r1823 | stevenknight | 2007-02-09 14:14:47 -0600 (Fri, 09 Feb 2007) | 1 line

0.96.D586 - Post-review improvements to recent toolpath and MergeFlags() changes. (Gary Oberbrunner, Greg Noel)
........
r1824 | stevenknight | 2007-02-10 00:53:13 -0600 (Sat, 10 Feb 2007) | 1 line

0.96.D587 - Commonize flags initialization between the c and c++ Tools.
........
................
r1834 | stevenknight | 2007-02-15 00:58:45 -0600 (Thu, 15 Feb 2007) | 2 lines

Update project highlights for 0.96.95.
................
r1863 | stevenknight | 2007-03-15 17:16:54 -0500 (Thu, 15 Mar 2007) | 2 lines

Add banner about SoC2007 to the project highlights.
................
r1884 | stevenknight | 2007-04-13 18:36:39 -0500 (Fri, 13 Apr 2007) | 185 lines

Merged revisions 1826-1882 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1828 | stevenknight | 2007-02-12 13:29:17 -0600 (Mon, 12 Feb 2007) | 1 line

0.96.D588 - Speed up Builder suffix-matching.
........
r1829 | stevenknight | 2007-02-14 08:12:32 -0600 (Wed, 14 Feb 2007) | 1 line

0.96.D589 - The scons command, branch 0.96.94.
........
r1830 | stevenknight | 2007-02-14 09:49:44 -0600 (Wed, 14 Feb 2007) | 1 line

0.96.D590 - Fix the scons-doc .tar.gz file packaging.
........
r1835 | stevenknight | 2007-02-15 11:03:20 -0600 (Thu, 15 Feb 2007) | 1 line

0.96.D591 - Update the release HOWTO.
........
r1836 | stevenknight | 2007-02-15 13:39:24 -0600 (Thu, 15 Feb 2007) | 1 line

0.96.D592 - The scons command, branch 0.96.95.
........
r1837 | stevenknight | 2007-02-15 18:34:18 -0600 (Thu, 15 Feb 2007) | 1 line

0.96.D593 - Back out (comment out) Windows registry installer changes.
........
r1838 | stevenknight | 2007-02-16 10:37:28 -0600 (Fri, 16 Feb 2007) | 1 line

0.96.D594 - Update Debian packaging to remove hard-coded references to Python 2.2. (Jean-Baptiste Lab)
........
r1839 | stevenknight | 2007-02-20 09:34:23 -0600 (Tue, 20 Feb 2007) | 1 line

0.96.D595 - Documentation fixes. In the construction variable appendix, use cross-referenced links to entries.
........
r1840 | stevenknight | 2007-02-21 05:11:35 -0600 (Wed, 21 Feb 2007) | 1 line

0.96.D596 - Handle Java '.class' attributes after non-word tokens without assuming it introduces an inner class.
........
r1841 | stevenknight | 2007-02-21 22:33:28 -0600 (Wed, 21 Feb 2007) | 1 line

0.96.D597 - CPPDEFINES regression
........
r1842 | stevenknight | 2007-02-22 14:19:10 -0600 (Thu, 22 Feb 2007) | 1 line

0.96.D598 - Do not detect a Java anonymous class when the first non-skipped token after "new" is a closing brace.
........
r1843 | stevenknight | 2007-02-23 10:45:06 -0600 (Fri, 23 Feb 2007) | 1 line

0.96.D599 - Better [Errno 21] Is a directory error message.
........
r1844 | stevenknight | 2007-02-23 13:32:11 -0600 (Fri, 23 Feb 2007) | 1 line

0.96.D600 - Fix expansion of non-Node objects within a PathList (maximum recursion / unhashable type bug).
........
r1847 | stevenknight | 2007-03-02 00:12:27 -0600 (Fri, 02 Mar 2007) | 1 line

0.96.D601 - Generate SCons API documentation from the docstrings using epydoc.
........
r1848 | stevenknight | 2007-03-02 14:10:06 -0600 (Fri, 02 Mar 2007) | 1 line

0.96.D602 - Fix use of custom include and lib paths with Visual Studio 8. (Richard Viney)
........
r1849 | stevenknight | 2007-03-03 01:00:22 -0600 (Sat, 03 Mar 2007) | 1 line

0.96.D603 - Man page fix: ParseDepends(). User's Guide updates: NoCache(), Clean(), fix CPPDEFINES output, markers for to-be-documented features, white space clean-up.
........
r1850 | stevenknight | 2007-03-06 02:29:08 -0600 (Tue, 06 Mar 2007) | 1 line

0.96.D604 - Fix use of --debug=presub with the Actions for our out-of-the-box Builders.
........
r1851 | stevenknight | 2007-03-06 09:10:43 -0600 (Tue, 06 Mar 2007) | 1 line

0.96.D605 - User Guide updates: --random, AlwaysBuild(), --tree=, --debug=presub, --debug=stacktrace.
........
r1852 | stevenknight | 2007-03-06 15:38:06 -0600 (Tue, 06 Mar 2007) | 1 line

0.96.D606 - Have the Intel toolchain use the default smart linking logic. (Dmitry Grigorenko and Gary Oberbrunner)
........
r1853 | stevenknight | 2007-03-06 17:56:44 -0600 (Tue, 06 Mar 2007) | 1 line

0.96.D607 - Fix tests: ActionTests.py for presub change, command detection in test/Intel/icpc-link.py.
........
r1854 | stevenknight | 2007-03-08 09:35:25 -0600 (Thu, 08 Mar 2007) | 1 line

0.96.D608 - Better selection of .NET Framework SDK paths. (Richard Viney)
........
r1855 | stevenknight | 2007-03-08 10:34:37 -0600 (Thu, 08 Mar 2007) | 1 line

0.96.D609 - Don't re-run TeX if the triggering strings (\makeindex, \bibliography, \tableofcontents) are commented out. (Matthias Troffaes)
........
r1856 | stevenknight | 2007-03-09 16:18:36 -0600 (Fri, 09 Mar 2007) | 1 line

0.96.D610 - Teach the new PathList module to handle nested lists within CPPPATH and the like.
........
r1857 | stevenknight | 2007-03-10 23:30:29 -0600 (Sat, 10 Mar 2007) | 1 line

0.96.D611 - Qt builders_used failure.
........
r1858 | stevenknight | 2007-03-11 15:33:34 -0500 (Sun, 11 Mar 2007) | 1 line

0.96.D612 - Document limitations of --implicit-cache w.r.t. CPPPATH/LIBPATH/etc.
........
r1859 | stevenknight | 2007-03-11 21:11:26 -0500 (Sun, 11 Mar 2007) | 1 line

0.96.D613 - Document --debug=findlibs and --taskmastertrace in the User's Guide.
........
r1860 | stevenknight | 2007-03-12 13:28:42 -0500 (Mon, 12 Mar 2007) | 1 line

0.96.D614 - Remove deleted cons file from the User's Guide MANIFEST. Fix epydoc API build if the build directory is outside the current directory.
........
r1861 | stevenknight | 2007-03-13 13:03:56 -0500 (Tue, 13 Mar 2007) | 2 lines

Ignore '*.pyc' files in the compat/ subdirectory.
........
r1862 | stevenknight | 2007-03-13 19:08:19 -0500 (Tue, 13 Mar 2007) | 1 line

0.96.D615 - Fix use of $VAR expansions within CPPPATH/LIBPATH values when the expansion is itself a Dir node concatenated with a string.
........
r1866 | stevenknight | 2007-03-16 01:46:10 -0500 (Fri, 16 Mar 2007) | 1 line

0.96.D616 - Back off to the 0.96.94 of Builder.py (with some performance improvements).
........
r1867 | stevenknight | 2007-03-16 11:20:39 -0500 (Fri, 16 Mar 2007) | 1 line

0.96.D617 - Fix an unnamed variable error if we can't map the Visual Studio version to a default framework version.
........
r1868 | stevenknight | 2007-03-16 12:08:18 -0500 (Fri, 16 Mar 2007) | 1 line

0.96.D618 - Quote the MSVS build target in command lines to handle spaces target name. (Jeff Mahovsky)
........
r1869 | stevenknight | 2007-03-16 13:30:06 -0500 (Fri, 16 Mar 2007) | 1 line

0.96.D619 - Portability fixes for tests run on Windows.
........
r1870 | stevenknight | 2007-03-20 00:18:04 -0500 (Tue, 20 Mar 2007) | 1 line

0.96.D620 - Windows portability fixes: test scripts and infrastructure, detect vcexpress.exe.
........
r1871 | garyo | 2007-03-21 18:32:54 -0500 (Wed, 21 Mar 2007) | 1 line

Fix bug where site_scons dir was added to sys.path as relative, not absolute. Added test case. Bug reported by Timothy Woods; thanks for the test case!
........
r1872 | stevenknight | 2007-03-22 09:43:23 -0500 (Thu, 22 Mar 2007) | 1 line

0.96.D622 - Add mention of site_scons fix to src/CHANGES.txt.
........
r1873 | stevenknight | 2007-04-02 23:49:36 -0500 (Mon, 02 Apr 2007) | 1 line

0.96.D623 - Parallel build dependencies with multiple entries in children. (Adam Simpkins)
........
r1874 | stevenknight | 2007-04-04 07:45:05 -0500 (Wed, 04 Apr 2007) | 1 line

0.96.D624 - Make all necessary LaTeX auxiliary files Precious, so bibliography contents aren't affected by whether the auxiliary files exist or not. (Joel B. Mohler)
........
r1875 | stevenknight | 2007-04-04 13:15:39 -0500 (Wed, 04 Apr 2007) | 1 line

0.96.D625 - Fix --debug-time value when -j option is used.
........
r1876 | stevenknight | 2007-04-09 19:40:08 -0500 (Mon, 09 Apr 2007) | 1 line

0.96.D626 - Fix man page example of propagating external user environment. Eliminate cut-and-paste sentence in NoCache() description. (Helmut Grohne, Joe Bloggs) [Issue 1626] [Issue 1627]
........
r1877 | stevenknight | 2007-04-09 23:20:14 -0500 (Mon, 09 Apr 2007) | 1 line

0.96.D627 - Re-run latex after bibtex runs. (Rob Managan)
........
r1878 | stevenknight | 2007-04-11 23:38:17 -0500 (Wed, 11 Apr 2007) | 1 line

0.96.D628 - Fix typo in the User's Guide. [issue 1600]
........
r1879 | stevenknight | 2007-04-12 01:06:35 -0500 (Thu, 12 Apr 2007) | 1 line

0.96.D629 - Avoid name conflicts with compat/ modules (specifically _subprocess.py).
........
r1880 | stevenknight | 2007-04-12 01:33:42 -0500 (Thu, 12 Apr 2007) | 1 line

0.96.D630 - Portability fixes and other improvements in test scripts.
........
r1882 | stevenknight | 2007-04-13 16:42:02 -0500 (Fri, 13 Apr 2007) | 1 line

0.96.D631 - The scons command, branch 0.96.96.
........
................
r1905 | stevenknight | 2007-05-17 16:27:36 -0500 (Thu, 17 May 2007) | 2 lines

Update project highlights and the roadmap for the release of 0.97.
................
r1907 | stevenknight | 2007-05-18 00:40:31 -0500 (Fri, 18 May 2007) | 29 lines

Merged revisions 1884-1905 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1891 | stevenknight | 2007-04-24 08:57:03 -0500 (Tue, 24 Apr 2007) | 1 line

0.96.D632 - Fix 0.96.96 reference count regression during parallel builds.
........
r1892 | stevenknight | 2007-04-24 12:51:05 -0500 (Tue, 24 Apr 2007) | 1 line

0.96.D633 - Fix documented default value(s) of $MSVS_USE_MFC_DIRS.
........
r1893 | stevenknight | 2007-04-24 16:12:14 -0500 (Tue, 24 Apr 2007) | 1 line

0.96.D634 - Make the DirEntryScanner tolerant of non-Dir nodes.
........
r1898 | stevenknight | 2007-05-09 15:07:15 -0500 (Wed, 09 May 2007) | 1 line

0.96.D635 - Portability fixes in test scripts.
........
r1899 | stevenknight | 2007-05-12 08:19:13 -0500 (Sat, 12 May 2007) | 1 line

0.96.D636 - Update documentation with rudimentary Tool module descriptions.
........
r1901 | stevenknight | 2007-05-17 14:32:14 -0500 (Thu, 17 May 2007) | 1 line

0.97.D001 - Initialize 0.97 for release.
........
................
................
r1931 | pscholl | 2007-05-23 18:41:24 -0500 (Wed, 23 May 2007) | 5 lines

Install, InstallAs, CopyTo and CopyAs will not get instantiated for each
environment.
................
r1936 | stevenknight | 2007-05-26 14:56:36 -0500 (Sat, 26 May 2007) | 3 lines

Windows has no os.uname() method, so just leave "machine" initialized to
None on those systems.
................
r1946 | pscholl | 2007-05-30 11:44:51 -0500 (Wed, 30 May 2007) | 3 lines

* let FindSourceFile use '.' as the default target
................
r1948 | pscholl | 2007-05-30 12:23:42 -0500 (Wed, 30 May 2007) | 3 lines

* use has_builder() instead of len(node.sources)==0 to select leaves in the DAG
................
r1950 | stevenknight | 2007-05-31 09:03:19 -0500 (Thu, 31 May 2007) | 6 lines

Clean ups:
Add a missing test.pass_test() call.
Use test.skip_test() when a utility isn't found.
Un-indent the test.*() calls in the main bodies of the test.
Use test.must_exist() instead of test.fail_test(not os.path.exists()).
................
r1965 | stevenknight | 2007-06-01 15:24:14 -0500 (Fri, 01 Jun 2007) | 3 lines

Remove the Install() and InstallAs() unit tests, since those are
no longer native construction environment methods.
................
r1966 | stevenknight | 2007-06-01 15:25:47 -0500 (Fri, 01 Jun 2007) | 3 lines

Remove an extra line interfering with a fix for installing files that
begin with '#'. (Probably left over from a hasty merge.)
................
r1967 | stevenknight | 2007-06-01 15:32:36 -0500 (Fri, 01 Jun 2007) | 2 lines

Remove a duplicate line.
................
r1974 | stevenknight | 2007-06-04 12:41:16 -0500 (Mon, 04 Jun 2007) | 7 lines

Change FindSourceFiles so it disambiguates Entry nodes into File
nodes while performing its walk.
Use isinstance() instead explicit __class__ comparison to allow for
future subclassing.
Use set() to find uniq elements in a list (available to earlier
Python versions through our compatibility library).
................
r2122 | stevenknight | 2007-07-11 15:52:15 -0500 (Wed, 11 Jul 2007) | 3 lines

1.5 portability issues (nested scope, comment out Help-text stuff that
will be superceded by the AddOption() support).
................
r2124 | stevenknight | 2007-07-12 11:55:38 -0500 (Thu, 12 Jul 2007) | 2 lines

Skip MSI tests if xml.dom.minidom isn't installed (early Python version)
................
r2125 | stevenknight | 2007-07-12 12:27:36 -0500 (Thu, 12 Jul 2007) | 13 lines

Set TAR_OPTIONS=--wildcards when executing rpmbuild, so the extraction
of the .spec file from the tarball will work with newer versions of tar.

Change the RPM tool to initialize variables using env.SetDefault(), so
the re-application of the tools to the construction environment (?)
doesn't wipe out our $RPM setting (to add TAR_OPTIONS=--wildcards).

Have the .spec files generated by the tests build/install the software
using the version of SCons under test, not whatever happens to be
installed as "scons" on the system.

Python 1.5 fixes in various RPM code.
................
r2127 | stevenknight | 2007-07-12 15:03:45 -0500 (Thu, 12 Jul 2007) | 10 lines

Use the new AddOption() method to support --install-sandbox, restoring
the ability to call the options() function of a Tool module.

Python 2.2 fix in packaging/test/packaging/rpm/tagging.py.

Earlier-version Python fixes in other tests.

Removal of unnecessary "import os" lines, and use of TestCmd.must_exist()
where it can be.
................
r2129 | stevenknight | 2007-07-13 09:39:26 -0500 (Fri, 13 Jul 2007) | 7 lines

Pre-2.2 Python fixes:

Pull a recursively-called embedded function into the global Environment.py
namespace.

Avoid .split() and .replace() string object methods.
................

Comments (0)

Files changed (76)

QMTest/TestSCons.py

 SConsVersion = '0.97'
 
 __all__.extend([ 'TestSCons',
+                 'machine',
                  'python',
                  '_exe',
                  '_obj',
                  '_dll'
                ])
 
+machine_map = {
+    'i686'  : 'i386',
+    'i586'  : 'i386',
+    'i486'  : 'i386',
+}
+
+try:
+    uname = os.uname
+except AttributeError:
+    # Windows doesn't have a uname() function.  We could use something like
+    # sys.platform as a fallback, but that's not really a "machine," so
+    # just leave it as None.
+    machine = None
+else:
+    machine = uname()[4]
+    machine = machine_map.get(machine, machine)
+
 python = python_executable
 _python_ = '"' + python_executable + '"'
 _exe = exe_suffix

examples/ipk_packaging/SConstruct

+prog = Install( '/bin/', Program( 'main.c') )
+
+Package( projectname        = 'foo',
+         version            = '1.2.3',
+         architecture       = 'arm',
+         x_ipk_maintainer   = 'user <user@somehost.net>',
+         x_ipk_priority     = 'optional',
+         source_url         = 'http://ftp.gnu.org/foo-1.2.3.tar.gz',
+         x_ipk_depends      = 'libc6, grep',
+         type               = 'ipk',
+         summary            = 'bla bla bla',
+         x_ipk_section      = 'extras',
+         description        = 'this should be reallly really long',
+         source             = [ prog ],
+        )

examples/ipk_packaging/main.c

+int main( int argc, char *argv[] )
+{
+  return 0;
+}

examples/msi_packaging/README

+This is the README file.

examples/msi_packaging/SConstruct

+#
+# Build a minimal msi installer with two features.
+#
+
+f1 = Install( '/bin/', File('main.exe') )
+f2 = Install( '/lib/', File('helloworld.dll') )
+f3 = Install( '/doc/', File('README') )
+
+Tag( f2, x_msi_feature = 'Resuable Components' )
+Tag( f3, 'doc' )
+
+Package( projectname    = 'helloworld',
+         version        = '1.0',
+         packageversion = '1',
+         license        = 'gpl',
+         type           = 'msi',
+         vendor         = 'Nanosoft',
+         summary        = 'A HelloWorld implementation',
+         source         = [ f1, f2, f3 ], )

examples/msi_packaging/helloworld.dll

+a fake .dll

examples/msi_packaging/main.exe

+a fake .exe

examples/rpm_packaging/international/SConstruct

+# coding: utf-8
+import os
+
+prog_install = Install( os.path.join( ARGUMENTS.get('prefix', '/'), 'bin'), Program( 'main.c' ) )
+Tag( prog_install, unix_attr='(0755, root, users)' )
+
+Default( Package( projectname    = 'foo',
+         version        = '1.2.3',
+         type           = 'rpm',
+         license        = 'gpl',
+         summary        = 'hello',
+         summary_de     = 'hallo',
+         summary_fr     = 'bonjour',
+         packageversion = 0,
+         x_rpm_Group    = 'Application/office',
+         x_rpm_Group_de = 'Applikation/büro',
+         x_rpm_Group_fr = 'Application/bureau',
+         description    = 'this should be really long',
+         description_de = 'das sollte wirklich lang sein',
+         description_fr = 'ceci devrait être vraiment long',
+         source         = [ prog_install ],
+         source_url     = 'http://foo.org/foo-1.2.3.tar.gz',
+        ) )
+
+Alias ( 'install', prog_install )

examples/rpm_packaging/international/main.c

+int main( int argc, char *argv[] )
+{
+  return 0;
+}

examples/rpm_packaging/simple/SConstruct

+import os
+
+install_dir  = os.path.join( ARGUMENTS.get('prefix', '/'), 'bin/' )
+prog_install = Install( install_dir , Program( 'main.c') )
+
+Tag( prog_install, unix_attr = '(0755, root, users)' )
+
+Package( projectname    = 'foo',
+         version        = '1.2.3',
+         type           = 'rpm',
+         license        = 'gpl',
+         summary        = 'bla bla bla',
+         packageversion = 0,
+         x_rpm_Group    = 'Application/office',
+         description    = 'this should be reallly really long',
+         source_url     = 'http://foo.org/foo-1.2.3.tar.gz',
+         source         = [ prog_install ],
+        )
+
+Alias( 'install', prog_install )

examples/rpm_packaging/simple/main.c

+int main( int argc, char *argv[] )
+{
+  return 0;
+}

examples/src_packaging/SConstruct

+from glob import glob
+
+src_files = glob( 'src/*.c' )
+include_files = glob( 'src/*.h' )
+
+SharedLibrary( 'foobar', src_files )
+
+Package( projectname = 'libfoobar',
+         version     = '1.2.3',
+         type        = [ 'src_zip', 'src_targz', 'src_tarbz2' ],
+         source      = FindSourceFiles() )
Add a comment to this file

examples/src_packaging/src/foobar.c

Empty file added.

Add a comment to this file

examples/src_packaging/src/foobar.h

Empty file added.

                             ['all', 'aegis', 'baseline=', 'builddir=',
                              'debug', 'file=', 'help',
                              'list', 'no-exec', 'noqmtest', 'output=',
-                             'package=', 'passed', 'python=',
-                             'qmtest', 'quiet', 'spe=',
                              'version=', 'exec=', 'time',
                              'verbose=', 'xml'])
 
 
 old_pythonpath = os.environ.get('PYTHONPATH')
 
+# FIXME: the following is necessary to pull in half of the testing
+#        harness from $srcdir/etc. Those modules should be transfered
+#        to QMTest/ once we completely cut over to using that as
+#        the harness, in which case this manipulation of PYTHONPATH
+#        should be able to go away.
 pythonpaths = [ pythonpath_dir ]
 
 for dir in sp:

src/engine/SCons/Action.py

             target = [target]
         if not SCons.Util.is_List(source):
             source = [source]
+
         if exitstatfunc is _null: exitstatfunc = self.exitstatfunc
         if presub is _null:
             presub = self.presub
                     os.chdir(save_cwd)
         if s and save_cwd:
             print_func('os.chdir(%s)' % repr(save_cwd), target, source, env)
+
         return stat
 
 

src/engine/SCons/Builder.py

         """
         self.emitter[suffix] = emitter
 
+    def push_emitter(self, emitter):
+        """Add a emitter to the beginning of the emitter list of this Builder.
+
+        This creates an empty list if the emitter is None.
+        """
+        if not self.emitter:
+            self.emitter = ListEmitter( [emitter] )
+        else:
+            self.emitter.insert(0, emitter)
+
     def add_src_builder(self, builder):
         """
         Add a new Builder to the list of src_builders.
             for suf in bld.src_suffixes(env):
                 sdict[suf] = bld
         return sdict
-        
+
     def src_builder_sources(self, env, source, overwarn={}):
         source_factory = env.get_factory(self.source_factory)
         slist = env.arg2nodes(source, source_factory)

src/engine/SCons/Defaults.py

                       lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
 
 def copy_func(dest, src):
-    if os.path.isfile(src):
+    if SCons.Util.is_List(src) and os.path.isdir(dest):
+        for file in src:
+            shutil.copy(file, dest)
+        return 0
+    elif os.path.isfile(src):
         return shutil.copy(src, dest)
     else:
         return shutil.copytree(src, dest, 1)
                       lambda file: 'Touch("%s")' % file)
 
 # Internal utility functions
-def installFunc(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 installStr(dest, source, env):
-    source = str(source)
-    if os.path.isdir(source):
-        type = 'directory'
-    else:
-        type = 'file'
-    return 'Install %s: "%s" as "%s"' % (type, source, dest)
 
 def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None):
     """
     'DSUFFIXES'     : SCons.Tool.DSuffixes,
     'ENV'           : {},
     'IDLSUFFIXES'   : SCons.Tool.IDLSuffixes,
-    'INSTALL'       : installFunc,
-    'INSTALLSTR'    : installStr,
-    '_installStr'   : installStr,
     'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes,
     '_concat'       : _concat,
     '_defines'      : _defines,

src/engine/SCons/Environment.py

 
 Keyword arguments supplied when the construction Environment
 is created are construction variables used to initialize the
-Environment 
+Environment
 """
 
 #
 # which seem to mess up its ability to reference SCons directly.
 UserError = SCons.Errors.UserError
 
-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.')
-    return install(target[0].path, source[0].path, env)
-
-def installString(target, source, env):
-    s = env.get('INSTALLSTR', '')
-    if callable(s):
-        return s(target[0].path, source[0].path, env)
-    else:
-        return env.subst_target_source(s, 0, target, source)
-
-installAction = SCons.Action.Action(installFunc, installString)
-
-InstallBuilder = SCons.Builder.Builder(action=installAction,
-                                       name='InstallBuilder')
-
 def alias_builder(env, target, source):
     pass
 
                         nodes.append(v)
             else:
                 nodes.append(v)
-    
+
         return nodes
 
     def gvars(self):
             self[key] = t
         return self
 
+# Used by the FindSourceFiles() method, below.
+# Stuck here for support of pre-2.2 Python versions.
+def build_source(ss, result):
+    for s in ss:
+        if isinstance(s, SCons.Node.FS.Dir):
+            build_source(s.all_children(), result)
+        elif s.has_builder():
+            build_source(s.sources, result)
+        elif isinstance(s.disambiguate(), SCons.Node.FS.File):
+            result.append(s)
+
 class Base(SubstitutionEnvironment):
     """Base class for "real" construction Environments.  These are the
     primary objects used to communicate dependency and construction
         self._memo['_gsm'] = result
 
         return result
-        
+
     def get_scanner(self, skey):
         """Find the appropriate scanner given a key (usually a file suffix).
         """
             orig = self._dict[envname][name]
 
         nv = SCons.Util.AppendPath(orig, newpath, sep)
-            
+
         if not self._dict.has_key(envname):
             self._dict[envname] = {}
 
 
         for path in paths:
             dir,name = os.path.split(str(path))
-            if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix: 
+            if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix:
                 return path
 
     def ParseConfig(self, command, function=None, unique=1):
             orig = self._dict[envname][name]
 
         nv = SCons.Util.PrependPath(orig, newpath, sep)
-            
+
         if not self._dict.has_key(envname):
             self._dict[envname] = {}
 
             t.add_ignore(dlist)
         return tlist
 
-    def Install(self, dir, source):
-        """Install specified files in the given directory."""
-        try:
-            dnodes = self.arg2nodes(dir, self.fs.Dir)
-        except TypeError:
-            fmt = "Target `%s' of Install() is a file, but should be a directory.  Perhaps you have the Install() arguments backwards?"
-            raise SCons.Errors.UserError, fmt % str(dir)
-        try:
-            sources = self.arg2nodes(source, self.fs.Entry)
-        except TypeError:
-            if SCons.Util.is_List(source):
-                s = repr(map(str, source))
-            else:
-                s = str(source)
-            fmt = "Source `%s' of Install() is neither a file nor a directory.  Install() source must be one or more files or directories"
-            raise SCons.Errors.UserError, fmt % s
-        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 = dnode.Entry('.'+os.sep+src.name)
-                tgt.extend(InstallBuilder(self, target, src))
-        return tgt
-
-    def InstallAs(self, target, source):
-        """Install sources as targets."""
-        sources = self.arg2nodes(source, self.fs.Entry)
-        targets = self.arg2nodes(target, self.fs.Entry)
-        if len(sources) != len(targets):
-            if not SCons.Util.is_List(target):
-                target = [target]
-            if not SCons.Util.is_List(source):
-                source = [source]
-            t = repr(map(str, target))
-            s = repr(map(str, source))
-            fmt = "Target (%s) and source (%s) lists of InstallAs() must be the same length."
-            raise SCons.Errors.UserError, fmt % (t, s)
-        result = []
-        for src, tgt in map(lambda x, y: (x, y), sources, targets):
-            result.extend(InstallBuilder(self, tgt, src))
-        return result
-
     def Literal(self, string):
         return SCons.Subst.Literal(string)
 
         SCons.SConsign.File(name, dbm_module)
 
     def SideEffect(self, side_effect, target):
-        """Tell scons that side_effects are built as side 
+        """Tell scons that side_effects are built as side
         effects of building targets."""
         side_effects = self.arg2nodes(side_effect, self.fs.Entry)
         targets = self.arg2nodes(target, self.fs.Entry)
         """
         return SCons.Node.Python.Value(value, built_value)
 
+    def FindSourceFiles(self, node='.'):
+        """ returns a list of all source files.
+        """
+        node = self.arg2nodes(node, self.fs.Entry)[0]
+
+        sources = []
+        # Uncomment this and get rid of the global definition when we
+        # drop support for pre-2.2 Python versions.
+        #def build_source(ss, result):
+        #    for s in ss:
+        #        if isinstance(s, SCons.Node.FS.Dir):
+        #            build_source(s.all_children(), result)
+        #        elif s.has_builder():
+        #            build_source(s.sources, result)
+        #        elif isinstance(s.disambiguate(), SCons.Node.FS.File):
+        #            result.append(s)
+        build_source(node.all_children(), sources)
+
+        # now strip the build_node from the sources by calling the srcnode
+        # function
+        def get_final_srcnode(file):
+            srcnode = file.srcnode()
+            while srcnode != file.srcnode():
+                srcnode = file.srcnode()
+            return srcnode
+
+        # get the final srcnode for all nodes, this means stripping any
+        # attached build node.
+        map( get_final_srcnode, sources )
+
+        # remove duplicates
+        return list(set(sources))
+
 class OverrideEnvironment(Base):
     """A proxy that overrides variables in a wrapped construction
     environment by returning values from an overrides dictionary in

src/engine/SCons/EnvironmentTests.py

         exc_caught = None
         try:
             env.Tool('does_not_exist')
-        except SCons.Errors.UserError:
+        except SCons.Errors.EnvironmentError:
             exc_caught = 1
-        assert exc_caught, "did not catch expected UserError"
+        assert exc_caught, "did not catch expected EnvironmentError"
 
         exc_caught = None
         try:
             env.Tool('$NONE')
-        except SCons.Errors.UserError:
+        except SCons.Errors.EnvironmentError:
             exc_caught = 1
-        assert exc_caught, "did not catch expected UserError"
+        assert exc_caught, "did not catch expected EnvironmentError"
 
         # Use a non-existent toolpath directory just to make sure we
         # can call Tool() with the keyword argument.
         assert i.__class__.__name__ == 'Dir', i.__class__.__name__
         assert i.path == 'dir2'
 
-    def test_Install(self):
-        """Test the Install method"""
-        env = self.TestEnvironment(FOO='iii', BAR='jjj')
-
-        tgt = env.Install('export', [ 'build/foo1', 'build/foo2' ])
-        paths = map(str, tgt)
-        paths.sort()
-        expect = map(os.path.normpath, [ 'export/foo1', 'export/foo2' ])
-        assert paths == expect, paths
-        for tnode in tgt:
-            assert tnode.builder == InstallBuilder
-
-        tgt = env.Install('$FOO', [ 'build/${BAR}1', 'build/${BAR}2' ])
-        paths = map(str, tgt)
-        paths.sort()
-        expect = map(os.path.normpath, [ 'iii/jjj1', 'iii/jjj2' ])
-        assert paths == expect, paths
-        for tnode in tgt:
-            assert tnode.builder == InstallBuilder
-
-        tgt = env.Install('export', 'build')
-        paths = map(str, tgt)
-        paths.sort()
-        expect = [os.path.join('export', 'build')]
-        assert paths == expect, paths
-        for tnode in tgt:
-            assert tnode.builder == InstallBuilder
-
-        tgt = env.Install('export', ['build', 'build/foo1'])
-        paths = map(str, tgt)
-        paths.sort()
-        expect = [
-            os.path.join('export', 'build'),
-            os.path.join('export', 'foo1'),
-        ]
-        assert paths == expect, paths
-        for tnode in tgt:
-            assert tnode.builder == InstallBuilder
-
-        tgt = env.Install('export', 'subdir/#file')
-        assert str(tgt[0]) == os.path.normpath('export/#file'), str(tgt[0])
-
-        env.File('export/foo1')
-
-        exc_caught = None
-        try:
-            tgt = env.Install('export/foo1', 'build/foo1')
-        except SCons.Errors.UserError, e:
-            exc_caught = 1
-        assert exc_caught, "UserError should be thrown reversing the order of Install() targets."
-        expect = "Target `export/foo1' of Install() is a file, but should be a directory.  Perhaps you have the Install() arguments backwards?"
-        assert str(e) == expect, e
-
-    def test_InstallAs(self):
-        """Test the InstallAs method"""
-        env = self.TestEnvironment(FOO='iii', BAR='jjj')
-
-        tgt = env.InstallAs(target=string.split('foo1 foo2'),
-                            source=string.split('bar1 bar2'))
-        assert len(tgt) == 2, len(tgt)
-        paths = map(lambda x: str(x.sources[0]), tgt)
-        paths.sort()
-        expect = map(os.path.normpath, [ 'bar1', 'bar2' ])
-        assert paths == expect, paths
-        for tnode in tgt:
-            assert tnode.builder == InstallBuilder
-
-        tgt = env.InstallAs(target='${FOO}.t', source='${BAR}.s')[0]
-        assert tgt.path == 'iii.t'
-        assert tgt.sources[0].path == 'jjj.s'
-        assert tgt.builder == InstallBuilder
-
     def test_Literal(self):
         """Test the Literal() method"""
         env = self.TestEnvironment(FOO='fff', BAR='bbb')

src/engine/SCons/Errors.py

 class StopError(Exception):
     pass
 
+class EnvironmentError(Exception):
+    pass
+
 class ExplicitExit(Exception):
     def __init__(self, node=None, status=None, *args):
         self.node = node

src/engine/SCons/Node/FS.py

 
     def __get_dir(self):
         return EntryProxy(self.get().dir)
-    
+
     dictSpecialAttrs = { "base"     : __get_base_path,
                          "posix"    : __get_posix_path,
                          "windows"  : __get_windows_path,
 
     def __init__(self, name, directory, fs):
         """Initialize a generic Node.FS.Base object.
-        
+
         Call the superclass initialization, take care of setting up
         our relative and absolute paths, identify our parent
         directory, and indicate that this node should use
 
     def get_contents(self):
         """Fetch the contents of the entry.
-        
+
         Since this should return the real contents from the file
         system, we check to see into what sort of subclass we should
         morph this Entry."""
 
     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
         self.Top.path = '.'
         self.Top.tpath = '.'
         self._cwd = self.Top
-    
+
     def set_SConstruct_dir(self, dir):
         self.SConstruct_dir = dir
 
 
         last_orig = path_orig.pop()     # strip last element
         last_norm = path_norm.pop()     # strip last element
-            
+
         # Lookup the directory
         for orig, norm in map(None, path_orig, path_norm):
             try:
             # disk where we just created a File node, and vice versa.
             result.diskcheck_match()
 
-            directory.entries[last_norm] = result 
+            directory.entries[last_norm] = result
             directory.add_wkid(result)
         else:
             e.must_be_same(fsclass)
                 directory = self.Dir(directory)
             name, directory = self._transformPath(name, directory)
             return self._doLookup(klass, name, directory, create)
-    
+
     def File(self, name, directory = None, create = 1):
         """Lookup or create a File node with the specified name.  If
         the name is a relative path (begins with ./, ../, or a file name),
         specified path.
         """
         return self.Entry(name, directory, create, File)
-    
+
     def Dir(self, name, directory = None, create = 1):
         """Lookup or create a Dir node with the specified name.  If
         the name is a relative path (begins with ./, ../, or a file name),
         specified path.
         """
         return self.Entry(name, directory, create, Dir)
-    
+
     def BuildDir(self, build_dir, src_dir, duplicate=1):
         """Link the supplied build directory to the source directory
         for purposes of building files."""
-        
+
         if not isinstance(src_dir, SCons.Node.Node):
             src_dir = self.Dir(src_dir)
         if not isinstance(build_dir, SCons.Node.Node):
                         pass
                     if duplicate != None:
                         node.duplicate=duplicate
-    
+
     def __resetDuplicate(self, node):
         if node != self:
             node.duplicate = node.get_dir().duplicate
 
     def Dir(self, name):
         """Create a directory node named 'name' relative to this directory."""
-        return self.fs.Dir(name, self)
+        dir = self.fs.Dir(name, self)
+        return dir
 
     def File(self, name):
         """Create a file node named 'name' relative to this directory."""
 
             path_elems = ['..'] * (len(self.path_elements) - i) \
                          + map(lambda n: n.name, other.path_elements[i:])
-             
+
             result = string.join(path_elems, os.sep)
 
         memo_dict[other] = result
     def _rmv_existing(self):
         self.clear_memoized_values()
         Unlink(self, [], None)
-        
+
     def prepare(self):
         """Prepare for this file to be created."""
         SCons.Node.Node.prepare(self)

src/engine/SCons/Options/OptionsTests.py

         """Test generating custom format help text"""
         opts = SCons.Options.Options()
 
-        def my_format(env, opt, help, default, actual):
-            return '%s %s %s %s\n' % (opt, default, actual, help)
+        def my_format(env, opt, help, default, actual, aliases):
+            return '%s %s %s %s %s\n' % (opt, default, actual, help, aliases)
 
         opts.FormatOptionHelpText = my_format
 
         opts.Update(env, {})
 
         expect = """\
-ANSWER 42 54 THE answer to THE question
-B 42 54 b - alpha test
-A 42 54 a - alpha test
+ANSWER 42 54 THE answer to THE question ['ANSWER']
+B 42 54 b - alpha test ['B']
+A 42 54 a - alpha test ['A']
 """
 
         text = opts.GenerateHelpText(env)
         assert text == expect, text
 
         expectAlpha = """\
-A 42 54 a - alpha test
-ANSWER 42 54 THE answer to THE question
-B 42 54 b - alpha test
+A 42 54 a - alpha test ['A']
+ANSWER 42 54 THE answer to THE question ['ANSWER']
+B 42 54 b - alpha test ['B']
 """
         text = opts.GenerateHelpText(env, sort=cmp)
         assert text == expectAlpha, text

src/engine/SCons/Options/PathOption.py

         """
         if validator is None:
             validator = self.PathExists
-        return (key, '%s ( /path/to/%s )' % (help, key), default,
-                validator, None)
+
+        if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+            return (key, '%s ( /path/to/%s )' % (help, key[0]), default,
+                    validator, None)
+        else:
+            return (key, '%s ( /path/to/%s )' % (help, key), default,
+                    validator, None)
 
 PathOption = _PathOptionClass()

src/engine/SCons/Options/__init__.py

 
 
 class Options:
+    instance=None
+
     """
     Holds all the options, updates the environment with the variables,
     and renders the help text.
     """
-    def __init__(self, files=None, args={}):
+    def __init__(self, files=None, args={}, is_global=1):
         """
         files - [optional] List of option configuration files to load
-            (backward compatibility) If a single string is passed it is 
+            (backward compatibility) If a single string is passed it is
                                      automatically placed in a file list
         """
-
         self.options = []
         self.args = args
         self.files = None
         if SCons.Util.is_String(files):
-           self.files = [ files ]
+            self.files = [ files ]
         elif files:
-           self.files = files
+            self.files = files
+
+        # create the singleton instance
+        if is_global:
+            self=Options.instance
+
+            if not Options.instance:
+                Options.instance=self
 
     def _do_add(self, key, help="", default=None, validator=None, converter=None):
         class Option:
             pass
 
         option = Option()
-        option.key = key
+
+        # if we get a list or a tuple, we take the first element as the
+        # option key and store the remaining in aliases.
+        if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+          option.key     = key[0]
+          option.aliases = key[1:]
+        else:
+          option.key     = key
+          option.aliases = [ key ]
         option.help = help
         option.default = default
         option.validator = validator
 
         Each list element is a tuple/list of arguments to be passed on
         to the underlying method for adding options.
-        
+
         Example:
           opt.AddOptions(
             ('debug', '', 0),
         # finally set the values specified on the command line
         if args is None:
             args = self.args
-        values.update(args)
+
+        for arg, value in args.items():
+          for option in self.options:
+            if arg in option.aliases + [ option.key ]:
+              values[option.key]=value
 
         # put the variables in the environment:
-        # (don't copy over variables that are not declared
-        #  as options)
+        # (don't copy over variables that are not declared as options)
         for option in self.options:
             try:
                 env[option.key] = values[option.key]
                             # Convert stuff that has a repr() that
                             # cannot be evaluated into a string
                             value = SCons.Util.to_String(value)
-                        
+
                         defaultVal = env.subst(SCons.Util.to_String(option.default))
                         if option.converter:
                             defaultVal = option.converter(defaultVal)
                 actual = env.subst('${%s}' % opt.key)
             else:
                 actual = None
-            return self.FormatOptionHelpText(env, opt.key, opt.help, opt.default, actual)
+            return self.FormatOptionHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases)
         lines = filter(None, map(format, options))
 
         return string.join(lines, '')
 
-    format = '\n%s: %s\n    default: %s\n    actual: %s\n'
+    format  = '\n%s: %s\n    default: %s\n    actual: %s\n'
+    format_ = '\n%s: %s\n    default: %s\n    actual: %s\n    aliases: %s\n'
 
-    def FormatOptionHelpText(self, env, key, help, default, actual):
-        return self.format % (key, help, default, actual)
+    def FormatOptionHelpText(self, env, key, help, default, actual, aliases=[]):
+        # Don't display the key name itself as an alias.
+        aliases = filter(lambda a, k=key: a != k, aliases)
+        if len(aliases)==0:
+            return self.format % (key, help, default, actual)
+        else:
+            return self.format_ % (key, help, default, actual, aliases)
+

src/engine/SCons/Script/__init__.py

     'Split',
     'TargetSignatures',
     'Value',
+    'Tag',
+    'FindInstalledFiles',
+    'FindSourceFiles',
 ]
 
 GlobalDefaultBuilders = [
     'Tar',
     'TypeLibrary',
     'Zip',
+    'Package',
 ]
 
 for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:

src/engine/SCons/Tool/ToolTests.py

 
         try:
             p = SCons.Tool.Tool('_does_not_exist_')
-        except SCons.Errors.UserError:
+        except SCons.Errors.EnvironmentError:
             pass
         else:
             raise

src/engine/SCons/Tool/__init__.py

 
 #
 # __COPYRIGHT__
-# 
+#
 # 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
         module = self._tool_module()
         self.generate = module.generate
         self.exists = module.exists
+        if hasattr(module, 'options'):
+            self.options = module.options
 
     def _tool_module(self):
+        # TODO: Interchange zipimport with normal initilization for better error reporting
         oldpythonpath = sys.path
         sys.path = self.toolpath + sys.path
 
                     if file:
                         file.close()
             except ImportError, e:
+                if str(e)!="No module named %s"%self.name:
+                    raise SCons.Errors.EnvironmentError, e
                 try:
                     import zipimport
                 except ImportError:
                         file.close()
                     return module
                 except ImportError, e:
+                    if e!="No module named %s"%self.name:
+                        raise SCons.Errors.EnvironmentError, e
                     try:
                         import zipimport
                         importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] )
                         return module
                     except ImportError, e:
                         m = "No tool named '%s': %s" % (self.name, e)
-                        raise SCons.Errors.UserError, m
+                        raise SCons.Errors.EnvironmentError, m
             except ImportError, e:
                 m = "No tool named '%s': %s" % (self.name, e)
-                raise SCons.Errors.UserError, m
+                raise SCons.Errors.EnvironmentError, m
 
     def __call__(self, env, *args, **kw):
         if self.init_kw is not None:
             else:
                 kw = self.init_kw
         env.Append(TOOLS = [ self.name ])
+        if hasattr(self, 'options'):
+            from SCons.Options import Options
+            if not env.has_key('options'):
+                from SCons.Script import ARGUMENTS
+                env['options']=Options(args=ARGUMENTS)
+            opts=env['options']
+
+            self.options(opts)
+            opts.Update(env)
+
         apply(self.generate, ( env, ) + args, kw)
 
     def __str__(self):
     def ToolExists(tool, env=env):
         return Tool(tool).exists(env)
     return filter (ToolExists, tools)
-             
+
 def tool_list(platform, env):
 
     # XXX this logic about what tool to prefer on which platform
         ars = ['ar', 'mslib']
 
     c_compiler = FindTool(c_compilers, env) or c_compilers[0]
- 
+
     # XXX this logic about what tool provides what should somehow be
     #     moved into the tool files themselves.
     if c_compiler and c_compiler == 'mingw':
-        # MinGW contains a linker, C compiler, C++ compiler, 
+        # MinGW contains a linker, C compiler, C++ compiler,
         # Fortran compiler, archiver and assembler:
         cxx_compiler = None
         linker = None
 
     other_tools = FindAllTools(['BitKeeper', 'CVS',
                                 'dmd',
+                                'install', 'filesystem',
                                 'dvipdf', 'dvips', 'gs',
                                 'jar', 'javac', 'javah',
                                 'latex', 'lex',
                                 # 'Subversion',
                                 'swig',
                                 'tar', 'tex',
-                                'yacc', 'zip'],
+                                'yacc', 'zip', 'rpm', 'wix'],
                                env)
 
     tools = ([linker, c_compiler, cxx_compiler,
               fortran_compiler, assembler, ar]
              + other_tools)
-    
+
     return filter(lambda x: x, tools)

src/engine/SCons/Tool/bcc32.py

     borwin = env.WhereIs(program) or SCons.Util.WhereIs(program)
     if borwin:
         dir = os.path.dirname(borwin)
-        path = env['ENV'].get('PATH', [])
-        if not path:
-            path = []
-        if SCons.Util.is_String(path):
-            path = string.split(path, os.pathsep)
-        env['ENV']['PATH'] = string.join([dir]+path, os.pathsep)
+        env.PrependENVPath('PATH', dir)
     return borwin
 
 def generate(env):

src/engine/SCons/Tool/cc.py

         shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
         static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
         shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+#<<<<<<< .working
+#
+#    env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
+#    # It's a hack to test for darwin here, but the alternative of creating
+#    # an applecc.py to contain this seems overkill.  Maybe someday the Apple
+#    # platform will require more setup and this logic will be moved.
+#    env['FRAMEWORKS'] = SCons.Util.CLVar('')
+#    env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
+#    if env['PLATFORM'] == 'darwin':
+#        env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
+#=======
+#>>>>>>> .merge-right.r1907
 
     add_common_cc_variables(env)
 

src/engine/SCons/Tool/filesystem.py

+"""SCons.Tool.filesystem
+
+Tool-specific initialization for the filesystem tools.
+
+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__
+#
+# 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 SCons
+from SCons.Tool.install import copyFunc
+
+copyToBuilder, copyAsBuilder = None, None
+
+def copyto_emitter(target, source, env):
+    """ changes the path of the source to be under the target (which
+    are assumed to be directories.
+    """
+    n_target = []
+
+    for t in target:
+        n_target = n_target + map( lambda s, t=t: t.File( str( s ) ), source )
+
+    return (n_target, source)
+
+def copy_action_func(target, source, env):
+    assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(map(str, target),map(str, source))
+
+    for t, s in zip(target, source):
+        if copyFunc(t.get_path(), s.get_path(), env):
+            return 1
+
+    return 0
+
+def copy_action_str(target, source, env):
+    return env.subst_target_source(env['COPYSTR'], 0, target, source)
+
+copy_action = SCons.Action.Action( copy_action_func, copy_action_str )
+
+def generate(env):
+    try:
+        env['BUILDERS']['CopyTo']
+        env['BUILDERS']['CopyAs']
+    except KeyError, e:
+        global copyToBuilder
+        if copyToBuilder is None:
+            copyToBuilder = SCons.Builder.Builder(
+                             action         = copy_action,
+                             target_factory = env.fs.Dir,
+                             source_factory = env.fs.Entry,
+                             multi          = 1,
+                             emitter        = [ copyto_emitter, ] )
+
+        global copyAsBuilder
+        if copyAsBuilder is None:
+            copyAsBuilder = SCons.Builder.Builder(
+                             action         = copy_action,
+                             target_factory = env.fs.Entry,
+                             source_factory = env.fs.Entry )
+
+        env['BUILDERS']['CopyTo'] = copyToBuilder
+        env['BUILDERS']['CopyAs'] = copyAsBuilder
+
+        env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"'
+
+def exists(env):
+    return 1

src/engine/SCons/Tool/install.py

+"""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__
+#
+# 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 SCons.Action
+import shutil, os, stat
+from SCons.Util import make_path_relative
+
+#
+# We keep track of *all* installed files.
+_INSTALLED_FILES = []
+
+#
+# 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) )
+    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
+    files = _INSTALLED_FILES
+    #files.extend( [ x for x in target if not x in files ] )
+    for x in target:
+        if not x in files:
+            files.append(x)
+    return (target, source)
+
+class DESTDIR_factory:
+    """ 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)
+
+InstallBuilder, InstallAsBuilder = None, None
+BaseInstallBuilder               = None
+
+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.')
+
+    try:
+        env['BUILDERS']['Install']
+        env['BUILDERS']['InstallAs']
+
+    except KeyError, e:
+        install_sandbox = GetOption('install_sandbox')
+        if install_sandbox:
+            target_factory = DESTDIR_factory(env, install_sandbox)
+        else:
+            target_factory = env.fs
+
+        global BaseInstallBuilder
+        if BaseInstallBuilder is None:
+            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 InstallBuilder
+        if InstallBuilder is None:
+            def InstallBuilderWrapper(env, target, source, dir=None, target_factory=target_factory):
+                if target and dir:
+                    raise SCons.Errors.UserError, "Both target and dir defined for Install(), only one may be defined."
+                if not dir:
+                    dir=target
+                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))
+                return tgt
+
+            InstallBuilder = InstallBuilderWrapper
+
+        global InstallAsBuilder
+        if InstallAsBuilder is None:
+            def InstallAsBuilderWrapper(env, target, source):
+                result = []
+                for src, tgt in map(lambda x, y: (x, y), source, target):
+                    result.extend(BaseInstallBuilder(env, tgt, src))
+                return result
+
+            InstallAsBuilder = InstallAsBuilderWrapper
+
+        env['BUILDERS']['Install']   = InstallBuilder
+        env['BUILDERS']['InstallAs'] = InstallAsBuilder
+
+    # 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

src/engine/SCons/Tool/ipkg.py

+"""SCons.Tool.ipkg
+
+Tool-specific initialization for ipkg.
+
+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.
+
+The ipkg tool calls the ipkg-build. Its only argument should be the 
+packages fake_root.
+"""
+
+#
+# __COPYRIGHT__
+#
+# 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__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Builder
+from os import popen
+from os.path import dirname
+
+def generate(env):
+    """Add Builders and construction variables for ipkg to an Environment."""
+    try:
+        bld = env['BUILDERS']['Ipkg']
+    except KeyError:
+        bld = SCons.Builder.Builder( action  = '$IPKGCOM',
+                                     suffix  = '$IPKGSUFFIX',
+                                     source_scanner = None,
+                                     target_scanner = None)
+        env['BUILDERS']['Ipkg'] = bld
+
+    env['IPKG']       = 'ipkg-build'
+    env['IPKGCOM']    = '$IPKG $IPKGFLAGS ${SOURCE}'
+    env['IPKGUSER']   = popen('id -un').read().strip()
+    env['IPKGGROUP']  = popen('id -gn').read().strip()
+    env['IPKGFLAGS']  = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')
+    env['IPKGSUFFIX'] = '.ipk'
+
+def exists(env):
+    return env.Detect('ipkg-build')

src/engine/SCons/Tool/link.py

     """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'

src/engine/SCons/Tool/linkloc.py

 
     msvs_version = env.get('MSVS_VERSION')
     include_path, lib_path, exe_path = get_msvc_paths(env, version = msvs_version)
-    env['ENV']['LIB']            = lib_path
-    env['ENV']['PATH']           = exe_path
+    env['ENV']['LIB'] = lib_path
+    env.PrependENVPath('PATH', exe_path)
 
     addPharLapPaths(env)
 

src/engine/SCons/Tool/mingw.py

     mingw = find(env)
     if mingw:
         dir = os.path.dirname(mingw)
-
-        # The mingw bin directory must be added to the path:
-        path = env['ENV'].get('PATH', [])
-        if not path: 
-            path = []
-        if SCons.Util.is_String(path):
-            path = string.split(path, os.pathsep)
-
-        env['ENV']['PATH'] = string.join([dir] + path, os.pathsep)
+        env.PrependENVPath('PATH', dir )
         
 
     # Most of mingw is the same as gcc and friends...

src/engine/SCons/Tool/packaging.xml

+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+<tool name="packaging">
+<summary>
+A framework for building binary and source packages.
+</summary>
+</tool>
+
+<builder name="Package">
+<summary>
+Builds a Binary Package of the given source files. 
+
+<example>
+env.Package(source = FindInstalledFiles())
+</example>
+</summary>
+</builder>
+
+<cvar name="JAR">
+<summary>
+The Java archive tool.
+</summary>
+</cvar>
+
+<cvar name="JARCHDIR">
+<summary>
+The directory to which the Java archive tool should change
+(using the
+<option>-C</option>
+option).
+</summary>
+</cvar>
+
+<cvar name="JARCOM">
+<summary>
+The command line used to call the Java archive tool.
+</summary>
+</cvar>
+
+<cvar name="JARCOMSTR">
+<summary>
+The string displayed when the Java archive tool
+is called
+If this is not set, then &cv-JARCOM; (the command line) is displayed.
+
+<example>
+env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
+</example>
+</summary>
+</cvar>
+
+<cvar name="JARFLAGS">
+<summary>
+General options passed to the Java archive tool.
+By default this is set to
+<option>cf</option>
+to create the necessary
+<command>jar</command>
+file.
+</summary>
+</cvar>
+
+<cvar name="JARSUFFIX">
+<summary>
+The suffix for Java archives:
+<filename>.jar</filename>
+by default.
+</summary>
+</cvar>

src/engine/SCons/Tool/packaging/__init__.py

+"""SCons.Tool.Packaging
+
+SCons Packaging Tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# 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__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Environment
+from SCons.Options import *
+from SCons.Errors import *
+from SCons.Util import is_List, make_path_relative
+
+import os, imp
+import SCons.Defaults
+
+__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
+
+#
+# Utility and Builder function
+#
+def Tag(env, target, source, *more_tags, **kw_tags):
+    """ Tag a file with the given arguments, just sets the accordingly named
+    attribute on the file object.
+
+    TODO: FIXME
+    """
+    if not target:
+        target=source
+        first_tag=None
+    else:
+        first_tag=source
+
+    if first_tag:
+        kw_tags[first_tag[0]] = ''
+
+    if len(kw_tags) == 0 and len(more_tags) == 0:
+        raise UserError, "No tags given."
+
+    # XXX: sanity checks
+    for x in more_tags:
+        kw_tags[x] = ''
+
+    if not SCons.Util.is_List(target):
+        target=[target]
+    else:
+        # hmm, sometimes the target list, is a list of a list
+        # make sure it is flattened prior to processing.
+        # TODO: perhaps some bug ?!?
+        target=env.Flatten(target)
+
+    for t in target:
+        for (k,v) in kw_tags.items():
+            # all file tags have to start with PACKAGING_, so we can later
+            # differentiate between "normal" object attributes and the
+            # packaging attributes. As the user should not be bothered with
+            # that, the prefix will be added here if missing.
+            #if not k.startswith('PACKAGING_'):
+            if k[:10] != 'PACKAGING_':
+                k='PACKAGING_'+k
+            setattr(t, k, v)
+
+def Package(env, target=None, source=None, **kw):
+    """ Entry point for the package tool.
+    """
+    # first check some arguments
+    if not source:
+        source = env.FindInstalledFiles()
+
+    if len(source)==0:
+        raise UserError, "No source for Package() given"
+
+    # has the option for this Tool been set?
+    try: kw['PACKAGETYPE']=env['PACKAGETYPE']
+    except KeyError: pass
+
+    if not kw.has_key('PACKAGETYPE') or kw['PACKAGETYPE']==None:
+        if env['BUILDERS'].has_key('Tar'):
+            kw['PACKAGETYPE']='targz'
+        elif env['BUILDERS'].has_key('Zip'):
+            kw['PACKAGETYPE']='zip'
+        else:
+            raise UserError, "No type for Package() given"
+    PACKAGETYPE=kw['PACKAGETYPE']
+    if not is_List(PACKAGETYPE):