summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2015-09-29 10:04:02 -0700
committerWilliam Deegan <bill@baddogconsulting.com>2015-09-29 10:04:02 -0700
commitec51b69ea5ed266cef7be71ee1224081b990e01e (patch)
tree6ed95a9bb7b6256864a971d90c8f099fba0f010b
parentb5e7eb1f92599801f943ad8ad568e089ec7db315 (diff)
parentf348823065b4ea605d03bdc16c1105fc25f93da0 (diff)
downloadscons-ec51b69ea5ed266cef7be71ee1224081b990e01e.tar.gz
Merged in carandraug/scons (pull request #248)
-rw-r--r--.hgignore2
-rw-r--r--QMTest/TestSCons.py2
-rw-r--r--README.rst42
-rw-r--r--ReleaseConfig2
-rw-r--r--SConstruct4
-rw-r--r--bin/docs-create-example-outputs.py2
-rw-r--r--bin/docs-validate.py1
-rw-r--r--bin/update-release-info.py1
-rwxr-xr-xbin/upload-release-files.sh14
-rw-r--r--debian/changelog6
-rw-r--r--doc/design/titlepage/SConsBuildBricks_path.svg22
-rw-r--r--doc/generated/builders.gen35
-rw-r--r--doc/generated/examples/caching_ex-random_1.xml4
-rw-r--r--doc/generated/examples/commandline_Variables_Help_1.xml2
-rw-r--r--doc/generated/examples/output_ex1_1.xml2
-rw-r--r--doc/generated/examples/output_ex2_1.xml2
-rw-r--r--doc/generated/examples/output_ex2_2.xml2
-rw-r--r--doc/generated/examples/troubleshoot_Dump_1.xml4
-rw-r--r--doc/generated/examples/troubleshoot_Dump_2.xml4
-rw-r--r--doc/generated/examples/troubleshoot_explain1_3.xml2
-rw-r--r--doc/generated/examples/troubleshoot_stacktrace_2.xml2
-rw-r--r--doc/generated/functions.gen18
-rw-r--r--doc/generated/tools.gen16
-rw-r--r--doc/generated/tools.mod2
-rw-r--r--doc/generated/variables.gen190
-rw-r--r--doc/generated/variables.mod32
-rw-r--r--doc/man/scons.xml2
-rw-r--r--doc/man/titlepage/SConsBuildBricks_path.svg22
-rw-r--r--doc/reference/titlepage/SConsBuildBricks_path.svg22
-rw-r--r--doc/user/build-install.xml2
-rw-r--r--doc/user/output.xml22
-rw-r--r--doc/user/titlepage/SConsBuildBricks_path.svg22
-rw-r--r--src/Announce.txt6
-rw-r--r--src/CHANGES.txt58
-rw-r--r--src/README.txt43
-rw-r--r--src/RELEASE.txt2
-rw-r--r--src/engine/SCons/Defaults.py15
-rw-r--r--src/engine/SCons/Environment.py2
-rw-r--r--src/engine/SCons/Node/FS.py7
-rw-r--r--src/engine/SCons/Platform/cygwin.py4
-rw-r--r--src/engine/SCons/Script/Main.py3
-rw-r--r--src/engine/SCons/Script/SConsOptions.py2
-rw-r--r--src/engine/SCons/Script/SConscript.py4
-rw-r--r--src/engine/SCons/Script/SConscript.xml16
-rw-r--r--src/engine/SCons/Script/__init__.py26
-rw-r--r--src/engine/SCons/Tool/__init__.py562
-rw-r--r--src/engine/SCons/Tool/__init__.xml51
-rw-r--r--src/engine/SCons/Tool/cyglink.py158
-rw-r--r--src/engine/SCons/Tool/cyglink.xml49
-rw-r--r--src/engine/SCons/Tool/dmd.py13
-rw-r--r--src/engine/SCons/Tool/gdc.py13
-rw-r--r--src/engine/SCons/Tool/gettext.xml2
-rw-r--r--src/engine/SCons/Tool/gnulink.py13
-rw-r--r--src/engine/SCons/Tool/gnulink.xml4
-rw-r--r--src/engine/SCons/Tool/install.py131
-rw-r--r--src/engine/SCons/Tool/install.xml11
-rw-r--r--src/engine/SCons/Tool/ldc.py13
-rw-r--r--src/engine/SCons/Tool/link.py287
-rw-r--r--src/engine/SCons/Tool/link.xml154
-rw-r--r--src/engine/SCons/Tool/linkloc.py1
-rw-r--r--src/engine/SCons/Tool/midl.xml2
-rw-r--r--src/engine/SCons/Tool/mingw.py1
-rw-r--r--src/engine/SCons/Tool/msgmerge.xml2
-rw-r--r--src/engine/SCons/Tool/mslink.py1
-rw-r--r--src/engine/SCons/Tool/msvc.xml2
-rw-r--r--src/engine/SCons/Tool/mwld.py1
-rw-r--r--src/engine/SCons/Tool/packaging/rpm.py2
-rw-r--r--src/engine/SCons/Tool/qt.py1
-rw-r--r--src/engine/SCons/Tool/sunar.py3
-rw-r--r--src/engine/SCons/Tool/sunar.xml4
-rw-r--r--src/engine/SCons/Tool/sunlink.py4
-rw-r--r--src/engine/SCons/Tool/xgettext.xml2
-rw-r--r--test/Glob/VariantDir.py34
-rw-r--r--test/Help.py63
-rw-r--r--test/LINK/SHLIBVERSIONFLAGS.py59
-rw-r--r--test/LINK/VersionedLib-VariantDir.py168
-rw-r--r--test/LINK/VersionedLib-j2.py146
-rw-r--r--test/LINK/VersionedLib-subdir.py160
-rw-r--r--test/LINK/VersionedLib.py326
-rw-r--r--test/Script-import.py1
-rw-r--r--test/TEX/variant_dir_newglossary.py2
-rw-r--r--test/packaging/guess-package-name.py2
-rw-r--r--test/packaging/msi/explicit-target.py2
83 files changed, 2496 insertions, 649 deletions
diff --git a/.hgignore b/.hgignore
index 27c728a1..a56960d9 100644
--- a/.hgignore
+++ b/.hgignore
@@ -9,6 +9,8 @@ syntax:glob
*~
*.xcodeproj
*.orig
+*.DS_Store
+*#
doc/user/scons-user
doc/user/scons_db.xml
diff --git a/QMTest/TestSCons.py b/QMTest/TestSCons.py
index a9b4e3eb..06fa5750 100644
--- a/QMTest/TestSCons.py
+++ b/QMTest/TestSCons.py
@@ -34,7 +34,7 @@ from TestCmd import PIPE
# here provides some independent verification that what we packaged
# conforms to what we expect.
-default_version = '2.3.6'
+default_version = '2.4.0'
python_version_unsupported = (2, 3, 0)
python_version_deprecated = (2, 7, 0)
diff --git a/README.rst b/README.rst
index 9ed0cccd..05be7128 100644
--- a/README.rst
+++ b/README.rst
@@ -47,7 +47,7 @@ version at the SCons download page:
Execution Requirements
======================
-Running SCons requires Python version 2.6 or later (Python 3 is not
+Running SCons requires Python version 2.7 or later (Python 3 is not
yet supported). There should be no other dependencies or requirements
to run SCons.
@@ -156,7 +156,7 @@ Or on Windows::
By default, the above commands will do the following:
-- Install the version-numbered "scons-2.3.3" and "sconsign-2.3.3" scripts in
+- Install the version-numbered "scons-2.4.0" and "sconsign-2.4.0" scripts in
the default system script directory (/usr/bin or C:\\Python\*\\Scripts, for
example). This can be disabled by specifying the "--no-version-script"
option on the command line.
@@ -168,23 +168,23 @@ By default, the above commands will do the following:
before making it the default on your system.
On UNIX or Linux systems, you can have the "scons" and "sconsign" scripts be
- hard links or symbolic links to the "scons-2.3.3" and "sconsign-2.3.3"
+ hard links or symbolic links to the "scons-2.4.0" and "sconsign-2.4.0"
scripts by specifying the "--hardlink-scons" or "--symlink-scons" options on
the command line.
-- Install "scons-2.3.3.bat" and "scons.bat" wrapper scripts in the Python
+- Install "scons-2.4.0.bat" and "scons.bat" wrapper scripts in the Python
prefix directory on Windows (C:\\Python\*, for example). This can be disabled
by specifying the "--no-install-bat" option on the command line.
On UNIX or Linux systems, the "--install-bat" option may be specified to
- have "scons-2.3.3.bat" and "scons.bat" files installed in the default system
+ have "scons-2.4.0.bat" and "scons.bat" files installed in the default system
script directory, which is useful if you want to install SCons in a shared
file system directory that can be used to execute SCons from both UNIX/Linux
and Windows systems.
- Install the SCons build engine (a Python module) in an appropriate
- version-numbered SCons library directory (/usr/lib/scons-2.3.3 or
- C:\\Python\*\\scons-2.3.3, for example). See below for more options related to
+ version-numbered SCons library directory (/usr/lib/scons-2.4.0 or
+ C:\\Python\*\\scons-2.4.0, for example). See below for more options related to
installing the build engine library.
- Install the troff-format man pages in an appropriate directory on UNIX or
@@ -462,7 +462,7 @@ running all of "runtest.py -a".
Building Packages
=================
-We use SCons (version 2.3.3 or later) to build its own packages. If you
+We use SCons (version 2.4.0 or later) to build its own packages. If you
already have an appropriate version of SCons installed on your system, you can
build everything by simply running it::
@@ -477,18 +477,18 @@ about `Executing SCons Without Installing`_)::
Depending on the utilities installed on your system, any or all of the
following packages will be built::
- build/dist/scons-2.3.3-1.noarch.rpm
- build/dist/scons-2.3.3-1.src.rpm
- build/dist/scons-2.3.3.linux-i686.tar.gz
- build/dist/scons-2.3.6.tar.gz
- build/dist/scons-2.3.6.win32.exe
- build/dist/scons-2.3.6.zip
- build/dist/scons-doc-2.3.6.tar.gz
- build/dist/scons-local-2.3.6.tar.gz
- build/dist/scons-local-2.3.6.zip
- build/dist/scons-src-2.3.6.tar.gz
- build/dist/scons-src-2.3.6.zip
- build/dist/scons_2.3.3-1_all.deb
+ build/dist/scons-2.4.0-1.noarch.rpm
+ build/dist/scons-2.4.0-1.src.rpm
+ build/dist/scons-2.4.0.linux-i686.tar.gz
+ build/dist/scons-2.4.0.tar.gz
+ build/dist/scons-2.4.0.win32.exe
+ build/dist/scons-2.4.0.zip
+ build/dist/scons-doc-2.4.0.tar.gz
+ build/dist/scons-local-2.4.0.tar.gz
+ build/dist/scons-local-2.4.0.zip
+ build/dist/scons-src-2.4.0.tar.gz
+ build/dist/scons-src-2.4.0.zip
+ build/dist/scons_2.4.0-1_all.deb
The SConstruct file is supposed to be smart enough to avoid trying to build
packages for which you don't have the proper utilities installed. For
@@ -748,5 +748,5 @@ many contributors, including but not at all limited to:
\... and many others.
-__COPYRIGHT__
+Copyright (c) 2001 - 2015 The SCons Foundation
diff --git a/ReleaseConfig b/ReleaseConfig
index 5a191baf..61944386 100644
--- a/ReleaseConfig
+++ b/ReleaseConfig
@@ -32,7 +32,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
# 'final', the patchlevel is set to the release date. This value is
# mandatory and must be present in this file.
#version_tuple = (2, 2, 0, 'final', 0)
-version_tuple = (2, 3, 8, 'alpha', 0)
+version_tuple = (2, 4, 1, 'alpha', 0)
# Python versions prior to unsupported_python_version cause a fatal error
# when that version is used. Python versions prior to deprecate_python_version
diff --git a/SConstruct b/SConstruct
index e8b6c9a0..4bff134f 100644
--- a/SConstruct
+++ b/SConstruct
@@ -6,7 +6,7 @@
copyright_years = '2001 - 2015'
# This gets inserted into the man pages to reflect the month of release.
-month_year = 'July 2015'
+month_year = 'September 2015'
#
# __COPYRIGHT__
@@ -43,7 +43,7 @@ import tempfile
import bootstrap
project = 'scons'
-default_version = '2.3.6'
+default_version = '2.4.0'
copyright = "Copyright (c) %s The SCons Foundation" % copyright_years
platform = distutils.util.get_platform()
diff --git a/bin/docs-create-example-outputs.py b/bin/docs-create-example-outputs.py
index 30dc0eef..6e59d9f9 100644
--- a/bin/docs-create-example-outputs.py
+++ b/bin/docs-create-example-outputs.py
@@ -14,6 +14,6 @@ if __name__ == "__main__":
print "OK"
else:
print "Not all example names and suffixes are unique! Please correct the errors listed above and try again."
- sys.exit(0)
+ sys.exit(1)
SConsExamples.createAllExampleOutputs(os.path.join('doc','user'))
diff --git a/bin/docs-validate.py b/bin/docs-validate.py
index c445c3f9..f888c219 100644
--- a/bin/docs-validate.py
+++ b/bin/docs-validate.py
@@ -25,3 +25,4 @@ if __name__ == "__main__":
print "OK"
else:
print "Validation failed! Please correct the errors above and try again."
+ sys.exit(1)
diff --git a/bin/update-release-info.py b/bin/update-release-info.py
index 59b3e848..896f54ac 100644
--- a/bin/update-release-info.py
+++ b/bin/update-release-info.py
@@ -295,6 +295,7 @@ t = UpdateFile(os.path.join('src', 'Announce.txt'))
if DEBUG: t.file = '/tmp/Announce.txt'
t.sub('\nRELEASE .*', '\nRELEASE ' + version_string + ' - ' + t.new_date)
+
# Update SConstruct
t = UpdateFile('SConstruct')
diff --git a/bin/upload-release-files.sh b/bin/upload-release-files.sh
index bf097514..c853bdaa 100755
--- a/bin/upload-release-files.sh
+++ b/bin/upload-release-files.sh
@@ -1,4 +1,6 @@
#!/bin/sh
+set -e
+set -x
if [ $# -lt 2 ]; then
echo Usage: $0 VERSION SF_USERNAME
@@ -15,7 +17,10 @@ SF_TOPDIR='/home/frs/project/scons'
# the build products are here:
cd build/dist
-cp -f ../../src/CHANGES.txt ../../src/RELEASE.txt ../../src/Announce.txt .
+cp -f ../../src/CHANGES.txt ../../src/RELEASE.txt ../../src/Announce.txt ../../src/README.txt .
+
+cp scons-$VERSION.win32.exe scons-$VERSION-setup.exe
+cp scons-$VERSION.win-amd64.exe scons-$VERSION-amd64-setup.exe
set -x
@@ -24,6 +29,7 @@ $RSYNC $RSYNCOPTS \
scons-$VERSION-1.noarch.rpm \
scons-$VERSION-1.src.rpm \
scons-$VERSION-setup.exe \
+ scons-$VERSION-amd64-setup.exe \
scons-$VERSION.tar.gz \
scons-$VERSION.zip \
Announce.txt CHANGES.txt RELEASE.txt \
@@ -43,6 +49,12 @@ $RSYNC $RSYNCOPTS \
Announce.txt CHANGES.txt RELEASE.txt \
$SF_USER@$SF_MACHINE:$SF_TOPDIR/scons-src/$VERSION/
+# Readme
+$RSYNC $RSYNCOPTS \
+ README.txt \
+ $SF_USER@$SF_MACHINE:$SF_TOPDIR/
+
+
#
# scons.org stuff:
diff --git a/debian/changelog b/debian/changelog
index b161db10..7311f786 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+scons (2.4.0) unstable; urgency=low
+
+ * Maintenance release.
+
+ -- William Deegan <bill@baddogconsulting.com> Mon, 21 Sep 2015 08:56:00 -0700
+
scons (2.3.6) unstable; urgency=low
* Maintenance release.
diff --git a/doc/design/titlepage/SConsBuildBricks_path.svg b/doc/design/titlepage/SConsBuildBricks_path.svg
index ed0c60d7..0d7f63e0 100644
--- a/doc/design/titlepage/SConsBuildBricks_path.svg
+++ b/doc/design/titlepage/SConsBuildBricks_path.svg
@@ -14,9 +14,9 @@
height="80.330002"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.48.1 r9760"
+ inkscape:version="0.48.4 r9939"
version="1.0"
- sodipodi:docname="SConsBuildBricks.svg"
+ sodipodi:docname="SConsBuildBricks_path.svg"
inkscape:export-filename="Constructs-using-SCons.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
@@ -77,24 +77,22 @@
</cc:Agent>
</dc:contributor>
<cc:license
- rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.0/" />
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
- rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
+ rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:prohibits
- rdf:resource="http://web.resource.org/cc/CommercialUse" />
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
diff --git a/doc/generated/builders.gen b/doc/generated/builders.gen
index 02dc04b9..d49156f3 100644
--- a/doc/generated/builders.gen
+++ b/doc/generated/builders.gen
@@ -505,20 +505,13 @@ env.InstallAs(target = ['../lib/libfoo.a', '../lib/libbar.a'],
</term>
<listitem>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
-Installs a versioned shared library. The <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link>
-construction variable should be defined in the environment
-to confirm the version number in the library name.
-If <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> is not defined a warning will be issued
-and the name of the library will be parsed to derive the version.
-The symlinks appropriate to the architecture will be generated.
+Installs a versioned shared library. The symlinks appropriate to the
+architecture will be generated based on symlinks of the source library.
</para>
<example_commands xmlns="http://www.scons.org/dbxsd/v1.0">
env.InstallVersionedLib(target = '/usr/local/bin/foo',
source = 'libxyz.1.5.2.so')
-env.InstallVersionedLib(target = '/usr/local/bin/foo',
- source = 'libxyz.1.5.2.so',
- SHLIBVERSION='1.5.2')
</example_commands>
</listitem>
</varlistentry>
@@ -1257,7 +1250,7 @@ file as the second element. Normally the object file is ignored.
This builder method is only
provided when Microsoft Visual C++ is being used as the compiler.
The PCH builder method is generally used in
-conjuction with the PCH construction variable to force object files to use
+conjunction with the PCH construction variable to force object files to use
the precompiled header:
</para>
@@ -1490,7 +1483,7 @@ the results shall be as the comments above say.
<emphasis>Example 2.</emphasis>
The <function xmlns="http://www.scons.org/dbxsd/v1.0">POTUpdate</function> builder may be used with no target specified, in which
case default target <filename>messages.pot</filename> will be used. The
-default target may also be overriden by setting <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-POTDOMAIN"><envar>$POTDOMAIN</envar></link> construction
+default target may also be overridden by setting <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-POTDOMAIN"><envar>$POTDOMAIN</envar></link> construction
variable or providing it as an override to <function xmlns="http://www.scons.org/dbxsd/v1.0">POTUpdate</function> builder:
</para>
<example_commands xmlns="http://www.scons.org/dbxsd/v1.0">
@@ -1623,7 +1616,7 @@ Target nodes defined through <function xmlns="http://www.scons.org/dbxsd/v1.0">P
(they're <literal>Ignore</literal>d from <literal>'.'</literal> node). Instead,
they are added automatically to special <literal>Alias</literal>
(<literal>'po-update'</literal> by default). The alias name may be changed
-through the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-POUPDATE_ALIAS"><envar>$POUPDATE_ALIAS</envar></link> construction variable. You can easilly
+through the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-POUPDATE_ALIAS"><envar>$POUPDATE_ALIAS</envar></link> construction variable. You can easily
update <literal>PO</literal> files in your project by <command>scons
po-update</command>.
</para>
@@ -1995,22 +1988,20 @@ For maximum portability, use the <function xmlns="http://www.scons.org/dbxsd/v1.
When the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> construction variable is defined a versioned
shared library is created. This modifies the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLINKFLAGS"><envar>$SHLINKFLAGS</envar></link> as required,
adds the version number to the library name, and creates the symlinks that
-are needed. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> needs to be of the form X.Y.Z, where X
-and Y are numbers, and Z is a number but can also contain letters to designate
-alpha, beta, or release candidate patch levels.
+are needed.
</para>
<example_commands xmlns="http://www.scons.org/dbxsd/v1.0">
env.SharedLibrary(target = 'bar', source = ['bar.c', 'foo.o'], SHLIBVERSION='1.5.2')
</example_commands>
-
<para xmlns="http://www.scons.org/dbxsd/v1.0">
-This builder may create multiple links to the library. On a POSIX system,
-for the shared library libbar.so.2.3.1, the links created would be
-libbar.so and libbar.so.2; on a Darwin (OSX) system
-the library would be libbar.2.3.1.dylib and the link would be
-libbar.dylib.
+On a POSIX system, versions with a single token create exactly one symlink:
+libbar.so.6 would have symlinks libbar.so only.
+On a POSIX system, versions with two or more
+tokens create exactly two symlinks: libbar.so.2.3.1 would have symlinks
+libbar.so and libbar.so.2; on a Darwin (OSX) system the library would be
+libbar.2.3.1.dylib and the link would be libbar.dylib.
</para>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
@@ -2564,7 +2555,7 @@ running <command>scons '.'</command>.</para></note>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
Builds a Windows type library (<filename>.tlb</filename>)
file from an input IDL file (<filename>.idl</filename>).
-In addition, it will build the associated inteface stub and
+In addition, it will build the associated interface stub and
proxy source files,
naming them according to the base name of the <filename>.idl</filename> file.
For example,
diff --git a/doc/generated/examples/caching_ex-random_1.xml b/doc/generated/examples/caching_ex-random_1.xml
index 6f64f8f3..904e1dd4 100644
--- a/doc/generated/examples/caching_ex-random_1.xml
+++ b/doc/generated/examples/caching_ex-random_1.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<screen xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">% <userinput>scons -Q</userinput>
cc -o f2.o -c f2.c
-cc -o f4.o -c f4.c
-cc -o f3.o -c f3.c
cc -o f5.o -c f5.c
+cc -o f3.o -c f3.c
+cc -o f4.o -c f4.c
cc -o f1.o -c f1.c
cc -o prog f1.o f2.o f3.o f4.o f5.o
</screen>
diff --git a/doc/generated/examples/commandline_Variables_Help_1.xml b/doc/generated/examples/commandline_Variables_Help_1.xml
index db171eb2..76f13c5c 100644
--- a/doc/generated/examples/commandline_Variables_Help_1.xml
+++ b/doc/generated/examples/commandline_Variables_Help_1.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<screen xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">% <userinput>scons -Q -h</userinput>
+Local Build Variables:
+
RELEASE: Set to 1 to build for release
default: 0
actual: 0
diff --git a/doc/generated/examples/output_ex1_1.xml b/doc/generated/examples/output_ex1_1.xml
index 535960bc..2607243c 100644
--- a/doc/generated/examples/output_ex1_1.xml
+++ b/doc/generated/examples/output_ex1_1.xml
@@ -3,6 +3,8 @@
scons: Reading SConscript files ...
scons: done reading SConscript files.
+Local Build Variables:
+
Type: 'scons program' to build the production program,
'scons debug' to build the debug version.
diff --git a/doc/generated/examples/output_ex2_1.xml b/doc/generated/examples/output_ex2_1.xml
index e951c3ad..74d7192e 100644
--- a/doc/generated/examples/output_ex2_1.xml
+++ b/doc/generated/examples/output_ex2_1.xml
@@ -3,6 +3,8 @@
scons: Reading SConscript files ...
scons: done reading SConscript files.
+Local Build Variables:
+
Type: 'scons program' to build the production program.
Type: 'scons windebug' to build the Windows debug version.
diff --git a/doc/generated/examples/output_ex2_2.xml b/doc/generated/examples/output_ex2_2.xml
index 8dca6c35..9130d5a3 100644
--- a/doc/generated/examples/output_ex2_2.xml
+++ b/doc/generated/examples/output_ex2_2.xml
@@ -3,6 +3,8 @@
scons: Reading SConscript files ...
scons: done reading SConscript files.
+Local Build Variables:
+
Type: 'scons program' to build the production program.
Use scons -H for help about command-line options.
diff --git a/doc/generated/examples/troubleshoot_Dump_1.xml b/doc/generated/examples/troubleshoot_Dump_1.xml
index 248e85c0..bf141a0f 100644
--- a/doc/generated/examples/troubleshoot_Dump_1.xml
+++ b/doc/generated/examples/troubleshoot_Dump_1.xml
@@ -64,7 +64,11 @@ scons: Reading SConscript files ...
'_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
'_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
'__DRPATH': '$_DRPATH',
+ '__DSHLIBVERSIONFLAGS': '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}',
+ '__LDMODULEVERSIONFLAGS': '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}',
'__RPATH': '$_RPATH',
+ '__SHLIBVERSIONFLAGS': '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}',
+ '__libversionflags': &lt;function __libversionflags at 0x700000&amp;gt;,
'_concat': &lt;function _concat at 0x700000&amp;gt;,
'_defines': &lt;function _defines at 0x700000&amp;gt;,
'_stripixes': &lt;function _stripixes at 0x700000&amp;gt;}
diff --git a/doc/generated/examples/troubleshoot_Dump_2.xml b/doc/generated/examples/troubleshoot_Dump_2.xml
index d6fa4041..0ae8fe1b 100644
--- a/doc/generated/examples/troubleshoot_Dump_2.xml
+++ b/doc/generated/examples/troubleshoot_Dump_2.xml
@@ -97,6 +97,10 @@ scons: Reading SConscript files ...
'_LIBDIRFLAGS': '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
'_LIBFLAGS': '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
'_MSVC_OUTPUT_FLAG': &lt;function msvc_output_flag at 0x700000&amp;gt;,
+ '__DSHLIBVERSIONFLAGS': '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}',
+ '__LDMODULEVERSIONFLAGS': '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}',
+ '__SHLIBVERSIONFLAGS': '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}',
+ '__libversionflags': &lt;function __libversionflags at 0x700000&amp;gt;,
'_concat': &lt;function _concat at 0x700000&amp;gt;,
'_defines': &lt;function _defines at 0x700000&amp;gt;,
'_stripixes': &lt;function _stripixes at 0x700000&amp;gt;}
diff --git a/doc/generated/examples/troubleshoot_explain1_3.xml b/doc/generated/examples/troubleshoot_explain1_3.xml
index 246ee56d..9763efe7 100644
--- a/doc/generated/examples/troubleshoot_explain1_3.xml
+++ b/doc/generated/examples/troubleshoot_explain1_3.xml
@@ -3,5 +3,5 @@
cp file.in file.oout
scons: warning: Cannot find target file.out after building
-File "/home/bdbaddog/scons/as_scons/bootstrap/src/script/scons.py", line 199, in &lt;module&gt;
+File "/home/bdbaddog/scons/scons/bootstrap/src/script/scons.py", line 199, in &lt;module&gt;
</screen>
diff --git a/doc/generated/examples/troubleshoot_stacktrace_2.xml b/doc/generated/examples/troubleshoot_stacktrace_2.xml
index 1ab65ee3..add59ff4 100644
--- a/doc/generated/examples/troubleshoot_stacktrace_2.xml
+++ b/doc/generated/examples/troubleshoot_stacktrace_2.xml
@@ -8,6 +8,6 @@ scons: internal stack trace:
return SCons.Taskmaster.OutOfDateTask.prepare(self)
File "bootstrap/src/engine/SCons/Taskmaster.py", line 191, in prepare
executor.prepare()
- File "bootstrap/src/engine/SCons/Executor.py", line 396, in prepare
+ File "bootstrap/src/engine/SCons/Executor.py", line 430, in prepare
raise SCons.Errors.StopError(msg % (s, self.batches[0].targets[0]))
</screen>
diff --git a/doc/generated/functions.gen b/doc/generated/functions.gen
index 3ad36e5e..e80c1c98 100644
--- a/doc/generated/functions.gen
+++ b/doc/generated/functions.gen
@@ -2565,10 +2565,10 @@ sources = Glob('*.cpp', exclude=['os_*_specific_*.cpp']) + Glob('os_%s_specific_
</varlistentry>
<varlistentry id="f-Help">
<term>
- <literal>Help(text)</literal>
+ <literal>Help(text, append=False)</literal>
</term>
<term>
- <literal>env.Help(text)</literal>
+ <literal>env.Help(text, append=False)</literal>
</term>
<listitem>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
@@ -2576,12 +2576,18 @@ This specifies help text to be printed if the
<option>-h</option>
argument is given to
<filename xmlns="http://www.scons.org/dbxsd/v1.0">scons</filename>.
-If
+If
<function xmlns="http://www.scons.org/dbxsd/v1.0">Help</function>
-is called multiple times, the text is appended together in the order
-that
+is called multiple times, the text is appended together in the order that
<function xmlns="http://www.scons.org/dbxsd/v1.0">Help</function>
-is called.
+is called. With append set to False, any
+<function xmlns="http://www.scons.org/dbxsd/v1.0">Help</function>
+text generated with
+<function xmlns="http://www.scons.org/dbxsd/v1.0">AddOption</function>
+is clobbered. If append is True, the AddOption help is prepended to the help
+string, thus preserving the
+<option>-h</option>
+message.
</para>
</listitem>
</varlistentry>
diff --git a/doc/generated/tools.gen b/doc/generated/tools.gen
index db894759..fcb75877 100644
--- a/doc/generated/tools.gen
+++ b/doc/generated/tools.gen
@@ -129,6 +129,14 @@ Sets construction variables for generic POSIX C++ compilers.
</para>
<para>Sets: &cv-link-CPPDEFPREFIX;, &cv-link-CPPDEFSUFFIX;, &cv-link-CXX;, &cv-link-CXXCOM;, &cv-link-CXXFILESUFFIX;, &cv-link-CXXFLAGS;, &cv-link-INCPREFIX;, &cv-link-INCSUFFIX;, &cv-link-OBJSUFFIX;, &cv-link-SHCXX;, &cv-link-SHCXXCOM;, &cv-link-SHCXXFLAGS;, &cv-link-SHOBJSUFFIX;.</para><para>Uses: &cv-link-CXXCOMSTR;.</para></listitem>
</varlistentry>
+ <varlistentry id="t-cyglink">
+ <term>cyglink</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Set construction variables for cygwin linker/loader.
+</para>
+<para>Sets: &cv-link-IMPLIBPREFIX;, &cv-link-IMPLIBSUFFIX;, &cv-link-LDMODULEVERSIONFLAGS;, &cv-link-LINKFLAGS;, &cv-link-RPATHPREFIX;, &cv-link-RPATHSUFFIX;, &cv-link-SHLIBPREFIX;, &cv-link-SHLIBSUFFIX;, &cv-link-SHLIBVERSIONFLAGS;, &cv-link-SHLINKCOM;, &cv-link-SHLINKFLAGS;, &cv-link-_LDMODULEVERSIONFLAGS;, &cv-link-_SHLIBVERSIONFLAGS;.</para></listitem>
+ </varlistentry>
<varlistentry id="t-default">
<term>default</term>
<listitem>
@@ -395,7 +403,7 @@ Sets construction variables for the D language compiler GDC.
<listitem>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
This is actually a toolset, which supports internationalization and
-localization of sofware being constructed with SCons. The toolset loads
+localization of software being constructed with SCons. The toolset loads
following tools:
</para>
@@ -454,7 +462,7 @@ Sets construction variables for the GNU F95/F2003 GNU compiler.
<para xmlns="http://www.scons.org/dbxsd/v1.0">
Set construction variables for GNU linker/loader.
</para>
-<para>Sets: &cv-link-RPATHPREFIX;, &cv-link-RPATHSUFFIX;, &cv-link-SHLINKFLAGS;.</para></listitem>
+<para>Sets: &cv-link-LDMODULEVERSIONFLAGS;, &cv-link-RPATHPREFIX;, &cv-link-RPATHSUFFIX;, &cv-link-SHLIBVERSIONFLAGS;, &cv-link-SHLINKFLAGS;, &cv-link-_LDMODULESONAME;, &cv-link-_SHLIBSONAME;.</para></listitem>
</varlistentry>
<varlistentry id="t-gs">
<term>gs</term>
@@ -623,7 +631,7 @@ Sets construction variables for the <application xmlns="http://www.scons.org/dbx
<para xmlns="http://www.scons.org/dbxsd/v1.0">
Sets construction variables for generic POSIX linkers.
</para>
-<para>Sets: &cv-link-LDMODULE;, &cv-link-LDMODULECOM;, &cv-link-LDMODULEFLAGS;, &cv-link-LDMODULEPREFIX;, &cv-link-LDMODULESUFFIX;, &cv-link-LIBDIRPREFIX;, &cv-link-LIBDIRSUFFIX;, &cv-link-LIBLINKPREFIX;, &cv-link-LIBLINKSUFFIX;, &cv-link-LINK;, &cv-link-LINKCOM;, &cv-link-LINKFLAGS;, &cv-link-SHLIBSUFFIX;, &cv-link-SHLINK;, &cv-link-SHLINKCOM;, &cv-link-SHLINKFLAGS;.</para><para>Uses: &cv-link-LDMODULECOMSTR;, &cv-link-LINKCOMSTR;, &cv-link-SHLINKCOMSTR;.</para></listitem>
+<para>Sets: &cv-link-LDMODULE;, &cv-link-LDMODULECOM;, &cv-link-LDMODULEFLAGS;, &cv-link-LDMODULENOVERSIONSYMLINKS;, &cv-link-LDMODULEPREFIX;, &cv-link-LDMODULESUFFIX;, &cv-link-LDMODULEVERSION;, &cv-link-LDMODULEVERSIONFLAGS;, &cv-link-LIBDIRPREFIX;, &cv-link-LIBDIRSUFFIX;, &cv-link-LIBLINKPREFIX;, &cv-link-LIBLINKSUFFIX;, &cv-link-LINK;, &cv-link-LINKCOM;, &cv-link-LINKFLAGS;, &cv-link-SHLIBSUFFIX;, &cv-link-SHLINK;, &cv-link-SHLINKCOM;, &cv-link-SHLINKFLAGS;, &cv-link-__LDMODULEVERSIONFLAGS;, &cv-link-__SHLIBVERSIONFLAGS;.</para><para>Uses: &cv-link-LDMODULECOMSTR;, &cv-link-LINKCOMSTR;, &cv-link-SHLINKCOMSTR;.</para></listitem>
</varlistentry>
<varlistentry id="t-linkloc">
<term>linkloc</term>
@@ -901,7 +909,7 @@ Sets construction variables for the SGI linker.
<para xmlns="http://www.scons.org/dbxsd/v1.0">
Sets construction variables for the Sun library archiver.
</para>
-<para>Sets: &cv-link-AR;, &cv-link-ARCOM;, &cv-link-ARFLAGS;, &cv-link-LIBPREFIX;, &cv-link-LIBSUFFIX;, &cv-link-SHLINK;, &cv-link-SHLINKCOM;, &cv-link-SHLINKFLAGS;.</para><para>Uses: &cv-link-ARCOMSTR;, &cv-link-SHLINKCOMSTR;.</para></listitem>
+<para>Sets: &cv-link-AR;, &cv-link-ARCOM;, &cv-link-ARFLAGS;, &cv-link-LIBPREFIX;, &cv-link-LIBSUFFIX;.</para><para>Uses: &cv-link-ARCOMSTR;.</para></listitem>
</varlistentry>
<varlistentry id="t-suncXX">
<term>sunc++</term>
diff --git a/doc/generated/tools.mod b/doc/generated/tools.mod
index 5a5795ad..1191e6a3 100644
--- a/doc/generated/tools.mod
+++ b/doc/generated/tools.mod
@@ -22,6 +22,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY t-cvf "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>cvf</literal>">
<!ENTITY t-CVS "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>CVS</literal>">
<!ENTITY t-cXX "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>cXX</literal>">
+<!ENTITY t-cyglink "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>cyglink</literal>">
<!ENTITY t-default "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>default</literal>">
<!ENTITY t-dmd "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>dmd</literal>">
<!ENTITY t-docbook "<literal xmlns='http://www.scons.org/dbxsd/v1.0'>docbook</literal>">
@@ -132,6 +133,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY t-link-cvf "<link linkend='t-cvf' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>cvf</literal></link>">
<!ENTITY t-link-CVS "<link linkend='t-CVS' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>CVS</literal></link>">
<!ENTITY t-link-cXX "<link linkend='t-cXX' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>cXX</literal></link>">
+<!ENTITY t-link-cyglink "<link linkend='t-cyglink' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>cyglink</literal></link>">
<!ENTITY t-link-default "<link linkend='t-default' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>default</literal></link>">
<!ENTITY t-link-dmd "<link linkend='t-dmd' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>dmd</literal></link>">
<!ENTITY t-link-docbook "<link linkend='t-docbook' xmlns='http://www.scons.org/dbxsd/v1.0'><literal>docbook</literal></link>">
diff --git a/doc/generated/variables.gen b/doc/generated/variables.gen
index bf18796d..3d8a87af 100644
--- a/doc/generated/variables.gen
+++ b/doc/generated/variables.gen
@@ -13,6 +13,24 @@
]>
<variablelist xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+ <varlistentry id="cv-__LDMODULEVERSIONFLAGS">
+ <term>__LDMODULEVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+This construction variable automatically introduces <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-_LDMODULEVERSIONFLAGS"><envar>$_LDMODULEVERSIONFLAGS</envar></link>
+if <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> is set. Othervise it evaluates to an empty string.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-__SHLIBVERSIONFLAGS">
+ <term>__SHLIBVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+This construction variable automatically introduces <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-_SHLIBVERSIONFLAGS"><envar>$_SHLIBVERSIONFLAGS</envar></link>
+if <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> is set. Othervise it evaluates to an empty string.
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-AR">
<term>AR</term>
<listitem>
@@ -2874,6 +2892,52 @@ The default list is:
</example_commands>
</listitem>
</varlistentry>
+ <varlistentry id="cv-IMPLIBNOVERSIONSYMLINKS">
+ <term>IMPLIBNOVERSIONSYMLINKS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Used to override <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBNOVERSIONSYMLINKS"><envar>$SHLIBNOVERSIONSYMLINKS</envar></link>/<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULENOVERSIONSYMLINKS"><envar>$LDMODULENOVERSIONSYMLINKS</envar></link> when
+creating versioned import library for a shared library/loadable module. If not defined,
+then <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBNOVERSIONSYMLINKS"><envar>$SHLIBNOVERSIONSYMLINKS</envar></link>/<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULENOVERSIONSYMLINKS"><envar>$LDMODULENOVERSIONSYMLINKS</envar></link> is used to determine
+whether to disable symlink generation or not.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-IMPLIBPREFIX">
+ <term>IMPLIBPREFIX</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+The prefix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="t-cyglink"><literal>cyglink</literal></link> linker sets
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-IMPLIBPREFIX"><envar>$IMPLIBPREFIX</envar></link> to <literal>'lib'</literal> and <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBPREFIX"><envar>$SHLIBPREFIX</envar></link>
+to <literal>'cyg'</literal>.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-IMPLIBSUFFIX">
+ <term>IMPLIBSUFFIX</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+The suffix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="t-cyglink"><literal>cyglink</literal></link> linker sets
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-IMPLIBSUFFIX"><envar>$IMPLIBSUFFIX</envar></link> to <literal>'.dll.a'</literal> and <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBSUFFIX"><envar>$SHLIBSUFFIX</envar></link>
+to <literal>'.dll'</literal>.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-IMPLIBVERSION">
+ <term>IMPLIBVERSION</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Used to override <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link>/<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> when
+generating versioned import library for a shared library/loadable module. If
+undefined, the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link>/<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> is used to
+determine the version of versioned import library.
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-IMPLICIT_COMMAND_DEPENDENCIES">
<term>IMPLICIT_COMMAND_DEPENDENCIES</term>
<listitem>
@@ -3408,6 +3472,15 @@ General user options passed to the linker for building loadable modules.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-LDMODULENOVERSIONSYMLINKS">
+ <term>LDMODULENOVERSIONSYMLINKS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Instructs the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-LoadableModule"><function>LoadableModule</function></link> builder to not automatically create symlinks
+for versioned modules. Defaults to <literal>$SHLIBNOVERSIONSYMLINKS</literal>
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-LDMODULEPREFIX">
<term>LDMODULEPREFIX</term>
<listitem>
@@ -3419,6 +3492,16 @@ the same as <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBPREFI
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-_LDMODULESONAME">
+ <term>_LDMODULESONAME</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+A macro that automatically generates loadable module's SONAME based on $TARGET,
+$LDMODULEVERSION and $LDMODULESUFFIX. Used by <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-LoadableModule"><function>LoadableModule</function></link> builder
+when the linker tool supports SONAME (e.g. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="t-gnulink"><literal>gnulink</literal></link>).
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-LDMODULESUFFIX">
<term>LDMODULESUFFIX</term>
<listitem>
@@ -3430,6 +3513,42 @@ the same as $SHLIBSUFFIX.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-LDMODULEVERSION">
+ <term>LDMODULEVERSION</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+When this construction variable is defined, a versioned loadable module
+is created by <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-LoadableModule"><function>LoadableModule</function></link> builder. This activates the
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-_LDMODULEVERSIONFLAGS"><envar>$_LDMODULEVERSIONFLAGS</envar></link> and thus modifies the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULECOM"><envar>$LDMODULECOM</envar></link> as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> versions should exist in the same
+format as <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link>.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-LDMODULEVERSIONFLAGS">
+ <term>LDMODULEVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Extra flags added to <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULECOM"><envar>$LDMODULECOM</envar></link> when building versioned
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-LoadableModule"><function>LoadableModule</function></link>. These flags are only used when <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> is
+set.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-_LDMODULEVERSIONFLAGS">
+ <term>_LDMODULEVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+This macro automatically introduces extra flags to <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULECOM"><envar>$LDMODULECOM</envar></link> when
+building versioned <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-LoadableModule"><function>LoadableModule</function></link> (that is when
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-LDMODULEVERSION"><envar>$LDMODULEVERSION</envar></link> is set). <literal>_LDMODULEVERSIONFLAGS</literal>
+usually adds <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSIONFLAGS"><envar>$SHLIBVERSIONFLAGS</envar></link> and some extra dynamically generated
+options (such as <literal>-Wl,-soname=$_LDMODULESONAME</literal>). It is unused
+by plain (unversioned) loadable modules.
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-LEX">
<term>LEX</term>
<listitem>
@@ -6385,6 +6504,15 @@ TODO
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-SHLIBNOVERSIONSYMLINKS">
+ <term>SHLIBNOVERSIONSYMLINKS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Instructs the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-SharedLibrary"><function>SharedLibrary</function></link> builder to not create symlinks for versioned
+shared libraries.
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-SHLIBPREFIX">
<term>SHLIBPREFIX</term>
<listitem>
@@ -6393,6 +6521,16 @@ The prefix used for shared library file names.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-_SHLIBSONAME">
+ <term>_SHLIBSONAME</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+A macro that automatically generates shared library's SONAME based on $TARGET,
+$SHLIBVERSION and $SHLIBSUFFIX. Used by <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-SharedLibrary"><function>SharedLibrary</function></link> builder when
+the linker tool supports SONAME (e.g. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="t-gnulink"><literal>gnulink</literal></link>).
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-SHLIBSUFFIX">
<term>SHLIBSUFFIX</term>
<listitem>
@@ -6406,11 +6544,35 @@ The suffix used for shared library file names.
<listitem>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
When this construction variable is defined, a versioned shared library
-is created. This modifies the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLINKFLAGS"><envar>$SHLINKFLAGS</envar></link> as required, adds
-the version number to the library name, and creates the symlinks that
-are needed. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> needs to be of the form X.Y.Z,
-where X and Y are numbers, and Z is a number but can also contain
-letters to designate alpha, beta, or release candidate patch levels.
+is created by <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-SharedLibrary"><function>SharedLibrary</function></link> builder. This activates the
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-_SHLIBVERSIONFLAGS"><envar>$_SHLIBVERSIONFLAGS</envar></link> and thus modifies the <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLINKCOM"><envar>$SHLINKCOM</envar></link> as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> versions should exist as alpha-numeric,
+decimal-delimited values as defined by the regular expression "\w+[\.\w+]*".
+Example <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> values include '1', '1.2.3', and '1.2.gitaa412c8b'.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-SHLIBVERSIONFLAGS">
+ <term>SHLIBVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Extra flags added to <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLINKCOM"><envar>$SHLINKCOM</envar></link> when building versioned
+<link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-SharedLibrary"><function>SharedLibrary</function></link>. These flags are only used when <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link> is
+set.
+</para>
+</listitem>
+ </varlistentry>
+ <varlistentry id="cv-_SHLIBVERSIONFLAGS">
+ <term>_SHLIBVERSIONFLAGS</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+This macro automatically introduces extra flags to <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLINKCOM"><envar>$SHLINKCOM</envar></link> when
+building versioned <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="b-SharedLibrary"><function>SharedLibrary</function></link> (that is when <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSION"><envar>$SHLIBVERSION</envar></link>
+is set). <literal>_SHLIBVERSIONFLAGS</literal> usually adds <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="cv-SHLIBVERSIONFLAGS"><envar>$SHLIBVERSIONFLAGS</envar></link>
+and some extra dynamically generated options (such as
+<literal>-Wl,-soname=$_SHLIBSONAME</literal>. It is unused by "plain"
+(unversioned) shared libraries.
</para>
</listitem>
</varlistentry>
@@ -6484,6 +6646,18 @@ The suffix used for shared object file names.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="cv-SONAME">
+ <term>SONAME</term>
+ <listitem>
+<para xmlns="http://www.scons.org/dbxsd/v1.0">
+Variable used to hard-code SONAME for versioned shared library/loadable module.
+<example_commands>
+env.SharedLibrary('test', 'test.c', SHLIBVERSION='0.1.2', SONAME='libtest.so.2')
+</example_commands>
+The variable is used, for example, by <link xmlns="http://www.scons.org/dbxsd/v1.0" linkend="t-gnulink"><literal>gnulink</literal></link> linker tool.
+</para>
+</listitem>
+ </varlistentry>
<varlistentry id="cv-SOURCE">
<term>SOURCE</term>
<listitem>
@@ -6753,9 +6927,7 @@ and translated into the
The list of directories that the scripting language wrapper
and interface generate will search for included files.
The SWIG implicit dependency scanner will search these
-directories for include files.
-The default is to use the same path
-specified as <envar xmlns="http://www.scons.org/dbxsd/v1.0">$CPPPATH</envar>.
+directories for include files. The default value is an empty list.
</para>
<para xmlns="http://www.scons.org/dbxsd/v1.0">
@@ -6802,7 +6974,7 @@ include <envar xmlns="http://www.scons.org/dbxsd/v1.0">$_SWIGINCFLAGS</envar>:
</para>
<example_commands xmlns="http://www.scons.org/dbxsd/v1.0">
-env = Environment(SWIGCOM="my_swig -o $TARGET $_SWIGINCFLAGS $SORUCES")
+env = Environment(SWIGCOM="my_swig -o $TARGET $_SWIGINCFLAGS $SOURCES")
</example_commands>
</listitem>
</varlistentry>
diff --git a/doc/generated/variables.mod b/doc/generated/variables.mod
index fc12a92c..f7303f2e 100644
--- a/doc/generated/variables.mod
+++ b/doc/generated/variables.mod
@@ -8,6 +8,8 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
-->
+<!ENTITY cv-__LDMODULEVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$__LDMODULEVERSIONFLAGS</envar>">
+<!ENTITY cv-__SHLIBVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$__SHLIBVERSIONFLAGS</envar>">
<!ENTITY cv-AR "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$AR</envar>">
<!ENTITY cv-ARCHITECTURE "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$ARCHITECTURE</envar>">
<!ENTITY cv-ARCOM "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$ARCOM</envar>">
@@ -216,6 +218,10 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-HOST_ARCH "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$HOST_ARCH</envar>">
<!ENTITY cv-HOST_OS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$HOST_OS</envar>">
<!ENTITY cv-IDLSUFFIXES "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IDLSUFFIXES</envar>">
+<!ENTITY cv-IMPLIBNOVERSIONSYMLINKS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IMPLIBNOVERSIONSYMLINKS</envar>">
+<!ENTITY cv-IMPLIBPREFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IMPLIBPREFIX</envar>">
+<!ENTITY cv-IMPLIBSUFFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IMPLIBSUFFIX</envar>">
+<!ENTITY cv-IMPLIBVERSION "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IMPLIBVERSION</envar>">
<!ENTITY cv-IMPLICIT_COMMAND_DEPENDENCIES "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$IMPLICIT_COMMAND_DEPENDENCIES</envar>">
<!ENTITY cv-INCPREFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$INCPREFIX</envar>">
<!ENTITY cv-INCSUFFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$INCSUFFIX</envar>">
@@ -253,8 +259,13 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-LDMODULECOM "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULECOM</envar>">
<!ENTITY cv-LDMODULECOMSTR "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULECOMSTR</envar>">
<!ENTITY cv-LDMODULEFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULEFLAGS</envar>">
+<!ENTITY cv-LDMODULENOVERSIONSYMLINKS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULENOVERSIONSYMLINKS</envar>">
<!ENTITY cv-LDMODULEPREFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULEPREFIX</envar>">
+<!ENTITY cv-_LDMODULESONAME "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$_LDMODULESONAME</envar>">
<!ENTITY cv-LDMODULESUFFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULESUFFIX</envar>">
+<!ENTITY cv-LDMODULEVERSION "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULEVERSION</envar>">
+<!ENTITY cv-LDMODULEVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LDMODULEVERSIONFLAGS</envar>">
+<!ENTITY cv-_LDMODULEVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$_LDMODULEVERSIONFLAGS</envar>">
<!ENTITY cv-LEX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LEX</envar>">
<!ENTITY cv-LEXCOM "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LEXCOM</envar>">
<!ENTITY cv-LEXCOMSTR "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$LEXCOMSTR</envar>">
@@ -505,15 +516,20 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-SHFORTRANPPCOM "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHFORTRANPPCOM</envar>">
<!ENTITY cv-SHFORTRANPPCOMSTR "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHFORTRANPPCOMSTR</envar>">
<!ENTITY cv-SHLIBEMITTER "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBEMITTER</envar>">
+<!ENTITY cv-SHLIBNOVERSIONSYMLINKS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBNOVERSIONSYMLINKS</envar>">
<!ENTITY cv-SHLIBPREFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBPREFIX</envar>">
+<!ENTITY cv-_SHLIBSONAME "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$_SHLIBSONAME</envar>">
<!ENTITY cv-SHLIBSUFFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBSUFFIX</envar>">
<!ENTITY cv-SHLIBVERSION "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBVERSION</envar>">
+<!ENTITY cv-SHLIBVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLIBVERSIONFLAGS</envar>">
+<!ENTITY cv-_SHLIBVERSIONFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$_SHLIBVERSIONFLAGS</envar>">
<!ENTITY cv-SHLINK "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLINK</envar>">
<!ENTITY cv-SHLINKCOM "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLINKCOM</envar>">
<!ENTITY cv-SHLINKCOMSTR "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLINKCOMSTR</envar>">
<!ENTITY cv-SHLINKFLAGS "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHLINKFLAGS</envar>">
<!ENTITY cv-SHOBJPREFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHOBJPREFIX</envar>">
<!ENTITY cv-SHOBJSUFFIX "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SHOBJSUFFIX</envar>">
+<!ENTITY cv-SONAME "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SONAME</envar>">
<!ENTITY cv-SOURCE "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SOURCE</envar>">
<!ENTITY cv-SOURCE_URL "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SOURCE_URL</envar>">
<!ENTITY cv-SOURCES "<envar xmlns='http://www.scons.org/dbxsd/v1.0'>$SOURCES</envar>">
@@ -646,6 +662,8 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
-->
+<!ENTITY cv-link-__LDMODULEVERSIONFLAGS "<link linkend='cv-__LDMODULEVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$__LDMODULEVERSIONFLAGS</envar></link>">
+<!ENTITY cv-link-__SHLIBVERSIONFLAGS "<link linkend='cv-__SHLIBVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$__SHLIBVERSIONFLAGS</envar></link>">
<!ENTITY cv-link-AR "<link linkend='cv-AR' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$AR</envar></link>">
<!ENTITY cv-link-ARCHITECTURE "<link linkend='cv-ARCHITECTURE' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$ARCHITECTURE</envar></link>">
<!ENTITY cv-link-ARCOM "<link linkend='cv-ARCOM' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$ARCOM</envar></link>">
@@ -854,6 +872,10 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-link-HOST_ARCH "<link linkend='cv-HOST_ARCH' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$HOST_ARCH</envar></link>">
<!ENTITY cv-link-HOST_OS "<link linkend='cv-HOST_OS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$HOST_OS</envar></link>">
<!ENTITY cv-link-IDLSUFFIXES "<link linkend='cv-IDLSUFFIXES' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IDLSUFFIXES</envar></link>">
+<!ENTITY cv-link-IMPLIBNOVERSIONSYMLINKS "<link linkend='cv-IMPLIBNOVERSIONSYMLINKS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IMPLIBNOVERSIONSYMLINKS</envar></link>">
+<!ENTITY cv-link-IMPLIBPREFIX "<link linkend='cv-IMPLIBPREFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IMPLIBPREFIX</envar></link>">
+<!ENTITY cv-link-IMPLIBSUFFIX "<link linkend='cv-IMPLIBSUFFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IMPLIBSUFFIX</envar></link>">
+<!ENTITY cv-link-IMPLIBVERSION "<link linkend='cv-IMPLIBVERSION' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IMPLIBVERSION</envar></link>">
<!ENTITY cv-link-IMPLICIT_COMMAND_DEPENDENCIES "<link linkend='cv-IMPLICIT_COMMAND_DEPENDENCIES' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$IMPLICIT_COMMAND_DEPENDENCIES</envar></link>">
<!ENTITY cv-link-INCPREFIX "<link linkend='cv-INCPREFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$INCPREFIX</envar></link>">
<!ENTITY cv-link-INCSUFFIX "<link linkend='cv-INCSUFFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$INCSUFFIX</envar></link>">
@@ -891,8 +913,13 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-link-LDMODULECOM "<link linkend='cv-LDMODULECOM' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULECOM</envar></link>">
<!ENTITY cv-link-LDMODULECOMSTR "<link linkend='cv-LDMODULECOMSTR' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULECOMSTR</envar></link>">
<!ENTITY cv-link-LDMODULEFLAGS "<link linkend='cv-LDMODULEFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULEFLAGS</envar></link>">
+<!ENTITY cv-link-LDMODULENOVERSIONSYMLINKS "<link linkend='cv-LDMODULENOVERSIONSYMLINKS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULENOVERSIONSYMLINKS</envar></link>">
<!ENTITY cv-link-LDMODULEPREFIX "<link linkend='cv-LDMODULEPREFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULEPREFIX</envar></link>">
+<!ENTITY cv-link-_LDMODULESONAME "<link linkend='cv-_LDMODULESONAME' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$_LDMODULESONAME</envar></link>">
<!ENTITY cv-link-LDMODULESUFFIX "<link linkend='cv-LDMODULESUFFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULESUFFIX</envar></link>">
+<!ENTITY cv-link-LDMODULEVERSION "<link linkend='cv-LDMODULEVERSION' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULEVERSION</envar></link>">
+<!ENTITY cv-link-LDMODULEVERSIONFLAGS "<link linkend='cv-LDMODULEVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LDMODULEVERSIONFLAGS</envar></link>">
+<!ENTITY cv-link-_LDMODULEVERSIONFLAGS "<link linkend='cv-_LDMODULEVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$_LDMODULEVERSIONFLAGS</envar></link>">
<!ENTITY cv-link-LEX "<link linkend='cv-LEX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LEX</envar></link>">
<!ENTITY cv-link-LEXCOM "<link linkend='cv-LEXCOM' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LEXCOM</envar></link>">
<!ENTITY cv-link-LEXCOMSTR "<link linkend='cv-LEXCOMSTR' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$LEXCOMSTR</envar></link>">
@@ -1143,15 +1170,20 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT.
<!ENTITY cv-link-SHFORTRANPPCOM "<link linkend='cv-SHFORTRANPPCOM' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHFORTRANPPCOM</envar></link>">
<!ENTITY cv-link-SHFORTRANPPCOMSTR "<link linkend='cv-SHFORTRANPPCOMSTR' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHFORTRANPPCOMSTR</envar></link>">
<!ENTITY cv-link-SHLIBEMITTER "<link linkend='cv-SHLIBEMITTER' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBEMITTER</envar></link>">
+<!ENTITY cv-link-SHLIBNOVERSIONSYMLINKS "<link linkend='cv-SHLIBNOVERSIONSYMLINKS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBNOVERSIONSYMLINKS</envar></link>">
<!ENTITY cv-link-SHLIBPREFIX "<link linkend='cv-SHLIBPREFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBPREFIX</envar></link>">
+<!ENTITY cv-link-_SHLIBSONAME "<link linkend='cv-_SHLIBSONAME' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$_SHLIBSONAME</envar></link>">
<!ENTITY cv-link-SHLIBSUFFIX "<link linkend='cv-SHLIBSUFFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBSUFFIX</envar></link>">
<!ENTITY cv-link-SHLIBVERSION "<link linkend='cv-SHLIBVERSION' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBVERSION</envar></link>">
+<!ENTITY cv-link-SHLIBVERSIONFLAGS "<link linkend='cv-SHLIBVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLIBVERSIONFLAGS</envar></link>">
+<!ENTITY cv-link-_SHLIBVERSIONFLAGS "<link linkend='cv-_SHLIBVERSIONFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$_SHLIBVERSIONFLAGS</envar></link>">
<!ENTITY cv-link-SHLINK "<link linkend='cv-SHLINK' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLINK</envar></link>">
<!ENTITY cv-link-SHLINKCOM "<link linkend='cv-SHLINKCOM' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLINKCOM</envar></link>">
<!ENTITY cv-link-SHLINKCOMSTR "<link linkend='cv-SHLINKCOMSTR' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLINKCOMSTR</envar></link>">
<!ENTITY cv-link-SHLINKFLAGS "<link linkend='cv-SHLINKFLAGS' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHLINKFLAGS</envar></link>">
<!ENTITY cv-link-SHOBJPREFIX "<link linkend='cv-SHOBJPREFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHOBJPREFIX</envar></link>">
<!ENTITY cv-link-SHOBJSUFFIX "<link linkend='cv-SHOBJSUFFIX' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SHOBJSUFFIX</envar></link>">
+<!ENTITY cv-link-SONAME "<link linkend='cv-SONAME' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SONAME</envar></link>">
<!ENTITY cv-link-SOURCE "<link linkend='cv-SOURCE' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SOURCE</envar></link>">
<!ENTITY cv-link-SOURCE_URL "<link linkend='cv-SOURCE_URL' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SOURCE_URL</envar></link>">
<!ENTITY cv-link-SOURCES "<link linkend='cv-SOURCES' xmlns='http://www.scons.org/dbxsd/v1.0'><envar>$SOURCES</envar></link>">
diff --git a/doc/man/scons.xml b/doc/man/scons.xml
index c3abb64d..5c832c2a 100644
--- a/doc/man/scons.xml
+++ b/doc/man/scons.xml
@@ -7040,7 +7040,7 @@ env.Program('MyApp', ['Foo.cpp', 'Bar.cpp'])
<para>For more information see the document for the PCH builder, and the PCH and
PCHSTOP construction variables. To learn about the details of precompiled
-headers consult the MSDN documention for /Yc, /Yu, and /Yp.</para>
+headers consult the MSDN documentation for /Yc, /Yu, and /Yp.</para>
</refsect2>
diff --git a/doc/man/titlepage/SConsBuildBricks_path.svg b/doc/man/titlepage/SConsBuildBricks_path.svg
index ed0c60d7..0d7f63e0 100644
--- a/doc/man/titlepage/SConsBuildBricks_path.svg
+++ b/doc/man/titlepage/SConsBuildBricks_path.svg
@@ -14,9 +14,9 @@
height="80.330002"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.48.1 r9760"
+ inkscape:version="0.48.4 r9939"
version="1.0"
- sodipodi:docname="SConsBuildBricks.svg"
+ sodipodi:docname="SConsBuildBricks_path.svg"
inkscape:export-filename="Constructs-using-SCons.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
@@ -77,24 +77,22 @@
</cc:Agent>
</dc:contributor>
<cc:license
- rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.0/" />
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
- rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
+ rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:prohibits
- rdf:resource="http://web.resource.org/cc/CommercialUse" />
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
diff --git a/doc/reference/titlepage/SConsBuildBricks_path.svg b/doc/reference/titlepage/SConsBuildBricks_path.svg
index ed0c60d7..0d7f63e0 100644
--- a/doc/reference/titlepage/SConsBuildBricks_path.svg
+++ b/doc/reference/titlepage/SConsBuildBricks_path.svg
@@ -14,9 +14,9 @@
height="80.330002"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.48.1 r9760"
+ inkscape:version="0.48.4 r9939"
version="1.0"
- sodipodi:docname="SConsBuildBricks.svg"
+ sodipodi:docname="SConsBuildBricks_path.svg"
inkscape:export-filename="Constructs-using-SCons.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
@@ -77,24 +77,22 @@
</cc:Agent>
</dc:contributor>
<cc:license
- rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.0/" />
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
- rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
+ rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:prohibits
- rdf:resource="http://web.resource.org/cc/CommercialUse" />
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
diff --git a/doc/user/build-install.xml b/doc/user/build-install.xml
index d107b4a7..3e661720 100644
--- a/doc/user/build-install.xml
+++ b/doc/user/build-install.xml
@@ -231,7 +231,7 @@ Python 2.5.1
<para>
Or, you can use a graphical RPM package manager.
- See your package manager application's documention
+ See your package manager application's documentation
for specific instructions about
how to use it to install a downloaded RPM.
diff --git a/doc/user/output.xml b/doc/user/output.xml
index cdb28d75..78dcca49 100644
--- a/doc/user/output.xml
+++ b/doc/user/output.xml
@@ -83,6 +83,21 @@ Type: 'scons program' to build the production program,
<para>
+ Optionally, one can specify the append flag:
+
+ </para>
+
+ <scons_example name="output_ex1_a">
+ <file name="SConstruct" printme="1">
+Help("""
+Type: 'scons program' to build the production program,
+ 'scons debug' to build the debug version.
+""", append=True)
+ </file>
+ </scons_example>
+
+ <para>
+
(Note the above use of the Python triple-quote syntax,
which comes in very handy for
specifying multi-line strings like help text.)
@@ -120,6 +135,13 @@ Type: 'scons program' to build the production program,
<para>
+ When used with &AddOption; Help("text", append=False) will clobber any help output associated with AddOption().
+ To preserve the help output from AddOption(), set append=True.
+
+ </para>
+
+ <para>
+
Another use would be to make the help text conditional
on some variable.
For example, suppose you only want to display
diff --git a/doc/user/titlepage/SConsBuildBricks_path.svg b/doc/user/titlepage/SConsBuildBricks_path.svg
index ed0c60d7..0d7f63e0 100644
--- a/doc/user/titlepage/SConsBuildBricks_path.svg
+++ b/doc/user/titlepage/SConsBuildBricks_path.svg
@@ -14,9 +14,9 @@
height="80.330002"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.48.1 r9760"
+ inkscape:version="0.48.4 r9939"
version="1.0"
- sodipodi:docname="SConsBuildBricks.svg"
+ sodipodi:docname="SConsBuildBricks_path.svg"
inkscape:export-filename="Constructs-using-SCons.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
@@ -77,24 +77,22 @@
</cc:Agent>
</dc:contributor>
<cc:license
- rdf:resource="http://creativecommons.org/licenses/by-nc-sa/2.0/" />
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
- rdf:about="http://creativecommons.org/licenses/by-nc-sa/2.5/">
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
+ rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:prohibits
- rdf:resource="http://web.resource.org/cc/CommercialUse" />
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
diff --git a/src/Announce.txt b/src/Announce.txt
index f96e703c..7a13b81f 100644
--- a/src/Announce.txt
+++ b/src/Announce.txt
@@ -18,9 +18,8 @@ So that everyone using SCons can help each other learn how to use it more
effectively, please go to http://scons.org/lists.php#users to sign up for
the scons-users mailing list.
-==============IMPORTANT NOTICE FOR NEXT VERSION V2.4.0===========
+==============IMPORTANT NOTICE===========
-PLEASE READ. CHANGES COMING IN NEXT MAJOR RELEASE V2.4.0
As has been pre-announced in SCons's mailing lists:
* https://pairlist4.pair.net/pipermail/scons-users/2014-July/002734.html ,
@@ -44,6 +43,9 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER
since last release. This announcement highlights only the important
changes.
+ Please note the following important changes since release 2.3.6:
+ - Switch several core classes to use "slots" to reduce memory
+ usage. (PR #2180, #2178, #2198)
Please note the following important changes since release 2.3.5:
- Support for Visual Studio 2015
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 3869621f..47a3f975 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -7,16 +7,64 @@
RELEASE VERSION/DATE TO BE FILLED IN LATER
From Dirk Baechle:
- - Switched several core classes to using "slots", for
- reducing the overall memory consumption in large
- projects (fixes #2180, #2178, #2198)
- - Memoizer counting uses decorators now, instead of
- the old metaclasses approach.
+ - Fixed license of SVG titlepage files in the context of Debian
+ packaging, such that they allow for commercial use too (#2985).
+
+ From William Blevins:
+ - InstallVersionedLib now available in the DefaultEnvironment context.
+ - Improves orthogonality of use cases between different Install functions.
From Carnë Draug:
- Added new configure check, CheckProg, to check for
existence of a program.
+ From Florian Miedniak:
+ - Fixed tigris issue #3011: Glob() excludes didn't work when used with VariantDir(duplicate=0)
+
+ From William Roberts:
+ - Fix bug 2831 and allow Help() text to be appended to AddOption() help.
+
+ From Paweł Tomulik:
+ - Reimplemented versioning for shared libraries, with the following effects
+ - Fixed tigris issues #3001, #3006.
+ - Fixed several other issues not reported to tigris, including:
+ issues with versioned libraries in subdirectories with tricky names,
+ issues with versioned libraries and variant directories,
+ issue with soname not being injected to library when using D linkers,
+ - Switched to direct symlinks instead of daisy-chained ones -- soname and
+ development symlinks point directly to the versioned shared library now),
+ for rationale see:
+ https://www.debian.org/doc/debian-policy/ch-sharedlibs.html
+ https://fedoraproject.org/wiki/Packaging:Guidelines#Devel_Packages
+ https://bitbucket.org/scons/scons/pull-requests/247/new-versioned-libraries-gnulink-cyglink/diff#comment-10063929
+ - New construction variables to allow override default behavior: SONAME,
+ SHLIBVERSIONFLAGS, _SHLIBVERSIONFLAGS, SHLIBNOVERSIONSYMLINKS,
+ LDMODULEVERSION, LDMODULEVERSIONFLAGS, _LDMODULEVERSIONFLAGS,
+ LDMODULENOVERSIONSYMLINKS.
+ - Changed logic used to configure the versioning machinery from
+ platform-centric to linker-oriented.
+ - The SHLIBVERSION/LDMODULEVERSION variables are no longer validated by
+ SCons (more freedom to users).
+ - InstallVersionedLib() doesn't use SHLIBVERSION anymore.
+ - Enchanced docs for the library versioning stuff.
+ - New tests for versioned libraries.
+ - Library versioning is currently implemented for the following linker
+ tools: 'cyglink', 'gnulink', 'sunlink'.
+
+
+
+RELEASE 2.4.0 - Mon, 21 Sep 2015 08:56:00 -0700
+
+ From Dirk Baechle:
+ - Switched several core classes to use "slots", to
+ reduce the overall memory consumption in large
+ projects (fixes #2180, #2178, #2198)
+ - Memoizer counting uses decorators now, instead of
+ the old metaclasses approach.
+
+ From Andrew Featherstone
+ - Fixed typo in SWIGPATH description
+
RELEASE 2.3.6 - Mon, 31 Jul 2015 14:35:03 -0700
From Rob Smith:
diff --git a/src/README.txt b/src/README.txt
index 5d880c20..d80460ae 100644
--- a/src/README.txt
+++ b/src/README.txt
@@ -28,7 +28,8 @@ the latest version by checking the SCons download page at:
EXECUTION REQUIREMENTS
======================
-Running SCons requires Python version 2.4 or later. There should be
+Running SCons requires Python version 2.7.*. Currently it does not
+run on the Python 3.x release. There should be
no other dependencies or requirements to run SCons. (There is, however,
an additional requirement to *install* SCons from this particular
package; see the next section.)
@@ -224,20 +225,26 @@ Check the SCons web site at:
AUTHOR INFO
===========
-
-Steven Knight
-knight at baldmt dot com
-http://www.baldmt.com/~knight/
-
-With plenty of help from the SCons Development team:
- Chad Austin
- Charles Crain
- Steve Leblanc
- Greg Noel
- Gary Oberbrunner
- Anthony Roach
- Greg Spencer
- Christoph Wiedemann
-
-__COPYRIGHT__
-__FILE__ __REVISION__ __DATE__ __DEVELOPER__
+SCons was originally written by Steven Knight, knight at baldmt dot com.
+Since around 2010 it has been maintained by the SCons
+development team, co-managed by Bill Deegan and Gary Oberbrunner, with
+many contributors, including but not at all limited to:
+
+- Chad Austin
+- Dirk Baechle
+- Charles Crain
+- William Deegan
+- Steve Leblanc
+- Rob Managan
+- Greg Noel
+- Gary Oberbrunner
+- Anthony Roach
+- Greg Spencer
+- Tom Tanner
+- Anatoly Techtonik
+- Christoph Wiedemann
+- Russel Winder
+
+\... and many others.
+
+Copyright (c) 2001 - 2015 The SCons Foundation
diff --git a/src/RELEASE.txt b/src/RELEASE.txt
index 83212a70..1bf2eb1d 100644
--- a/src/RELEASE.txt
+++ b/src/RELEASE.txt
@@ -1,4 +1,4 @@
- A new SCons checkpoint release, 2.3.8.alpha.yyyymmdd, is now available
+ A new SCons checkpoint release, 2.3.13.alpha.yyyymmdd, is now available
on the SCons download page:
http://www.scons.org/download.php
diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py
index 65004438..744da5f6 100644
--- a/src/engine/SCons/Defaults.py
+++ b/src/engine/SCons/Defaults.py
@@ -482,6 +482,15 @@ class Variable_Method_Caller(object):
frame = frame.f_back
return None
+# if env[version_var] id defined, returns env[flags_var], otherwise returns None
+def __libversionflags(env, version_var, flags_var):
+ try:
+ if env[version_var]:
+ return env[flags_var]
+ except KeyError:
+ pass
+ return None
+
ConstructionEnvironment = {
'BUILDERS' : {},
'SCANNERS' : [],
@@ -499,6 +508,12 @@ ConstructionEnvironment = {
'_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
'_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
'_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
+
+ '__libversionflags' : __libversionflags,
+ '__SHLIBVERSIONFLAGS' : '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}',
+ '__LDMODULEVERSIONFLAGS' : '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}',
+ '__DSHLIBVERSIONFLAGS' : '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}',
+
'TEMPFILE' : NullCmdGenerator,
'Dir' : Variable_Method_Caller('TARGET', 'Dir'),
'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'),
diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py
index 8db743be..7e2f8963 100644
--- a/src/engine/SCons/Environment.py
+++ b/src/engine/SCons/Environment.py
@@ -612,7 +612,7 @@ class SubstitutionEnvironment(object):
def Override(self, overrides):
"""
- Produce a modified environment whose variables are overriden by
+ Produce a modified environment whose variables are overridden by
the overrides dictionaries. "overrides" is a dictionary that
will override the variables of this environment.
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index a3db8fec..4e78852a 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -2182,7 +2182,12 @@ class Dir(Base):
r = [os.path.join(str(dir), x) for x in r]
result.extend(r)
if exclude:
- result = filter(lambda x: not any(fnmatch.fnmatch(str(x), e) for e in SCons.Util.flatten(exclude)), result)
+ excludes = []
+ excludeList = SCons.Util.flatten(exclude)
+ for x in excludeList:
+ r = self.glob(x, ondisk, source, strings)
+ excludes.extend(r)
+ result = filter(lambda x: not any(fnmatch.fnmatch(str(x), str(e)) for e in SCons.Util.flatten(excludes)), result)
return sorted(result, key=lambda a: str(a))
def _glob1(self, pattern, ondisk=True, source=False, strings=False):
diff --git a/src/engine/SCons/Platform/cygwin.py b/src/engine/SCons/Platform/cygwin.py
index a0126826..34c79ff9 100644
--- a/src/engine/SCons/Platform/cygwin.py
+++ b/src/engine/SCons/Platform/cygwin.py
@@ -42,8 +42,8 @@ def generate(env):
env['PROGSUFFIX'] = '.exe'
env['SHLIBPREFIX'] = ''
env['SHLIBSUFFIX'] = '.dll'
- env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+ env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX', '$IMPLIBPREFIX' ]
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX', '$IMPLIBSUFFIX' ]
env['TEMPFILE'] = TempFileMunge
env['TEMPFILEPREFIX'] = '@'
env['MAXLINELENGTH'] = 2048
diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py
index 323fba90..bd227bd5 100644
--- a/src/engine/SCons/Script/Main.py
+++ b/src/engine/SCons/Script/Main.py
@@ -484,6 +484,9 @@ def GetOption(name):
def SetOption(name, value):
return OptionsParser.values.set_option(name, value)
+def PrintHelp(file=None):
+ OptionsParser.print_help(file=file)
+
#
class Stats(object):
def __init__(self):
diff --git a/src/engine/SCons/Script/SConsOptions.py b/src/engine/SCons/Script/SConsOptions.py
index 8ecc093e..68c60ccd 100644
--- a/src/engine/SCons/Script/SConsOptions.py
+++ b/src/engine/SCons/Script/SConsOptions.py
@@ -268,7 +268,7 @@ class SConsOptionParser(optparse.OptionParser):
preserve_unknown_options = False
def error(self, msg):
- # overriden OptionValueError exception handler
+ # overridden OptionValueError exception handler
self.print_usage(sys.stderr)
sys.stderr.write("SCons Error: %s\n" % msg)
sys.exit(2)
diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py
index 0a5720d9..b832ff78 100644
--- a/src/engine/SCons/Script/SConscript.py
+++ b/src/engine/SCons/Script/SConscript.py
@@ -499,9 +499,9 @@ class SConsEnvironment(SCons.Environment.Base):
name = self.subst(name)
return SCons.Script.Main.GetOption(name)
- def Help(self, text):
+ def Help(self, text, append=False):
text = self.subst(text, raw=1)
- SCons.Script.HelpFunction(text)
+ SCons.Script.HelpFunction(text, append=append)
def Import(self, *vars):
try:
diff --git a/src/engine/SCons/Script/SConscript.xml b/src/engine/SCons/Script/SConscript.xml
index c74ad5ec..8553fbe6 100644
--- a/src/engine/SCons/Script/SConscript.xml
+++ b/src/engine/SCons/Script/SConscript.xml
@@ -240,7 +240,7 @@ file is found.
<scons_function name="Help">
<arguments>
-(text)
+(text, append=False)
</arguments>
<summary>
<para>
@@ -248,12 +248,18 @@ This specifies help text to be printed if the
<option>-h</option>
argument is given to
&scons;.
-If
+If
&f-Help;
-is called multiple times, the text is appended together in the order
-that
+is called multiple times, the text is appended together in the order that
&f-Help;
-is called.
+is called. With append set to False, any
+&f-Help;
+text generated with
+&f-AddOption;
+is clobbered. If append is True, the AddOption help is prepended to the help
+string, thus preserving the
+<option>-h</option>
+message.
</para>
</summary>
</scons_function>
diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py
index bb7b632a..6bfc36f1 100644
--- a/src/engine/SCons/Script/__init__.py
+++ b/src/engine/SCons/Script/__init__.py
@@ -41,6 +41,7 @@ start_time = time.time()
import collections
import os
+import StringIO
import sys
# Special chicken-and-egg handling of the "--debug=memoizer" flag:
@@ -107,6 +108,7 @@ QuestionTask = Main.QuestionTask
#SConscriptSettableOptions = Main.SConscriptSettableOptions
AddOption = Main.AddOption
+PrintHelp = Main.PrintHelp
GetOption = Main.GetOption
SetOption = Main.SetOption
Progress = Main.Progress
@@ -258,12 +260,25 @@ def _Set_Default_Targets(env, tlist):
#
help_text = None
-def HelpFunction(text):
+def HelpFunction(text, append=False):
global help_text
- if SCons.Script.help_text is None:
- SCons.Script.help_text = text
- else:
- help_text = help_text + text
+ if help_text is None:
+ if append:
+ s = StringIO.StringIO()
+ PrintHelp(s)
+ help_text = s.getvalue()
+ s.close()
+ else:
+ help_text = ""
+#
+# Was in original patch but this text is arbitrary and breaks tests
+# so I removed it (Deegan)
+# help_text = help_text + "\nLocal Build Variables:\n" + text
+# else:
+# help_text = help_text + text
+
+ help_text= help_text + text
+
#
# Will be non-zero if we are reading an SConscript file.
@@ -318,6 +333,7 @@ GlobalDefaultEnvironmentFunctions = [
'Ignore',
'Install',
'InstallAs',
+ 'InstallVersionedLib',
'Literal',
'Local',
'ParseDepends',
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py
index efd2e339..73746871 100644
--- a/src/engine/SCons/Tool/__init__.py
+++ b/src/engine/SCons/Tool/__init__.py
@@ -236,150 +236,436 @@ def createStaticLibBuilder(env):
return static_lib
-def VersionShLibLinkNames(version, libname, env):
- """Generate names of symlinks to the versioned shared library"""
+def _call_linker_cb(env, callback, args, result = None):
+ """Returns the result of env['LINKCALLBACKS'][callback](*args)
+ if env['LINKCALLBACKS'] is a dictionary and env['LINKCALLBACKS'][callback]
+ is callable. If these conditions are not met, return the value provided as
+ the *result* argument. This function is mainly used for generating library
+ info such as versioned suffixes, symlink maps, sonames etc. by delegating
+ the core job to callbacks configured by current linker tool"""
+
Verbose = False
- platform = env.subst('$PLATFORM')
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
-
- linknames = []
- if version.count(".") != 2:
- # We need a version string of the form x.y.z to proceed
- # Several changes need to be made to support versions like x.y
- raise ValueError
-
- if platform == 'darwin':
- # For libfoo.x.y.z.dylib, linknames libfoo.so
- suffix_re = re.escape('.' + version + shlib_suffix)
- linkname = re.sub(suffix_re, shlib_suffix, libname)
+
+ if Verbose:
+ print '_call_linker_cb: args=%r' % args
+ print '_call_linker_cb: callback=%r' % callback
+
+ try:
+ cbfun = env['LINKCALLBACKS'][callback]
+ except (KeyError, TypeError):
if Verbose:
- print "VersionShLibLinkNames: linkname = ",linkname
- linknames.append(linkname)
- elif platform == 'posix' or platform == 'sunos':
- if sys.platform.startswith('openbsd'):
- # OpenBSD uses x.y shared library versioning numbering convention
- # and doesn't use symlinks to backwards-compatible libraries
- return []
- # For libfoo.so.x.y.z, linknames libfoo.so libfoo.so.x.y libfoo.so.x
- suffix_re = re.escape(shlib_suffix + '.' + version)
- # First linkname has no version number
- linkname = re.sub(suffix_re, shlib_suffix, libname)
+ print '_call_linker_cb: env["LINKCALLBACKS"][%r] not found or can not be used' % callback
+ pass
+ else:
if Verbose:
- print "VersionShLibLinkNames: linkname = ",linkname
- linknames.append(linkname)
- versionparts = version.split('.')
- major_name = linkname + "." + versionparts[0]
- minor_name = major_name + "." + versionparts[1]
- #Only add link for major_name
- #for linkname in [major_name, minor_name]:
- for linkname in [major_name, ]:
+ print '_call_linker_cb: env["LINKCALLBACKS"][%r] found' % callback
+ print '_call_linker_cb: env["LINKCALLBACKS"][%r]=%r' % (callback, cbfun)
+ if(callable(cbfun)):
if Verbose:
- print "VersionShLibLinkNames: linkname ",linkname, ", target ",libname
- linknames.append(linkname)
- # note: no Windows case here (win32 or cygwin);
- # MSVC doesn't support this type of versioned shared libs.
- # (could probably do something for MinGW though)
- return linknames
-
-def VersionedSharedLibrary(target = None, source= None, env=None):
- """Build a shared library. If the environment has SHLIBVERSION
-defined make a versioned shared library and create the appropriate
-symlinks for the platform we are on"""
- Verbose = False
- try:
- version = env.subst('$SHLIBVERSION')
- except KeyError:
- version = None
+ print '_call_linker_cb: env["LINKCALLBACKS"][%r] is callable' % callback
+ result = cbfun(env, *args)
+ return result
- # libname includes the version number if one was given
- libname = getattr(target[0].attributes, 'shlibname', target[0].name)
- platform = env.subst('$PLATFORM')
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
- if Verbose:
- print "VersionShLib: libname = ",libname
- print "VersionShLib: platform = ",platform
- print "VersionShLib: shlib_suffix = ",shlib_suffix
- print "VersionShLib: target = ",str(target[0])
-
- if version:
- # set the shared library link flags
- if platform == 'posix':
- shlink_flags += [ '-Wl,-Bsymbolic' ]
- # OpenBSD doesn't usually use SONAME for libraries
- if not sys.platform.startswith('openbsd'):
- # continue setup of shlink flags for all other POSIX systems
- suffix_re = re.escape(shlib_suffix + '.' + version)
- (major, age, revision) = version.split(".")
- # soname will have only the major version number in it
- soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
- shlink_flags += [ '-Wl,-soname=%s' % soname ]
- if Verbose:
- print " soname ",soname,", shlink_flags ",shlink_flags
- elif platform == 'sunos':
- suffix_re = re.escape(shlib_suffix + '.' + version)
- (major, age, revision) = version.split(".")
- soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
- shlink_flags += [ '-h', soname ]
- elif platform == 'cygwin':
- shlink_flags += [ '-Wl,-Bsymbolic',
- '-Wl,--out-implib,${TARGET.base}.a' ]
- elif platform == 'darwin':
- shlink_flags += [ '-current_version', '%s' % version,
- '-compatibility_version', '%s' % version,
- '-undefined', 'dynamic_lookup' ]
+def _call_env_subst(env, string, *args, **kw):
+ kw2 = {}
+ for k in ('raw', 'target', 'source', 'conv', 'executor'):
+ try: kw2[k] = kw[k]
+ except KeyError: pass
+ return env.subst(string, *args, **kw2)
+
+class _ShLibInfoSupport(object):
+ def get_libtype(self):
+ return 'ShLib'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBSUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBVERSION', *args, **kw)
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBNOVERSIONSYMLINKS', *args, **kw)
+
+class _LdModInfoSupport(object):
+ def get_libtype(self):
+ return 'LdMod'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULEPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULESUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULEVERSION', *args, **kw)
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULENOVERSIONSYMLINKS', *args, **kw)
+
+class _ImpLibInfoSupport(object):
+ def get_libtype(self):
+ return 'ImpLib'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$IMPLIBPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$IMPLIBSUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ version = _call_env_subst(env,'$IMPLIBVERSION', *args, **kw)
+ if not version:
+ try: lt = kw['implib_libtype']
+ except KeyError: pass
+ else:
+ if lt == 'ShLib':
+ version = _call_env_subst(env,'$SHLIBVERSION', *args, **kw)
+ elif lt == 'LdMod':
+ version = _call_env_subst(env,'$LDMODULEVERSION', *args, **kw)
+ return version
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ disable = None
+ try: env['IMPLIBNOVERSIONSYMLINKS']
+ except KeyError:
+ try: lt = kw['implib_libtype']
+ except KeyError: pass
+ else:
+ if lt == 'ShLib':
+ disable = _call_env_subst(env,'$SHLIBNOVERSIONSYMLINKS', *args, **kw)
+ elif lt == 'LdMod':
+ disable = _call_env_subst(env,'$LDMODULENOVERSIONSYMLINKS', *args, **kw)
+ else:
+ disable = _call_env_subst(env,'$IMPLIBNOVERSIONSYMLINKS', *args, **kw)
+ return disable
+
+class _LibInfoGeneratorBase(object):
+ """Generator base class for library-related info such as suffixes for
+ versioned libraries, symlink maps, sonames etc. It handles commonities
+ of SharedLibrary and LoadableModule
+ """
+ _support_classes = { 'ShLib' : _ShLibInfoSupport,
+ 'LdMod' : _LdModInfoSupport,
+ 'ImpLib' : _ImpLibInfoSupport }
+ def __init__(self, libtype, infoname):
+ self.set_libtype(libtype)
+ self.set_infoname(infoname)
+
+ def set_libtype(self, libtype):
+ try:
+ support_class = self._support_classes[libtype]
+ except KeyError:
+ raise ValueError('unsupported libtype %r' % libtype)
+ self._support = support_class()
+
+ def get_libtype(self):
+ return self._support.get_libtype()
+
+ def set_infoname(self, infoname):
+ self.infoname = infoname
+
+ def get_infoname(self):
+ return self.infoname
+
+ def get_lib_prefix(self, env, *args, **kw):
+ return self._support.get_lib_prefix(env,*args,**kw)
+
+ def get_lib_suffix(self, env, *args, **kw):
+ return self._support.get_lib_suffix(env,*args,**kw)
+
+ def get_lib_version(self, env, *args, **kw):
+ return self._support.get_lib_version(env,*args,**kw)
+
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return self._support.get_lib_noversionsymlinks(env,*args,**kw)
+
+ # Returns name of generator linker callback that shall be used to generate
+ # our info for a versioned library. For example, if our libtype is 'ShLib'
+ # and infoname is 'Prefix', it would return 'VersionedShLibPrefix'.
+ def get_versioned_lib_info_generator(self, **kw):
+ try: libtype = kw['generator_libtype']
+ except KeyError: libtype = self.get_libtype()
+ infoname = self.get_infoname()
+ return 'Versioned%s%s' % (libtype, infoname)
+
+ def generate_versioned_lib_info(self, env, args, result = None, **kw):
+ callback = self.get_versioned_lib_info_generator(**kw)
+ return _call_linker_cb(env, callback, args, result)
+
+class _LibPrefixGenerator(_LibInfoGeneratorBase):
+ """Library prefix generator, used as target_prefix in SharedLibrary and
+ LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibPrefixGenerator, self).__init__(libtype, 'Prefix')
+
+ def __call__(self, env, sources = None, **kw):
+ Verbose = False
+
+ if sources and 'source' not in kw:
+ kw2 = kw.copy()
+ kw2['source'] = sources
+ else:
+ kw2 = kw
+
+ prefix = self.get_lib_prefix(env,**kw2)
if Verbose:
- print "VersionShLib: shlink_flags = ",shlink_flags
- envlink = env.Clone()
- envlink['SHLINKFLAGS'] = shlink_flags
- else:
- envlink = env
+ print "_LibPrefixGenerator: input prefix=%r" % prefix
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print "_LibPrefixGenerator: version=%r" % version
- result = SCons.Defaults.ShLinkAction(target, source, envlink)
+ if version:
+ prefix = self.generate_versioned_lib_info(env, [prefix, version], prefix, **kw2)
- if version:
- # here we need the full pathname so the links end up in the right directory
- libname = getattr(target[0].attributes, 'shlibpath', target[0].get_internal_path())
if Verbose:
- print "VerShLib: target lib is = ", libname
- print "VerShLib: name is = ", target[0].name
- print "VerShLib: dir is = ", target[0].dir.path
- linknames = VersionShLibLinkNames(version, libname, env)
+ print "_LibPrefixGenerator: return prefix=%r" % prefix
+ return prefix
+
+ShLibPrefixGenerator = _LibPrefixGenerator('ShLib')
+LdModPrefixGenerator = _LibPrefixGenerator('LdMod')
+ImpLibPrefixGenerator = _LibPrefixGenerator('ImpLib')
+
+class _LibSuffixGenerator(_LibInfoGeneratorBase):
+ """Library suffix generator, used as target_suffix in SharedLibrary and
+ LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibSuffixGenerator, self).__init__(libtype, 'Suffix')
+
+ def __call__(self, env, sources = None, **kw):
+ Verbose = False
+
+ if sources and 'source' not in kw:
+ kw2 = kw.copy()
+ kw2['source'] = sources
+ else:
+ kw2 = kw
+
+ suffix = self.get_lib_suffix(env, **kw2)
if Verbose:
- print "VerShLib: linknames ",linknames
- # Here we just need the file name w/o path as the target of the link
- lib_ver = getattr(target[0].attributes, 'shlibname', target[0].name)
- # make symlink of adjacent names in linknames
- for count in range(len(linknames)):
- linkname = linknames[count]
- if count > 0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(os.path.basename(linkname),lastlinkname)
- if Verbose:
- print "VerShLib: made sym link of %s -> %s" % (lastlinkname,linkname)
- lastlinkname = linkname
- # finish chain of sym links with link to the actual library
- if len(linknames)>0:
+ print "_LibSuffixGenerator: input suffix=%r" % suffix
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print "_LibSuffixGenerator: version=%r" % version
+
+ if version:
+ suffix = self.generate_versioned_lib_info(env, [suffix, version], suffix, **kw2)
+
+ if Verbose:
+ print "_LibSuffixGenerator: return suffix=%r" % suffix
+ return suffix
+
+ShLibSuffixGenerator = _LibSuffixGenerator('ShLib')
+LdModSuffixGenerator = _LibSuffixGenerator('LdMod')
+ImpLibSuffixGenerator = _LibSuffixGenerator('ImpLib')
+
+class _LibSymlinkGenerator(_LibInfoGeneratorBase):
+ """Library symlink map generator. It generates a list of symlinks that
+ should be created by SharedLibrary or LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibSymlinkGenerator, self).__init__(libtype, 'Symlinks')
+
+ def __call__(self, env, libnode, **kw):
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print "_LibSymLinkGenerator: libnode=%r" % libnode.get_path()
+
+ symlinks = None
+
+ version = self.get_lib_version(env, **kw2)
+ disable = self.get_lib_noversionsymlinks(env, **kw2)
+ if Verbose:
+ print '_LibSymlinkGenerator: version=%r' % version
+ print '_LibSymlinkGenerator: disable=%r' % disable
+
+ if version and not disable:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ symlinks = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if Verbose:
+ print '_LibSymlinkGenerator: return symlinks=%r' % StringizeLibSymlinks(symlinks)
+ return symlinks
+
+ShLibSymlinkGenerator = _LibSymlinkGenerator('ShLib')
+LdModSymlinkGenerator = _LibSymlinkGenerator('LdMod')
+ImpLibSymlinkGenerator = _LibSymlinkGenerator('ImpLib')
+
+class _LibNameGenerator(_LibInfoGeneratorBase):
+ """Generates "unmangled" library name from a library file node.
+
+ Generally, it's thought to revert modifications done by prefix/suffix
+ generators (_LibPrefixGenerator/_LibSuffixGenerator) used by a library
+ builder. For example, on gnulink the suffix generator used by SharedLibrary
+ builder appends $SHLIBVERSION to $SHLIBSUFFIX producing node name which
+ ends with "$SHLIBSUFFIX.$SHLIBVERSION". Correspondingly, the implementation
+ of _LibNameGenerator replaces "$SHLIBSUFFIX.$SHLIBVERSION" with
+ "$SHLIBSUFFIX" in the node's basename. So that, if $SHLIBSUFFIX is ".so",
+ $SHLIBVERSION is "0.1.2" and the node path is "/foo/bar/libfoo.so.0.1.2",
+ the _LibNameGenerator shall return "libfoo.so". Other link tools may
+ implement it's own way of library name unmangling.
+ """
+ def __init__(self, libtype):
+ super(_LibNameGenerator, self).__init__(libtype, 'Name')
+
+ def __call__(self, env, libnode, **kw):
+ """Returns "demangled" library name"""
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print "_LibNameGenerator: libnode=%r" % libnode.get_path()
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print '_LibNameGenerator: version=%r' % version
+
+ name = None
+ if version:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ name = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if not name:
+ name = os.path.basename(libnode.get_path())
+
+ if Verbose:
+ print '_LibNameGenerator: return name=%r' % name
+
+ return name
+
+ShLibNameGenerator = _LibNameGenerator('ShLib')
+LdModNameGenerator = _LibNameGenerator('LdMod')
+ImpLibNameGenerator = _LibNameGenerator('ImpLib')
+
+class _LibSonameGenerator(_LibInfoGeneratorBase):
+ """Library soname generator. Returns library soname (e.g. libfoo.so.0) for
+ a given node (e.g. /foo/bar/libfoo.so.0.1.2)"""
+ def __init__(self, libtype):
+ super(_LibSonameGenerator, self).__init__(libtype, 'Soname')
+
+ def __call__(self, env, libnode, **kw):
+ """Returns a SONAME based on a shared library's node path"""
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print "_LibSonameGenerator: libnode=%r" % libnode.get_path()
+
+ soname = _call_env_subst(env, '$SONAME', **kw2)
+ if not soname:
+ version = self.get_lib_version(env,**kw2)
+ if Verbose:
+ print "_LibSonameGenerator: version=%r" % version
+ if version:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ soname = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if not soname:
+ # fallback to library name (as returned by appropriate _LibNameGenerator)
+ soname = _LibNameGenerator(self.get_libtype())(env, libnode)
+ if Verbose:
+ print "_LibSonameGenerator: FALLBACK: soname=%r" % soname
+
+ if Verbose:
+ print "_LibSonameGenerator: return soname=%r" % soname
+
+ return soname
+
+ShLibSonameGenerator = _LibSonameGenerator('ShLib')
+LdModSonameGenerator = _LibSonameGenerator('LdMod')
+
+def StringizeLibSymlinks(symlinks):
+ """Converts list with pairs of nodes to list with pairs of node paths
+ (strings). Used mainly for debugging."""
+ if SCons.Util.is_List(symlinks):
+ try:
+ return [ (k.get_path(), v.get_path()) for k,v in symlinks ]
+ except (TypeError, ValueError):
+ return symlinks
+ else:
+ return symlinks
+
+def EmitLibSymlinks(env, symlinks, libnode, **kw):
+ """Used by emitters to handle (shared/versioned) library symlinks"""
+ Verbose = False
+
+ # nodes involved in process... all symlinks + library
+ nodes = list(set([ x for x,y in symlinks ] + [libnode]))
+
+ clean_targets = kw.get('clean_targets', [])
+ if not SCons.Util.is_List(clean_targets):
+ clean_targets = [ clean_targets ]
+
+ for link, linktgt in symlinks:
+ env.SideEffect(link, linktgt)
+ if(Verbose):
+ print "EmitLibSymlinks: SideEffect(%r,%r)" % (link.get_path(), linktgt.get_path())
+ clean_list = filter(lambda x : x != linktgt, nodes)
+ env.Clean(list(set([linktgt] + clean_targets)), clean_list)
+ if(Verbose):
+ print "EmitLibSymlinks: Clean(%r,%r)" % (linktgt.get_path(), map(lambda x : x.get_path(), clean_list))
+
+def CreateLibSymlinks(env, symlinks):
+ """Physically creates symlinks. The symlinks argument must be a list in
+ form [ (link, linktarget), ... ], where link and linktarget are SCons
+ nodes.
+ """
+
+ Verbose = False
+ for link, linktgt in symlinks:
+ linktgt = link.get_dir().rel_path(linktgt)
+ link = link.get_path()
+ if(Verbose):
+ print "CreateLibSymlinks: preparing to add symlink %r -> %r" % (link, linktgt)
+ # Delete the (previously created) symlink if exists. Let only symlinks
+ # to be deleted to prevent accidental deletion of source files...
+ if env.fs.islink(link):
+ env.fs.unlink(link)
+ if(Verbose):
+ print "CreateLibSymlinks: removed old symlink %r" % link
+ # If a file or directory exists with the same name as link, an OSError
+ # will be thrown, which should be enough, I think.
+ env.fs.symlink(linktgt, link)
+ if(Verbose):
+ print "CreateLibSymlinks: add symlink %r -> %r" % (link, linktgt)
+ return 0
+
+def LibSymlinksActionFunction(target, source, env):
+ for tgt in target:
+ symlinks = getattr(getattr(tgt,'attributes', None), 'shliblinks', None)
+ if symlinks:
+ CreateLibSymlinks(env, symlinks)
+ return 0
+
+def LibSymlinksStrFun(target, source, env, *args):
+ cmd = None
+ for tgt in target:
+ symlinks = getattr(getattr(tgt,'attributes', None), 'shliblinks', None)
+ if symlinks:
+ if cmd is None: cmd = ""
+ if cmd: cmd += "\n"
+ cmd += "Create symlinks for: %r" % tgt.get_path()
try:
- os.remove(lastlinkname)
- except:
+ linkstr = ', '.join([ "%r->%r" %(k,v) for k,v in StringizeLibSymlinks(symlinks)])
+ except (KeyError, ValueError):
pass
- os.symlink(lib_ver,lastlinkname)
- if Verbose:
- print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver)
- return result
+ else:
+ cmd += ": %s" % linkstr
+ return cmd
+
-# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 :
-# Ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM.
-# This was tricky because we don't want changing LIBPATH to cause a rebuild, but
-# changing other link args should. LIBPATH has $( ... $) around it but until this
-# fix, when the varlist was added to the build sig those ignored parts weren't getting
-# ignored.
-ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None, varlist=['SHLINKCOM'])
+LibSymlinksAction = SCons.Action.Action(LibSymlinksActionFunction, LibSymlinksStrFun)
def createSharedLibBuilder(env):
"""This is a utility function that creates the SharedLibrary
@@ -393,11 +679,12 @@ def createSharedLibBuilder(env):
except KeyError:
import SCons.Defaults
action_list = [ SCons.Defaults.SharedCheck,
- ShLibAction ]
+ SCons.Defaults.ShLinkAction,
+ LibSymlinksAction ]
shared_lib = SCons.Builder.Builder(action = action_list,
emitter = "$SHLIBEMITTER",
- prefix = '$SHLIBPREFIX',
- suffix = '$SHLIBSUFFIX',
+ prefix = ShLibPrefixGenerator,
+ suffix = ShLibSuffixGenerator,
target_scanner = ProgramScanner,
src_suffix = '$SHOBJSUFFIX',
src_builder = 'SharedObject')
@@ -417,11 +704,12 @@ def createLoadableModuleBuilder(env):
except KeyError:
import SCons.Defaults
action_list = [ SCons.Defaults.SharedCheck,
- SCons.Defaults.LdModuleLinkAction ]
+ SCons.Defaults.LdModuleLinkAction,
+ LibSymlinksAction ]
ld_module = SCons.Builder.Builder(action = action_list,
emitter = "$LDMODULEEMITTER",
- prefix = '$LDMODULEPREFIX',
- suffix = '$LDMODULESUFFIX',
+ prefix = LdModPrefixGenerator,
+ suffix = LdModSuffixGenerator,
target_scanner = ProgramScanner,
src_suffix = '$SHOBJSUFFIX',
src_builder = 'SharedObject')
diff --git a/src/engine/SCons/Tool/__init__.xml b/src/engine/SCons/Tool/__init__.xml
index ee56fc3d..69cc597a 100644
--- a/src/engine/SCons/Tool/__init__.xml
+++ b/src/engine/SCons/Tool/__init__.xml
@@ -200,22 +200,20 @@ For maximum portability, use the &b-LoadableModule; builder for the latter.
When the &cv-link-SHLIBVERSION; construction variable is defined a versioned
shared library is created. This modifies the &cv-link-SHLINKFLAGS; as required,
adds the version number to the library name, and creates the symlinks that
-are needed. &cv-link-SHLIBVERSION; needs to be of the form X.Y.Z, where X
-and Y are numbers, and Z is a number but can also contain letters to designate
-alpha, beta, or release candidate patch levels.
+are needed.
</para>
<example_commands>
env.SharedLibrary(target = 'bar', source = ['bar.c', 'foo.o'], SHLIBVERSION='1.5.2')
</example_commands>
-
<para>
-This builder may create multiple links to the library. On a POSIX system,
-for the shared library libbar.so.2.3.1, the links created would be
-libbar.so and libbar.so.2; on a Darwin (OSX) system
-the library would be libbar.2.3.1.dylib and the link would be
-libbar.dylib.
+On a POSIX system, versions with a single token create exactly one symlink:
+libbar.so.6 would have symlinks libbar.so only.
+On a POSIX system, versions with two or more
+tokens create exactly two symlinks: libbar.so.2.3.1 would have symlinks
+libbar.so and libbar.so.2; on a Darwin (OSX) system the library would be
+libbar.2.3.1.dylib and the link would be libbar.dylib.
</para>
<para>
@@ -464,6 +462,17 @@ as C++ files.
</summary>
</cvar>
+<cvar name="IMPLIBVERSION">
+<summary>
+<para>
+Used to override &cv-link-SHLIBVERSION;/&cv-link-LDMODULEVERSION; when
+generating versioned import library for a shared library/loadable module. If
+undefined, the &cv-link-SHLIBVERSION;/&cv-link-LDMODULEVERSION; is used to
+determine the version of versioned import library.
+</para>
+</summary>
+</cvar>
+
<cvar name="LIBEMITTER">
<summary>
<para>
@@ -472,6 +481,19 @@ TODO
</summary>
</cvar>
+<cvar name="LDMODULEVERSION">
+<summary>
+<para>
+When this construction variable is defined, a versioned loadable module
+is created by &b-link-LoadableModule; builder. This activates the
+&cv-link-_LDMODULEVERSIONFLAGS; and thus modifies the &cv-link-LDMODULECOM; as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. &cv-link-LDMODULEVERSION; versions should exist in the same
+format as &cv-link-SHLIBVERSION;.
+</para>
+</summary>
+</cvar>
+
<cvar name="SHLIBEMITTER">
<summary>
<para>
@@ -492,11 +514,12 @@ TODO
<summary>
<para>
When this construction variable is defined, a versioned shared library
-is created. This modifies the &cv-link-SHLINKFLAGS; as required, adds
-the version number to the library name, and creates the symlinks that
-are needed. &cv-link-SHLIBVERSION; needs to be of the form X.Y.Z,
-where X and Y are numbers, and Z is a number but can also contain
-letters to designate alpha, beta, or release candidate patch levels.
+is created by &b-link-SharedLibrary; builder. This activates the
+&cv-link-_SHLIBVERSIONFLAGS; and thus modifies the &cv-link-SHLINKCOM; as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. &cv-link-SHLIBVERSION; versions should exist as alpha-numeric,
+decimal-delimited values as defined by the regular expression "\w+[\.\w+]*".
+Example &cv-link-SHLIBVERSION; values include '1', '1.2.3', and '1.2.gitaa412c8b'.
</para>
</summary>
</cvar>
diff --git a/src/engine/SCons/Tool/cyglink.py b/src/engine/SCons/Tool/cyglink.py
index 87716cf9..5230910a 100644
--- a/src/engine/SCons/Tool/cyglink.py
+++ b/src/engine/SCons/Tool/cyglink.py
@@ -7,19 +7,27 @@ It will usually be imported through the generic SCons.Tool.Tool()
selection method.
"""
+import re
+import os
import SCons.Action
import SCons.Util
+import SCons.Tool
import gnulink
+import link
-def shlib_generator(target, source, env, for_signature):
- cmd = SCons.Util.CLVar(['$SHLINK'])
+def _lib_generator(target, source, env, for_signature, **kw):
+ try: cmd = kw['cmd']
+ except KeyError: cmd = SCons.Util.CLVar(['$SHLINK'])
+
+ try: vp = kw['varprefix']
+ except KeyError: vp = 'SHLIB'
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
if dll: cmd.extend(['-o', dll])
- cmd.extend(['$SHLINKFLAGS', '$__RPATH'])
+ cmd.extend(['$SHLINKFLAGS', '$__%sVERSIONFLAGS' % vp, '$__RPATH'])
implib = env.FindIxes(target, 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
if implib:
@@ -35,37 +43,141 @@ def shlib_generator(target, source, env, for_signature):
return [cmd]
-def shlib_emitter(target, source, env):
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+
+def shlib_generator(target, source, env, for_signature):
+ return _lib_generator(target, source, env, for_signature,
+ varprefix='SHLIB',
+ cmd = SCons.Util.CLVar(['$SHLINK']))
+
+def ldmod_generator(target, source, env, for_signature):
+ return _lib_generator(target, source, env, for_signature,
+ varprefix='LDMODULE',
+ cmd = SCons.Util.CLVar(['$LDMODULE']))
+
+def _lib_emitter(target, source, env, **kw):
+ Verbose = False
+
+ if Verbose:
+ print "_lib_emitter: target[0]=%r" % target[0].get_path()
+
+ try: vp = kw['varprefix']
+ except KeyError: vp = 'SHLIB'
+
+ try: libtype = kw['libtype']
+ except KeyError: libtype = 'ShLib'
+
+ dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
no_import_lib = env.get('no_import_lib', 0)
+ if Verbose:
+ print "_lib_emitter: dll=%r" % dll.get_path()
+
if not dll or len(target) > 1:
- raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
+ raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$%sSUFFIX" % vp))
# Remove any "lib" after the prefix
- pre = env.subst('$SHLIBPREFIX')
+ pre = env.subst('$%sPREFIX' % vp)
if dll.name[len(pre):len(pre)+3] == 'lib':
dll.name = pre + dll.name[len(pre)+3:]
+ if Verbose:
+ print "_lib_emitter: dll.name=%r" % dll.name
+
orig_target = target
target = [env.fs.File(dll)]
target[0].attributes.shared = 1
+ if Verbose:
+ print "_lib_emitter: after target=[env.fs.File(dll)]: target[0]=%r" % target[0].get_path()
+
# Append an import lib target
if not no_import_lib:
# Create list of target libraries as strings
target_strings = env.ReplaceIxes(orig_target[0],
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ '%sPREFIX' % vp, '%sSUFFIX' % vp,
'IMPLIBPREFIX', 'IMPLIBSUFFIX')
+ if Verbose:
+ print "_lib_emitter: target_strings=%r" % target_strings
implib_target = env.fs.File(target_strings)
+ if Verbose:
+ print "_lib_emitter: implib_target=%r" % implib_target.get_path()
implib_target.attributes.shared = 1
target.append(implib_target)
+ symlinks = SCons.Tool.ImpLibSymlinkGenerator(env, implib_target,
+ implib_libtype=libtype,
+ generator_libtype=libtype+'ImpLib')
+ if Verbose:
+ print "_lib_emitter: implib symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks)
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, implib_target, clean_targets = target[0])
+ implib_target.attributes.shliblinks = symlinks
+
return (target, source)
+
+def shlib_emitter(target, source, env):
+ return _lib_emitter(target, source, env, varprefix='SHLIB', libtype='ShLib')
+
+def ldmod_emitter(target, source, env):
+ return _lib_emitter(target, source, env, varprefix='LDMODULE', libtype='LdMod')
+def _versioned_lib_suffix(env, suffix, version):
+ """Generate versioned shared library suffix from a unversioned one.
+ If suffix='.dll', and version='0.1.2', then it returns '-0-1-2.dll'"""
+ Verbose = False
+ if Verbose:
+ print "_versioned_lib_suffix: suffix= ", suffix
+ print "_versioned_lib_suffix: version= ", version
+ cygversion = re.sub('\.', '-', version)
+ if not suffix.startswith('-' + cygversion):
+ suffix = '-' + cygversion + suffix
+ if Verbose:
+ print "_versioned_lib_suffix: return suffix= ", suffix
+ return suffix
+
+def _versioned_implib_name(env, libnode, version, prefix, suffix, **kw):
+ return link._versioned_lib_name(env, libnode, version, prefix, suffix,
+ SCons.Tool.ImpLibPrefixGenerator,
+ SCons.Tool.ImpLibSuffixGenerator,
+ implib_libtype=kw['libtype'])
+
+def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):
+ """Generate link names that should be created for a versioned shared lirbrary.
+ Returns a list in the form [ (link, linktarget), ... ]
+ """
+ Verbose = False
+
+ if Verbose:
+ print "_versioned_implib_symlinks: libnode=%r" % libnode.get_path()
+ print "_versioned_implib_symlinks: version=%r" % version
+
+ try: libtype = kw['libtype']
+ except KeyError: libtype = 'ShLib'
+
+
+ linkdir = os.path.dirname(libnode.get_path())
+ if Verbose:
+ print "_versioned_implib_symlinks: linkdir=%r" % linkdir
+
+ name = SCons.Tool.ImpLibNameGenerator(env, libnode,
+ implib_libtype=libtype,
+ generator_libtype=libtype+'ImpLib')
+ if Verbose:
+ print "_versioned_implib_symlinks: name=%r" % name
+
+ major = version.split('.')[0]
+
+ link0 = env.fs.File(os.path.join(linkdir, name))
+ symlinks = [(link0, libnode)]
+
+ if Verbose:
+ print "_versioned_implib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks)
+
+ return symlinks
shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+ldmod_action = SCons.Action.Action(ldmod_generator, generator=1)
def generate(env):
"""Add Builders and construction variables for cyglink to an Environment."""
@@ -74,8 +186,9 @@ def generate(env):
env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,-no-undefined')
env['SHLINKCOM'] = shlib_action
- env['LDMODULECOM'] = shlib_action
+ env['LDMODULECOM'] = ldmod_action
env.Append(SHLIBEMITTER = [shlib_emitter])
+ env.Append(LDMODULEEMITTER = [ldmod_emitter])
env['SHLIBPREFIX'] = 'cyg'
env['SHLIBSUFFIX'] = '.dll'
@@ -83,6 +196,31 @@ def generate(env):
env['IMPLIBPREFIX'] = 'lib'
env['IMPLIBSUFFIX'] = '.dll.a'
+ # Variables used by versioned shared libraries
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
+
+ # SHLIBVERSIONFLAGS and LDMODULEVERSIONFLAGS are same as in gnulink...
+
+ # LINKCALLBACKS are NOT inherited from gnulink
+ env['LINKCALLBACKS'] = {
+ 'VersionedShLibSuffix' : _versioned_lib_suffix,
+ 'VersionedLdModSuffix' : _versioned_lib_suffix,
+ 'VersionedImpLibSuffix' : _versioned_lib_suffix,
+ 'VersionedShLibName' : link._versioned_shlib_name,
+ 'VersionedLdModName' : link._versioned_ldmod_name,
+ 'VersionedShLibImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='ShLib'),
+ 'VersionedLdModImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='LdMod'),
+ 'VersionedShLibImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='ShLib'),
+ 'VersionedLdModImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='LdMod'),
+ }
+
+ # these variables were set by gnulink but are not used in cyglink
+ try: del env['_SHLIBSONAME']
+ except KeyError: pass
+ try: del env['_LDMODULESONAME']
+ except KeyError: pass
+
def exists(env):
return gnulink.exists(env)
diff --git a/src/engine/SCons/Tool/cyglink.xml b/src/engine/SCons/Tool/cyglink.xml
new file mode 100644
index 00000000..42208f1a
--- /dev/null
+++ b/src/engine/SCons/Tool/cyglink.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="cyglink">
+<summary>
+<para>
+Set construction variables for cygwin linker/loader.
+</para>
+</summary>
+<sets>
+<item>IMPLIBPREFIX</item>
+<item>IMPLIBSUFFIX</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>LINKFLAGS</item>
+<item>RPATHPREFIX</item>
+<item>RPATHSUFFIX</item>
+<item>SHLIBPREFIX</item>
+<item>SHLIBSUFFIX</item>
+<item>SHLIBVERSIONFLAGS</item>
+<item>SHLINKCOM</item>
+<item>SHLINKFLAGS</item>
+<item>_LDMODULEVERSIONFLAGS</item>
+<item>_SHLIBVERSIONFLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/src/engine/SCons/Tool/dmd.py b/src/engine/SCons/Tool/dmd.py
index a7d46c60..37229360 100644
--- a/src/engine/SCons/Tool/dmd.py
+++ b/src/engine/SCons/Tool/dmd.py
@@ -114,7 +114,7 @@ def generate(env):
env['DSHLINK'] = '$DC'
env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so')
- env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+ env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
@@ -139,6 +139,17 @@ def generate(env):
env['DRPATHSUFFIX'] = ''
env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+ # Support for versioned libraries
+ env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -L-soname=$_DSHLIBSONAME'
+ env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $DSHLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['DSHLIBVERSION'] = '$SHLIBVERSION'
+ env['DSHLIBVERSIONFLAGS'] = []
+
SCons.Tool.createStaticLibBuilder(env)
diff --git a/src/engine/SCons/Tool/gdc.py b/src/engine/SCons/Tool/gdc.py
index 799c3ab1..32199b3d 100644
--- a/src/engine/SCons/Tool/gdc.py
+++ b/src/engine/SCons/Tool/gdc.py
@@ -97,7 +97,7 @@ def generate(env):
env['DSHLINK'] = '$DC'
env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared')
- env['SHDLINKCOM'] = '$DLINK -o $TARGET $DSHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['SHDLINKCOM'] = '$DLINK -o $TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
@@ -115,6 +115,17 @@ def generate(env):
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+ # Support for versioned libraries
+ env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -Wl,-soname=$_DSHLIBSONAME'
+ env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $DSHLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['DSHLIBVERSION'] = '$SHLIBVERSION'
+ env['DSHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+
SCons.Tool.createStaticLibBuilder(env)
diff --git a/src/engine/SCons/Tool/gettext.xml b/src/engine/SCons/Tool/gettext.xml
index 96e467a3..f9f8b81a 100644
--- a/src/engine/SCons/Tool/gettext.xml
+++ b/src/engine/SCons/Tool/gettext.xml
@@ -27,7 +27,7 @@ See its __doc__ string for a discussion of the format.
<summary>
<para>
This is actually a toolset, which supports internationalization and
-localization of sofware being constructed with SCons. The toolset loads
+localization of software being constructed with SCons. The toolset loads
following tools:
</para>
diff --git a/src/engine/SCons/Tool/gnulink.py b/src/engine/SCons/Tool/gnulink.py
index 3dc8f51b..6b0d5b33 100644
--- a/src/engine/SCons/Tool/gnulink.py
+++ b/src/engine/SCons/Tool/gnulink.py
@@ -34,9 +34,14 @@ selection method.
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import SCons.Util
+import SCons.Tool
+import os
+import sys
+import re
import link
+
def generate(env):
"""Add Builders and construction variables for gnulink to an Environment."""
link.generate(env)
@@ -49,6 +54,14 @@ def generate(env):
env['RPATHPREFIX'] = '-Wl,-rpath='
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+ # OpenBSD doesn't usually use SONAME for libraries
+ use_soname = not sys.platform.startswith('openbsd')
+ link._setup_versioned_lib_variables(env, tool = 'gnulink', use_soname = use_soname)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
+
+ # For backward-compatiblity with older SCons versions
+ env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('-Wl,-Bsymbolic')
def exists(env):
# TODO: sync with link.smart_link() to choose a linker
diff --git a/src/engine/SCons/Tool/gnulink.xml b/src/engine/SCons/Tool/gnulink.xml
index 2a36de2f..0e055c7d 100644
--- a/src/engine/SCons/Tool/gnulink.xml
+++ b/src/engine/SCons/Tool/gnulink.xml
@@ -33,6 +33,10 @@ Set construction variables for GNU linker/loader.
<item>SHLINKFLAGS</item>
<item>RPATHPREFIX</item>
<item>RPATHSUFFIX</item>
+<item>_LDMODULESONAME</item>
+<item>_SHLIBSONAME</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>SHLIBVERSIONFLAGS</item>
</sets>
</tool>
diff --git a/src/engine/SCons/Tool/install.py b/src/engine/SCons/Tool/install.py
index 9f2e937b..9d5db9f8 100644
--- a/src/engine/SCons/Tool/install.py
+++ b/src/engine/SCons/Tool/install.py
@@ -38,6 +38,7 @@ import shutil
import stat
import SCons.Action
+import SCons.Tool
from SCons.Util import make_path_relative
#
@@ -141,98 +142,35 @@ def copyFuncVersionedLib(dest, source, env):
shutil.copy2(source, dest)
st = os.stat(source)
os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
- versionedLibLinks(dest, source, env)
+ installShlibLinks(dest, source, env)
return 0
-def versionedLibVersion(dest, source, env):
- """Check if dest is a version shared library name. Return version, libname, & install_dir if it is."""
+def listShlibLinksToInstall(dest, source, env):
+ install_links = []
+ source = env.arg2nodes(source)
+ dest = env.fs.File(dest)
+ install_dir = dest.get_dir()
+ for src in source:
+ symlinks = getattr(getattr(src,'attributes',None), 'shliblinks', None)
+ if symlinks:
+ for link, linktgt in symlinks:
+ link_base = os.path.basename(link.get_path())
+ linktgt_base = os.path.basename(linktgt.get_path())
+ install_link = env.fs.File(link_base, install_dir)
+ install_linktgt = env.fs.File(linktgt_base, install_dir)
+ install_links.append((install_link, install_linktgt))
+ return install_links
+
+def installShlibLinks(dest, source, env):
+ """If we are installing a versioned shared library create the required links."""
Verbose = False
- platform = env.subst('$PLATFORM')
- if not (platform == 'posix' or platform == 'darwin' or platform == 'sunos'):
- return (None, None, None)
- if (hasattr(source[0], 'attributes') and
- hasattr(source[0].attributes, 'shlibname')):
- libname = source[0].attributes.shlibname
- else:
- libname = os.path.basename(str(dest))
- install_dir = os.path.dirname(str(dest))
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- # See if the source name is a versioned shared library, get the version number
- result = False
-
- version_re = re.compile("[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
- version_File = None
- if platform == 'posix' or platform == 'sunos':
- # handle unix names
- versioned_re = re.compile(re.escape(shlib_suffix + '.') + "[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
- result = versioned_re.findall(libname)
- if result:
- version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
- elif platform == 'darwin':
- # handle OSX names
- versioned_re = re.compile("\\.[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+" + re.escape(shlib_suffix) )
- result = versioned_re.findall(libname)
- if result:
- version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
-
+ symlinks = listShlibLinksToInstall(dest, source, env)
if Verbose:
- print "install: version_File ", version_File
- # result is False if we did not find a versioned shared library name, so return and empty list
- if not result:
- return (None, libname, install_dir)
-
- version = None
- # get version number from the environment
- try:
- version = env.subst('$SHLIBVERSION')
- except KeyError:
- version = None
-
- if version != version_File:
- #raise SCons.Errors.UserError("SHLIBVERSION '%s' does not match the version # '%s' in the filename" % (version, version_File) )
- print "SHLIBVERSION '%s' does not match the version # '%s' in the filename, proceeding based on file name" % (version, version_File)
- version = version_File
- return (version, libname, install_dir)
-
-def versionedLibLinks(dest, source, env):
- """If we are installing a versioned shared library create the required links."""
- Verbose = False
- linknames = []
- version, libname, install_dir = versionedLibVersion(dest, source, env)
-
- if version != None:
- # libname includes the version number if one was given
- linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
- if Verbose:
- print "versionedLibLinks: linknames ",linknames
- # Here we just need the file name w/o path as the target of the link
- lib_ver = libname
- # make symlink of adjacent names in linknames
- for count in range(len(linknames)):
- linkname = linknames[count]
- fulllinkname = os.path.join(install_dir, linkname)
- if Verbose:
- print "full link name ",fulllinkname
- if count > 0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(os.path.basename(fulllinkname),lastlinkname)
- if Verbose:
- print "versionedLibLinks: made sym link of %s -> %s" % (lastlinkname,os.path.basename(fulllinkname))
- lastlinkname = fulllinkname
- # finish chain of sym links with link to the actual library
- if len(linknames)>0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(lib_ver,lastlinkname)
- if Verbose:
- print "versionedLibLinks: made sym link of %s -> %s" % (lib_ver,lastlinkname)
+ print 'installShlibLinks: symlinks=%r' % SCons.Tool.StringizeLibSymlinks(symlinks)
+ if symlinks:
+ SCons.Tool.CreateLibSymlinks(env, symlinks)
return
def installFunc(target, source, env):
@@ -306,22 +244,11 @@ def add_versioned_targets_to_INSTALLED_FILES(target, source, env):
Verbose = False
_INSTALLED_FILES.extend(target)
if Verbose:
- print "ver lib emitter ",repr(target)
-
- # see if we have a versioned shared library, if so generate side effects
- version, libname, install_dir = versionedLibVersion(target[0], source, env)
- if version != None:
- # generate list of link names
- linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
- for linkname in linknames:
- if Verbose:
- print "make side effect of %s" % os.path.join(install_dir, linkname)
- fulllinkname = os.path.join(install_dir, linkname)
- env.SideEffect(fulllinkname,target[0])
- env.Clean(target[0],fulllinkname)
- _INSTALLED_FILES.append(fulllinkname)
- if Verbose:
- print "installed list ", _INSTALLED_FILES
+ print "add_versioned_targets_to_INSTALLED_FILES: target=%r" % map(str, target)
+
+ symlinks = listShlibLinksToInstall(target[0], source, env)
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
_UNIQUE_INSTALLED_FILES = None
return (target, source)
diff --git a/src/engine/SCons/Tool/install.xml b/src/engine/SCons/Tool/install.xml
index 0aa93843..6ae3e307 100644
--- a/src/engine/SCons/Tool/install.xml
+++ b/src/engine/SCons/Tool/install.xml
@@ -82,20 +82,13 @@ env.InstallAs(target = ['../lib/libfoo.a', '../lib/libbar.a'],
<builder name="InstallVersionedLib">
<summary>
<para>
-Installs a versioned shared library. The &cv-link-SHLIBVERSION;
-construction variable should be defined in the environment
-to confirm the version number in the library name.
-If &cv-link-SHLIBVERSION; is not defined a warning will be issued
-and the name of the library will be parsed to derive the version.
-The symlinks appropriate to the architecture will be generated.
+Installs a versioned shared library. The symlinks appropriate to the
+architecture will be generated based on symlinks of the source library.
</para>
<example_commands>
env.InstallVersionedLib(target = '/usr/local/bin/foo',
source = 'libxyz.1.5.2.so')
-env.InstallVersionedLib(target = '/usr/local/bin/foo',
- source = 'libxyz.1.5.2.so',
- SHLIBVERSION='1.5.2')
</example_commands>
</summary>
</builder>
diff --git a/src/engine/SCons/Tool/ldc.py b/src/engine/SCons/Tool/ldc.py
index 8f9b1175..ade95db4 100644
--- a/src/engine/SCons/Tool/ldc.py
+++ b/src/engine/SCons/Tool/ldc.py
@@ -105,7 +105,7 @@ def generate(env):
# Hack for Fedora the packages of which use the wrong name :-(
if os.path.exists('/usr/lib64/libphobos-ldc.so') or os.path.exists('/usr/lib32/libphobos-ldc.so') or os.path.exists('/usr/lib/libphobos-ldc.so') :
env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos-ldc')
- env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+ env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DSHLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
@@ -131,6 +131,17 @@ def generate(env):
env['DRPATHSUFFIX'] = ''
env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+ # Support for versioned libraries
+ env['_DSHLIBVERSIONFLAGS'] = '$DSHLIBVERSIONFLAGS -L-soname=$_DSHLIBSONAME'
+ env['_DSHLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $DSHLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['DSHLIBVERSION'] = '$SHLIBVERSION'
+ env['DSHLIBVERSIONFLAGS'] = []
+
SCons.Tool.createStaticLibBuilder(env)
diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py
index a084bc4b..a4a2a4cb 100644
--- a/src/engine/SCons/Tool/link.py
+++ b/src/engine/SCons/Tool/link.py
@@ -33,9 +33,10 @@ selection method.
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+import sys
import re
+import os
-import SCons.Defaults
import SCons.Tool
import SCons.Util
import SCons.Warnings
@@ -72,97 +73,205 @@ def smart_link(source, target, env, for_signature):
return '$CXX'
return '$CC'
-def shlib_emitter(target, source, env):
+def _lib_emitter(target, source, env, **kw):
Verbose = False
- platform = env.subst('$PLATFORM')
+ if Verbose:
+ print "_lib_emitter: target[0]=%r" % target[0].get_path()
for tgt in target:
tgt.attributes.shared = 1
+
try:
- # target[0] comes in as libtest.so. Add the version extensions
- version = env.subst('$SHLIBVERSION')
- if version:
- version_names = shlib_emitter_names(target, source, env)
- # mark the target with the shared libraries name, including
- # the version number
- target[0].attributes.shlibname = version_names[0]
- shlib = env.File(version_names[0], directory=target[0].get_dir())
- target[0].attributes.shlibpath = shlib.get_internal_path()
- for name in version_names[1:]:
- env.SideEffect(name, shlib)
- env.Clean(shlib, name)
- if Verbose:
- print "shlib_emitter: add side effect - ",name
- env.Clean(shlib, target[0])
- return ([shlib], source)
+ symlink_generator = kw['symlink_generator']
except KeyError:
- version = None
+ pass
+ else:
+ if Verbose:
+ print "_lib_emitter: symlink_generator=%r" % symlink_generator
+ symlinks = symlink_generator(env, target[0])
+ if Verbose:
+ print "_lib_emitter: symlinks=%r" % symlinks
+
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
+ target[0].attributes.shliblinks = symlinks
return (target, source)
-def shlib_emitter_names(target, source, env):
- """Return list of file names that are side effects for a versioned library build. The first name in the list is the new name for the target"""
+def shlib_emitter(target, source, env):
+ return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.ShLibSymlinkGenerator)
+
+def ldmod_emitter(target, source, env):
+ return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.LdModSymlinkGenerator)
+
+# This is generic enough to be included here...
+def _versioned_lib_name(env, libnode, version, prefix, suffix, prefix_generator, suffix_generator, **kw):
+ """For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so'"""
Verbose = False
- platform = env.subst('$PLATFORM')
- version_names = []
- try:
- # target[0] comes in as libtest.so. Add the version extensions
- version = env.subst('$SHLIBVERSION')
- if version.count(".") != 2:
- # We need a version of the form x.y.z to proceed
- raise ValueError
- if version:
- if platform == 'posix' or platform == 'sunos':
- versionparts = version.split('.')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- version_name = name + '.' + version
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
- if Verbose:
- print "shlib_emitter_names: versionparts ",versionparts
- for ver in versionparts[0:-1]:
- name = name + '.' + ver
- if Verbose:
- print "shlib_emitter_names: side effect: ", name
- # add name to list of names to be a Side effect
- version_names.append(name)
- elif platform == 'darwin':
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- suffix_re = re.escape(shlib_suffix)
- version_name = re.sub(suffix_re, '.' + version + shlib_suffix, name)
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
- elif platform == 'cygwin':
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- suffix_re = re.escape(shlib_suffix)
- version_name = re.sub(suffix_re, '-' + re.sub('\.', '-', version) + shlib_suffix, name)
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
- except KeyError:
- version = None
- return version_names
+ if Verbose:
+ print "_versioned_lib_name: libnode=%r" % libnode.get_path()
+ print "_versioned_lib_name: version=%r" % version
+ print "_versioned_lib_name: prefix=%r" % prefix
+ print "_versioned_lib_name: suffix=%r" % suffix
+ print "_versioned_lib_name: suffix_generator=%r" % suffix_generator
+
+ versioned_name = os.path.basename(libnode.get_path())
+ if Verbose:
+ print "_versioned_lib_name: versioned_name=%r" % versioned_name
+
+ versioned_prefix = prefix_generator(env, **kw)
+ versioned_suffix = suffix_generator(env, **kw)
+ if Verbose:
+ print "_versioned_lib_name: versioned_prefix=%r" % versioned_prefix
+ print "_versioned_lib_name: versioned_suffix=%r" % versioned_suffix
+
+ versioned_prefix_re = '^' + re.escape(versioned_prefix)
+ versioned_suffix_re = re.escape(versioned_suffix) + '$'
+ name = re.sub(versioned_prefix_re, prefix, versioned_name)
+ name = re.sub(versioned_suffix_re, suffix, name)
+ if Verbose:
+ print "_versioned_lib_name: name=%r" % name
+ return name
+
+def _versioned_shlib_name(env, libnode, version, prefix, suffix, **kw):
+ pg = SCons.Tool.ShLibPrefixGenerator
+ sg = SCons.Tool.ShLibSuffixGenerator
+ return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
+
+def _versioned_ldmod_name(env, libnode, version, prefix, suffix, **kw):
+ pg = SCons.Tool.LdModPrefixGenerator
+ sg = SCons.Tool.LdModSuffixGenerator
+ return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
+
+def _versioned_lib_suffix(env, suffix, version):
+ """For suffix='.so' and version='0.1.2' it returns '.so.0.1.2'"""
+ Verbose = False
+ if Verbose:
+ print "_versioned_lib_suffix: suffix=%r" % suffix
+ print "_versioned_lib_suffix: version=%r" % version
+ if not suffix.endswith(version):
+ suffix = suffix + '.' + version
+ if Verbose:
+ print "_versioned_lib_suffix: return suffix=%r" % suffix
+ return suffix
+
+def _versioned_lib_soname(env, libnode, version, prefix, suffix, name_func):
+ """For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so.X'"""
+ Verbose = False
+ if Verbose:
+ print "_versioned_lib_soname: version=%r" % version
+ name = name_func(env, libnode, version, prefix, suffix)
+ if Verbose:
+ print "_versioned_lib_soname: name=%r" % name
+ major = version.split('.')[0]
+ soname = name + '.' + major
+ if Verbose:
+ print "_versioned_lib_soname: soname=%r" % soname
+ return soname
+
+def _versioned_shlib_soname(env, libnode, version, prefix, suffix):
+ return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_shlib_name)
+
+def _versioned_ldmod_soname(env, libnode, version, prefix, suffix):
+ return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_ldmod_name)
+
+def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, soname_func):
+ """Generate link names that should be created for a versioned shared lirbrary.
+ Returns a dictionary in the form { linkname : linktarget }
+ """
+ Verbose = False
+
+ if Verbose:
+ print "_versioned_lib_symlinks: libnode=%r" % libnode.get_path()
+ print "_versioned_lib_symlinks: version=%r" % version
+
+ if sys.platform.startswith('openbsd'):
+ # OpenBSD uses x.y shared library versioning numbering convention
+ # and doesn't use symlinks to backwards-compatible libraries
+ if Verbose:
+ print "_versioned_lib_symlinks: return symlinks=%r" % None
+ return None
+
+ linkdir = libnode.get_dir()
+ if Verbose:
+ print "_versioned_lib_symlinks: linkdir=%r" % linkdir.get_path()
+
+ name = name_func(env, libnode, version, prefix, suffix)
+ if Verbose:
+ print "_versioned_lib_symlinks: name=%r" % name
+
+ soname = soname_func(env, libnode, version, prefix, suffix)
+
+ link0 = env.fs.File(soname, linkdir)
+ link1 = env.fs.File(name, linkdir)
+
+ # We create direct symlinks, not daisy-chained.
+ if link0 == libnode:
+ # This enables SHLIBVERSION without periods (e.g. SHLIBVERSION=1)
+ symlinks = [ (link1, libnode) ]
+ else:
+ # This handles usual SHLIBVERSION, i.e. '1.2', '1.2.3', etc.
+ symlinks = [ (link0, libnode), (link1, libnode) ]
+
+ if Verbose:
+ print "_versioned_lib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks)
+
+ return symlinks
+
+def _versioned_shlib_symlinks(env, libnode, version, prefix, suffix):
+ nf = _versioned_shlib_name
+ sf = _versioned_shlib_soname
+ return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
+
+def _versioned_ldmod_symlinks(env, libnode, version, prefix, suffix):
+ nf = _versioned_ldmod_name
+ sf = _versioned_ldmod_soname
+ return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
+
+def _versioned_lib_callbacks():
+ return {
+ 'VersionedShLibSuffix' : _versioned_lib_suffix,
+ 'VersionedLdModSuffix' : _versioned_lib_suffix,
+ 'VersionedShLibSymlinks' : _versioned_shlib_symlinks,
+ 'VersionedLdModSymlinks' : _versioned_ldmod_symlinks,
+ 'VersionedShLibName' : _versioned_shlib_name,
+ 'VersionedLdModName' : _versioned_ldmod_name,
+ 'VersionedShLibSoname' : _versioned_shlib_soname,
+ 'VersionedLdModSoname' : _versioned_ldmod_soname,
+ }.copy()
+
+# Setup all variables required by the versioning machinery
+def _setup_versioned_lib_variables(env, **kw):
+
+ tool = None
+ try: tool = kw['tool']
+ except KeyError: pass
+
+ use_soname = False
+ try: use_soname = kw['use_soname']
+ except KeyError: pass
+
+ # The $_SHLIBVERSIONFLAGS define extra commandline flags used when
+ # building VERSIONED shared libraries. It's always set, but used only
+ # when VERSIONED library is built (see __SHLIBVERSIONFLAGS in SCons/Defaults.py).
+ if use_soname:
+ # If the linker uses SONAME, then we need this little automata
+ if tool == 'sunlink':
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLIBSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME'
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLIBSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
+ env['_SHLIBSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
+ env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
+ env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
+
+ # LDOMDULVERSIONFLAGS should always default to $SHLIBVERSIONFLAGS
+ env['LDMODULEVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+
def generate(env):
"""Add Builders and construction variables for gnulink to an Environment."""
@@ -171,7 +280,7 @@ def generate(env):
env['SHLINK'] = '$LINK'
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
# don't set up the emitter, cause AppendUnique will generate a list
# starting with None :-(
env.Append(SHLIBEMITTER = [shlib_emitter])
@@ -196,15 +305,13 @@ def generate(env):
# setting them the same means that LoadableModule works everywhere.
SCons.Tool.createLoadableModuleBuilder(env)
env['LDMODULE'] = '$SHLINK'
- # don't set up the emitter, cause AppendUnique will generate a list
- # starting with None :-(
- env.Append(LDMODULEEMITTER='$SHLIBEMITTER')
+ env.Append(LDMODULEEMITTER = [ldmod_emitter])
env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
- env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
-
+ env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LDMODULEVERSION'] = '$SHLIBVERSION'
+ env['LDMODULENOVERSIONSYMLINKS'] = '$SHLIBNOVERSIONSYMLINKS'
def exists(env):
# This module isn't really a Tool on its own, it's common logic for
diff --git a/src/engine/SCons/Tool/link.xml b/src/engine/SCons/Tool/link.xml
index d58b9e26..2f913fe8 100644
--- a/src/engine/SCons/Tool/link.xml
+++ b/src/engine/SCons/Tool/link.xml
@@ -41,11 +41,16 @@ Sets construction variables for generic POSIX linkers.
<item>LIBLINKPREFIX</item>
<item>LIBLINKSUFFIX</item>
<item>SHLIBSUFFIX</item>
+<item>__SHLIBVERSIONFLAGS</item>
<item>LDMODULE</item>
<item>LDMODULEPREFIX</item>
<item>LDMODULESUFFIX</item>
<item>LDMODULEFLAGS</item>
<item>LDMODULECOM</item>
+<item>LDMODULEVERSION</item>
+<item>LDMODULENOVERSIONSYMLINKS</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>__LDMODULEVERSIONFLAGS</item>
</sets>
<uses>
<item>SHLINKCOMSTR</item>
@@ -54,6 +59,105 @@ Sets construction variables for generic POSIX linkers.
</uses>
</tool>
+<cvar name="__LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+This construction variable automatically introduces &cv-link-_LDMODULEVERSIONFLAGS;
+if &cv-link-LDMODULEVERSION; is set. Othervise it evaluates to an empty string.
+</para>
+</summary>
+</cvar>
+
+<cvar name="__SHLIBVERSIONFLAGS">
+<summary>
+<para>
+This construction variable automatically introduces &cv-link-_SHLIBVERSIONFLAGS;
+if &cv-link-SHLIBVERSION; is set. Othervise it evaluates to an empty string.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_LDMODULESONAME">
+<summary>
+<para>
+A macro that automatically generates loadable module's SONAME based on $TARGET,
+$LDMODULEVERSION and $LDMODULESUFFIX. Used by &b-link-LoadableModule; builder
+when the linker tool supports SONAME (e.g. &t-link-gnulink;).
+</para>
+</summary>
+</cvar>
+
+<cvar name="_LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+This macro automatically introduces extra flags to &cv-link-LDMODULECOM; when
+building versioned &b-link-LoadableModule; (that is when
+&cv-link-LDMODULEVERSION; is set). <literal>_LDMODULEVERSIONFLAGS</literal>
+usually adds &cv-link-SHLIBVERSIONFLAGS; and some extra dynamically generated
+options (such as <literal>-Wl,-soname=$_LDMODULESONAME</literal>). It is unused
+by plain (unversioned) loadable modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_SHLIBVERSIONFLAGS">
+<summary>
+<para>
+This macro automatically introduces extra flags to &cv-link-SHLINKCOM; when
+building versioned &b-link-SharedLibrary; (that is when &cv-link-SHLIBVERSION;
+is set). <literal>_SHLIBVERSIONFLAGS</literal> usually adds &cv-link-SHLIBVERSIONFLAGS;
+and some extra dynamically generated options (such as
+<literal>-Wl,-soname=$_SHLIBSONAME</literal>. It is unused by "plain"
+(unversioned) shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_SHLIBSONAME">
+<summary>
+<para>
+A macro that automatically generates shared library's SONAME based on $TARGET,
+$SHLIBVERSION and $SHLIBSUFFIX. Used by &b-link-SharedLibrary; builder when
+the linker tool supports SONAME (e.g. &t-link-gnulink;).
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBPREFIX">
+<summary>
+<para>
+The prefix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The &t-link-cyglink; linker sets
+&cv-link-IMPLIBPREFIX; to <literal>'lib'</literal> and &cv-link-SHLIBPREFIX;
+to <literal>'cyg'</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBSUFFIX">
+<summary>
+<para>
+The suffix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The &t-link-cyglink; linker sets
+&cv-link-IMPLIBSUFFIX; to <literal>'.dll.a'</literal> and &cv-link-SHLIBSUFFIX;
+to <literal>'.dll'</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBNOVERSIONSYMLINKS">
+<summary>
+<para>
+Used to override &cv-link-SHLIBNOVERSIONSYMLINKS;/&cv-link-LDMODULENOVERSIONSYMLINKS; when
+creating versioned import library for a shared library/loadable module. If not defined,
+then &cv-link-SHLIBNOVERSIONSYMLINKS;/&cv-link-LDMODULENOVERSIONSYMLINKS; is used to determine
+whether to disable symlink generation or not.
+</para>
+</summary>
+</cvar>
+
<cvar name="LDMODULE">
<summary>
<para>
@@ -92,6 +196,15 @@ General user options passed to the linker for building loadable modules.
</summary>
</cvar>
+<cvar name="LDMODULENOVERSIONSYMLINKS">
+<summary>
+<para>
+Instructs the &b-link-LoadableModule; builder to not automatically create symlinks
+for versioned modules. Defaults to <literal>$SHLIBNOVERSIONSYMLINKS</literal>
+</para>
+</summary>
+</cvar>
+
<cvar name="LDMODULEPREFIX">
<summary>
<para>
@@ -114,6 +227,16 @@ the same as $SHLIBSUFFIX.
</summary>
</cvar>
+<cvar name="LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+Extra flags added to &cv-link-LDMODULECOM; when building versioned
+&b-link-LoadableModule;. These flags are only used when &cv-link-LDMODULEVERSION; is
+set.
+</para>
+</summary>
+</cvar>
+
<cvar name="LINK">
<summary>
<para>
@@ -169,6 +292,25 @@ for the variable that expands to library search path options.
</summary>
</cvar>
+<cvar name="SHLIBNOVERSIONSYMLINKS">
+<summary>
+<para>
+Instructs the &b-link-SharedLibrary; builder to not create symlinks for versioned
+shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBVERSIONFLAGS">
+<summary>
+<para>
+Extra flags added to &cv-link-SHLINKCOM; when building versioned
+&b-link-SharedLibrary;. These flags are only used when &cv-link-SHLIBVERSION; is
+set.
+</para>
+</summary>
+</cvar>
+
<cvar name="SHLINK">
<summary>
<para>
@@ -223,6 +365,18 @@ for the variable that expands to library search path options.
</summary>
</cvar>
+<cvar name="SONAME">
+<summary>
+<para>
+Variable used to hard-code SONAME for versioned shared library/loadable module.
+<example_commands>
+env.SharedLibrary('test', 'test.c', SHLIBVERSION='0.1.2', SONAME='libtest.so.2')
+</example_commands>
+The variable is used, for example, by &t-link-gnulink; linker tool.
+</para>
+</summary>
+</cvar>
+
<cvar name="STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME">
<summary>
<para>
diff --git a/src/engine/SCons/Tool/linkloc.py b/src/engine/SCons/Tool/linkloc.py
index 9c585619..bd643f7a 100644
--- a/src/engine/SCons/Tool/linkloc.py
+++ b/src/engine/SCons/Tool/linkloc.py
@@ -86,6 +86,7 @@ def generate(env):
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS')
env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}'
env['SHLIBEMITTER']= None
+ env['LDMODULEEMITTER']= None
env['LINK'] = "linkloc"
env['LINKFLAGS'] = SCons.Util.CLVar('')
env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}'
diff --git a/src/engine/SCons/Tool/midl.xml b/src/engine/SCons/Tool/midl.xml
index 1420978b..efd83cc4 100644
--- a/src/engine/SCons/Tool/midl.xml
+++ b/src/engine/SCons/Tool/midl.xml
@@ -44,7 +44,7 @@ Sets construction variables for the Microsoft IDL compiler.
<para>
Builds a Windows type library (<filename>.tlb</filename>)
file from an input IDL file (<filename>.idl</filename>).
-In addition, it will build the associated inteface stub and
+In addition, it will build the associated interface stub and
proxy source files,
naming them according to the base name of the <filename>.idl</filename> file.
For example,
diff --git a/src/engine/SCons/Tool/mingw.py b/src/engine/SCons/Tool/mingw.py
index 601ec3b8..948ebe5e 100644
--- a/src/engine/SCons/Tool/mingw.py
+++ b/src/engine/SCons/Tool/mingw.py
@@ -146,6 +146,7 @@ def generate(env):
env['SHLINKCOM'] = shlib_action
env['LDMODULECOM'] = shlib_action
env.Append(SHLIBEMITTER = [shlib_emitter])
+ env.Append(LDMODULEEMITTER = [shlib_emitter])
env['AS'] = 'as'
env['WIN32DEFPREFIX'] = ''
diff --git a/src/engine/SCons/Tool/msgmerge.xml b/src/engine/SCons/Tool/msgmerge.xml
index 2bfc6df8..139b21cf 100644
--- a/src/engine/SCons/Tool/msgmerge.xml
+++ b/src/engine/SCons/Tool/msgmerge.xml
@@ -64,7 +64,7 @@ Target nodes defined through &b-POUpdate; are not built by default
(they're <literal>Ignore</literal>d from <literal>'.'</literal> node). Instead,
they are added automatically to special <literal>Alias</literal>
(<literal>'po-update'</literal> by default). The alias name may be changed
-through the &cv-link-POUPDATE_ALIAS; construction variable. You can easilly
+through the &cv-link-POUPDATE_ALIAS; construction variable. You can easily
update <literal>PO</literal> files in your project by <command>scons
po-update</command>.
</para>
diff --git a/src/engine/SCons/Tool/mslink.py b/src/engine/SCons/Tool/mslink.py
index 6606e107..1390c206 100644
--- a/src/engine/SCons/Tool/mslink.py
+++ b/src/engine/SCons/Tool/mslink.py
@@ -263,6 +263,7 @@ def generate(env):
env['_SHLINK_SOURCES'] = windowsShlinkSources
env['SHLINKCOM'] = compositeShLinkAction
env.Append(SHLIBEMITTER = [windowsLibEmitter])
+ env.Append(LDMODULEEMITTER = [windowsLibEmitter])
env['LINK'] = 'link'
env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
env['_PDB'] = pdbGenerator
diff --git a/src/engine/SCons/Tool/msvc.xml b/src/engine/SCons/Tool/msvc.xml
index 793784f8..2b4619e4 100644
--- a/src/engine/SCons/Tool/msvc.xml
+++ b/src/engine/SCons/Tool/msvc.xml
@@ -86,7 +86,7 @@ file as the second element. Normally the object file is ignored.
This builder method is only
provided when Microsoft Visual C++ is being used as the compiler.
The PCH builder method is generally used in
-conjuction with the PCH construction variable to force object files to use
+conjunction with the PCH construction variable to force object files to use
the precompiled header:
</para>
diff --git a/src/engine/SCons/Tool/mwld.py b/src/engine/SCons/Tool/mwld.py
index e762d559..20676606 100644
--- a/src/engine/SCons/Tool/mwld.py
+++ b/src/engine/SCons/Tool/mwld.py
@@ -56,6 +56,7 @@ def generate(env):
env['SHLINKFLAGS'] = '$LINKFLAGS'
env['SHLINKCOM'] = shlib_action
env['SHLIBEMITTER']= shlib_emitter
+ env['LDMODULEEMITTER']= shlib_emitter
def exists(env):
diff --git a/src/engine/SCons/Tool/packaging/rpm.py b/src/engine/SCons/Tool/packaging/rpm.py
index 656d8fb2..92977d05 100644
--- a/src/engine/SCons/Tool/packaging/rpm.py
+++ b/src/engine/SCons/Tool/packaging/rpm.py
@@ -168,7 +168,7 @@ def build_specfile_sections(spec):
'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n',
'X_RPM_VERIFY' : '%%verify\n%s\n\n',
- # These are for internal use but could possibly be overriden
+ # These are for internal use but could possibly be overridden
'X_RPM_PREP' : '%%prep\n%s\n\n',
'X_RPM_BUILD' : '%%build\n%s\n\n',
'X_RPM_INSTALL' : '%%install\n%s\n\n',
diff --git a/src/engine/SCons/Tool/qt.py b/src/engine/SCons/Tool/qt.py
index 716c7d52..7bc0ef6d 100644
--- a/src/engine/SCons/Tool/qt.py
+++ b/src/engine/SCons/Tool/qt.py
@@ -320,6 +320,7 @@ def generate(env):
# correctly later by our emitter.
env.AppendUnique(PROGEMITTER =[AutomocStatic],
SHLIBEMITTER=[AutomocShared],
+ LDMODULEEMITTER=[AutomocShared],
LIBEMITTER =[AutomocStatic],
# Of course, we need to link against the qt libraries
CPPPATH=["$QT_CPPPATH"],
diff --git a/src/engine/SCons/Tool/sunar.py b/src/engine/SCons/Tool/sunar.py
index 779414fd..eb58457c 100644
--- a/src/engine/SCons/Tool/sunar.py
+++ b/src/engine/SCons/Tool/sunar.py
@@ -51,9 +51,6 @@ def generate(env):
env['ARFLAGS'] = SCons.Util.CLVar('r')
env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
- env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
env['LIBPREFIX'] = 'lib'
env['LIBSUFFIX'] = '.a'
diff --git a/src/engine/SCons/Tool/sunar.xml b/src/engine/SCons/Tool/sunar.xml
index 65f0c9e6..f875217c 100644
--- a/src/engine/SCons/Tool/sunar.xml
+++ b/src/engine/SCons/Tool/sunar.xml
@@ -33,15 +33,11 @@ Sets construction variables for the Sun library archiver.
<item>AR</item>
<item>ARFLAGS</item>
<item>ARCOM</item>
-<item>SHLINK</item>
-<item>SHLINKFLAGS</item>
-<item>SHLINKCOM</item>
<item>LIBPREFIX</item>
<item>LIBSUFFIX</item>
</sets>
<uses>
<item>ARCOMSTR</item>
-<item>SHLINKCOMSTR</item>
</uses>
</tool>
diff --git a/src/engine/SCons/Tool/sunlink.py b/src/engine/SCons/Tool/sunlink.py
index 5996a301..680af03b 100644
--- a/src/engine/SCons/Tool/sunlink.py
+++ b/src/engine/SCons/Tool/sunlink.py
@@ -66,6 +66,10 @@ def generate(env):
env['RPATHSUFFIX'] = ''
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+ # Support for versioned libraries
+ link._setup_versioned_lib_variables(env, tool = 'sunlink', use_soname = True)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
+
def exists(env):
return ccLinker
diff --git a/src/engine/SCons/Tool/xgettext.xml b/src/engine/SCons/Tool/xgettext.xml
index 6e28a9db..380f92a0 100644
--- a/src/engine/SCons/Tool/xgettext.xml
+++ b/src/engine/SCons/Tool/xgettext.xml
@@ -108,7 +108,7 @@ the results shall be as the comments above say.
<emphasis>Example 2.</emphasis>
The &b-POTUpdate; builder may be used with no target specified, in which
case default target <filename>messages.pot</filename> will be used. The
-default target may also be overriden by setting &cv-link-POTDOMAIN; construction
+default target may also be overridden by setting &cv-link-POTDOMAIN; construction
variable or providing it as an override to &b-POTUpdate; builder:
</para>
<example_commands>
diff --git a/test/Glob/VariantDir.py b/test/Glob/VariantDir.py
index 175e5b9c..c9c1d076 100644
--- a/test/Glob/VariantDir.py
+++ b/test/Glob/VariantDir.py
@@ -34,6 +34,7 @@ import TestSCons
test = TestSCons.TestSCons()
test.subdir('src')
+test.subdir('src/sub1')
test.write('SConstruct', """\
VariantDir('var1', 'src')
@@ -41,6 +42,9 @@ VariantDir('var2', 'src')
SConscript('var1/SConscript')
SConscript('var2/SConscript')
+SConscript('var1/sub1/SConscript')
+SConscript('var2/sub1/SConscript')
+SConscript('src/sub1/SConscript', src_dir = 'src', variant_dir = 'var3', duplicate=0)
""")
test.write(['src', 'SConscript'], """\
@@ -55,16 +59,46 @@ def concatenate(target, source, env):
env['BUILDERS']['Concatenate'] = Builder(action=concatenate)
env.Concatenate('f.out', sorted(Glob('f*.in'), key=lambda t: t.name))
+env.Concatenate('fex.out', sorted(Glob('f*.in', exclude = 'f1.in'), key=lambda t: t.name))
+""")
+
+test.write(['src', 'sub1', 'SConscript'], """\
+env = Environment()
+
+def concatenate(target, source, env):
+ fp = open(str(target[0]), 'wb')
+ for s in source:
+ fp.write(open(str(s), 'rb').read())
+ fp.close()
+
+env['BUILDERS']['Concatenate'] = Builder(action=concatenate)
+
+env.Concatenate('f.out', sorted(Glob('f*.in'), key=lambda t: t.name))
+env.Concatenate('fex.out', sorted(Glob('f*.in', exclude = 'f1.in'), key=lambda t: t.name))
""")
test.write(['src', 'f1.in'], "src/f1.in\n")
test.write(['src', 'f2.in'], "src/f2.in\n")
test.write(['src', 'f3.in'], "src/f3.in\n")
+test.write(['src', 'sub1', 'f1.in'], "src/sub1/f1.in\n")
+test.write(['src', 'sub1', 'f2.in'], "src/sub1/f2.in\n")
+test.write(['src', 'sub1', 'f3.in'], "src/sub1/f3.in\n")
+
test.run(arguments = '.')
test.must_match(['var1', 'f.out'], "src/f1.in\nsrc/f2.in\nsrc/f3.in\n")
test.must_match(['var2', 'f.out'], "src/f1.in\nsrc/f2.in\nsrc/f3.in\n")
+test.must_match(['var1', 'fex.out'], "src/f2.in\nsrc/f3.in\n")
+test.must_match(['var2', 'fex.out'], "src/f2.in\nsrc/f3.in\n")
+
+test.must_match(['var1', 'sub1', 'f.out'], "src/sub1/f1.in\nsrc/sub1/f2.in\nsrc/sub1/f3.in\n")
+test.must_match(['var2', 'sub1', 'f.out'], "src/sub1/f1.in\nsrc/sub1/f2.in\nsrc/sub1/f3.in\n")
+test.must_match(['var1', 'sub1', 'fex.out'], "src/sub1/f2.in\nsrc/sub1/f3.in\n")
+test.must_match(['var2', 'sub1', 'fex.out'], "src/sub1/f2.in\nsrc/sub1/f3.in\n")
+
+test.must_match(['var3', 'sub1', 'f.out'], "src/sub1/f1.in\nsrc/sub1/f2.in\nsrc/sub1/f3.in\n")
+test.must_match(['var3', 'sub1', 'fex.out'], "src/sub1/f2.in\nsrc/sub1/f3.in\n")
test.pass_test()
diff --git a/test/Help.py b/test/Help.py
index 747fe597..693fd286 100644
--- a/test/Help.py
+++ b/test/Help.py
@@ -82,6 +82,69 @@ Use scons -H for help about command-line options.
test.run(arguments = '-h', stdout = expect)
+# Bug #2831 - append flag to Help doesn't wipe out addoptions and variables used together
+test.write('SConstruct', r"""
+
+AddOption('--debugging',
+ dest='debugging',
+ action='store_true',
+ default=False,
+ metavar='BDEBUGGING',
+ help='Compile with debugging symbols')
+
+vars = Variables()
+vars.Add(ListVariable('buildmod', 'List of modules to build', 'none',
+ ['python']))
+
+env = Environment()
+
+Help(vars.GenerateHelpText(env),append=True)
+""")
+
+expect = ".*--debugging.*Compile with debugging symbols.*buildmod: List of modules to build.*"
+
+test.run(arguments = '-h', stdout = expect, match=TestSCons.match_re_dotall)
+
+
+# Bug 2831
+# This test checks to verify that append=False doesn't include anything
+# but the expected help for the specified Variable()
+
+test.write('SConstruct', r"""
+
+AddOption('--debugging',
+ dest='debugging',
+ action='store_true',
+ default=False,
+ metavar='BDEBUGGING',
+ help='Compile with debugging symbols')
+
+vars = Variables()
+vars.Add(ListVariable('buildmod', 'List of modules to build', 'none',
+ ['python']))
+
+env = Environment()
+
+Help(vars.GenerateHelpText(env),append=False)
+""")
+
+expect = """\
+scons: Reading SConscript files ...
+scons: done reading SConscript files.
+
+buildmod: List of modules to build
+ (all|none|comma-separated list of names)
+ allowed names: python
+ default: none
+ actual: None
+
+Use scons -H for help about command-line options.
+"""
+
+test.run(arguments = '-h', stdout = expect)
+
+
+
test.pass_test()
# Local Variables:
diff --git a/test/LINK/SHLIBVERSIONFLAGS.py b/test/LINK/SHLIBVERSIONFLAGS.py
new file mode 100644
index 00000000..d8fd2e65
--- /dev/null
+++ b/test/LINK/SHLIBVERSIONFLAGS.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+#
+# __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 os
+import re
+
+import TestSCons
+import SCons.Platform
+import SCons.Defaults
+
+linkers = [ 'gnulink', 'cyglink', 'sunlink' ]
+
+foo_c_src = "void foo() {}\n"
+
+env = SCons.Defaults.DefaultEnvironment()
+platform = SCons.Platform.platform_default()
+tool_list = SCons.Platform.DefaultToolList(platform, env)
+
+test = TestSCons.TestSCons()
+test.write('foo.c', foo_c_src)
+test.write('SConstruct', "SharedLibrary('foo','foo.c',SHLIBVERSION='1.2.3')\n")
+
+if 'gnulink' in tool_list:
+ test.run(stdout = r".+ -Wl,-Bsymbolic -Wl,-soname=libfoo.so.1( .+)+", match = TestSCons.match_re_dotall)
+ test.run(arguments = ['-c'])
+elif 'sunlink' in tool_list:
+ test.run(stdout = r".+ -h libfoo.so.1( .+)+", match = TestSCons.match_re_dotall)
+ test.run(arguments = ['-c'])
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/LINK/VersionedLib-VariantDir.py b/test/LINK/VersionedLib-VariantDir.py
new file mode 100644
index 00000000..0a631b03
--- /dev/null
+++ b/test/LINK/VersionedLib-VariantDir.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+#
+# __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__"
+
+"""
+Ensure that SharedLibrary builder with SHLIBVERSION set works with VariantDir.
+"""
+
+import TestSCons
+import os
+import sys
+
+import SCons.Platform
+import SCons.Defaults
+
+env = SCons.Defaults.DefaultEnvironment()
+platform = SCons.Platform.platform_default()
+tool_list = SCons.Platform.DefaultToolList(platform, env)
+
+test = TestSCons.TestSCons()
+
+test.subdir(['src'])
+test.subdir(['src','lib'])
+test.subdir(['src','bin'])
+
+test.write(['src','lib','foo.c'], """
+#if _WIN32
+__declspec(dllexport)
+#endif
+int foo() { return 0; }
+""")
+
+test.write(['src','bin','main.c'], """
+#if _WIN32
+__declspec(dllimport)
+#endif
+int foo();
+int main()
+{
+ return foo();
+}
+""")
+
+test.write('SConstruct', """
+env = Environment()
+variant = { 'variant_dir' : 'build',
+ 'src_dir' : 'src',
+ 'duplicate' : 0,
+ 'exports' : { 'env' : env } }
+SConscript('src/lib/SConscript', **variant)
+SConscript('src/bin/SConscript', **variant)
+""")
+
+test.write(['src','lib','SConscript'], """
+Import('env')
+env.SharedLibrary('foo', 'foo.c', SHLIBVERSION = '0.1.2')
+""" )
+
+test.write(['src','bin','SConscript'], """
+Import('env')
+env.Program('main.c', LIBS=['foo'], LIBPATH=['../lib'])
+""")
+
+test.run(arguments = ['--tree=all'])
+
+if platform == 'cygwin' or platform == 'win32':
+ # PATH is used to search for *.dll libraries on windows
+ path = os.environ.get('PATH','')
+ if path: path = path + os.pathsep
+ path = path + test.workpath('build/lib')
+ os.environ['PATH'] = path
+
+if os.name == 'posix':
+ os.environ['LD_LIBRARY_PATH'] = test.workpath('build/lib')
+if sys.platform.find('irix') != -1:
+ os.environ['LD_LIBRARYN32_PATH'] = test.workpath('build/lib')
+
+test.run(program = test.workpath('build/bin/main'))
+
+if 'gnulink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ ]
+ obj = 'foo.os'
+elif 'applelink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.dylib',
+ 'libfoo.0.1.2.dylib',
+ ]
+ obj = 'foo.os'
+elif 'cyglink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'cygfoo-0-1-2.dll',
+ 'libfoo-0-1-2.dll.a',
+ 'libfoo.dll.a',
+ ]
+ obj = 'foo.os'
+elif 'mslink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'foo.dll',
+ 'foo.lib',
+ ]
+ obj = 'foo.obj'
+elif 'sunlink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ ]
+ obj = 'so_foo.os'
+else:
+ # All (?) the files we expect will get created in the current directory
+ files= [
+ 'libfoo.so',
+ ]
+ obj = 'foo.os'
+
+test.must_exist([ 'build', 'lib', obj ])
+for f in files:
+ test.must_exist([ 'build', 'lib', f ])
+
+test.run(arguments = ['-c'])
+
+test.must_not_exist([ 'build', 'lib', obj ])
+for f in files:
+ test.must_not_exist([ 'build', 'lib', f ])
+
+test.must_exist(['src', 'lib', 'foo.c'])
+test.must_exist(['SConstruct'])
+test.must_exist(['src', 'lib', 'SConscript'])
+test.must_exist(['src', 'bin', 'SConscript'])
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/LINK/VersionedLib-j2.py b/test/LINK/VersionedLib-j2.py
new file mode 100644
index 00000000..249b54f8
--- /dev/null
+++ b/test/LINK/VersionedLib-j2.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+#
+# __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__"
+
+"""
+Ensure that SharedLibrary builder works with SHLIBVERSION and -j2.
+This is regression test for:
+http://article.gmane.org/gmane.comp.programming.tools.scons.user/27049
+"""
+
+import TestSCons
+import os
+import sys
+
+import SCons.Platform
+import SCons.Defaults
+
+test = TestSCons.TestSCons()
+
+test.write('foo.c', """
+#if _WIN32
+__declspec(dllexport)
+#endif
+int foo() { return 0; }
+""")
+
+
+test.write('main.c', """
+#if _WIN32
+__declspec(dllimport)
+#endif
+int foo();
+int main() { return foo(); }
+""")
+
+test.write('SConstruct', """
+env = Environment()
+env.AppendUnique(LIBPATH = ['.'])
+env.Program('main.c', LIBS = ['foo'])
+env.SharedLibrary('foo', 'foo.c', SHLIBVERSION = '0.1.2')
+""")
+
+test.run(arguments = ['-j 2', '--tree=all'])
+
+env = SCons.Defaults.DefaultEnvironment()
+platform = SCons.Platform.platform_default()
+tool_list = SCons.Platform.DefaultToolList(platform, env)
+
+if platform == 'cygwin':
+ # PATH is used to search for *.dll librarier (cygfoo-0-2-1.dll in our case)
+ path = os.environ.get('PATH','')
+ if path: path = path + os.pathsep
+ path = path + test.workpath('.')
+ os.environ['PATH'] = path
+
+if os.name == 'posix':
+ os.environ['LD_LIBRARY_PATH'] = test.workpath('.')
+if sys.platform.find('irix') != -1:
+ os.environ['LD_LIBRARYN32_PATH'] = test.workpath('.')
+
+test.run(program = test.workpath('main'))
+
+test.run(arguments = ['-c'])
+
+platform = SCons.Platform.platform_default()
+
+if 'gnulink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ 'foo.os',
+ ]
+elif 'applelink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.dylib',
+ 'libfoo.0.1.2.dylib',
+ 'foo.os',
+ ]
+elif 'cyglink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'cygfoo-0-1-2.dll',
+ 'libfoo-0-1-2.dll.a',
+ 'libfoo.dll.a',
+ 'foo.os',
+ ]
+elif 'mslink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'foo.dll',
+ 'foo.lib',
+ 'foo.obj',
+ ]
+elif 'sunlink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ 'so_foo.os',
+ ]
+else:
+ # All (?) the files we expect will get created in the current directory
+ files= [
+ 'libfoo.so',
+ 'foo.os']
+
+for f in files:
+ test.must_not_exist([ f])
+
+test.must_exist(['main.c'])
+test.must_exist(['foo.c'])
+test.must_exist(['SConstruct'])
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/LINK/VersionedLib-subdir.py b/test/LINK/VersionedLib-subdir.py
new file mode 100644
index 00000000..a2e141b2
--- /dev/null
+++ b/test/LINK/VersionedLib-subdir.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+#
+# __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__"
+
+"""
+Ensure that SharedLibrary builder with SHLIBVERSION='0.1.2' can build its target
+in a subdirectory containing .so.0.1.2 in name.
+
+This is regression test for issue mentioned in:
+http://thread.gmane.org/gmane.comp.programming.tools.scons.user/27081
+"""
+
+import TestSCons
+import os
+import sys
+
+import SCons.Platform
+import SCons.Defaults
+
+test = TestSCons.TestSCons()
+
+test.write('foo.c', """
+#if _WIN32
+__declspec(dllexport)
+#endif
+int foo() { return 0; }
+""")
+
+test.write('main.c', """
+#if _WIN32
+__declspec(dllimport)
+#endif
+int foo();
+int main()
+{
+ return foo();
+}
+""")
+
+env = SCons.Defaults.DefaultEnvironment()
+platform = SCons.Platform.platform_default()
+tool_list = SCons.Platform.DefaultToolList(platform, env)
+
+if 'applelink' in tool_list:
+ subdir = 'blah.0.1.2.dylib.blah'
+elif 'cyglink' in tool_list:
+ subdir = 'blah-0-1-2.dll.a.blah'
+else:
+ subdir = 'blah.so.0.1.2.blah'
+
+test.write('SConstruct', """
+env = Environment()
+env.AppendUnique(LIBPATH = [ '%s' ])
+env.SharedLibrary('%s/foo', 'foo.c', SHLIBVERSION = '0.1.2')
+env.Program('main.c', LIBS=['foo'])
+""" % (subdir,subdir))
+
+test.run(arguments = ['--tree=all'])
+
+if platform == 'cygwin' or platform == 'win32':
+ # PATH is used to search for *.dll libraries on windows
+ path = os.environ.get('PATH','')
+ if path: path = path + os.pathsep
+ path = path + test.workpath(subdir)
+ os.environ['PATH'] = path
+
+if os.name == 'posix':
+ os.environ['LD_LIBRARY_PATH'] = subdir
+if sys.platform.find('irix') != -1:
+ os.environ['LD_LIBRARYN32_PATH'] = subdir
+
+test.run(program = test.workpath('main'))
+
+if 'gnulink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ ]
+ obj = 'foo.os'
+elif 'applelink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.dylib',
+ 'libfoo.0.1.2.dylib',
+ ]
+ obj = 'foo.os'
+elif 'cyglink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'cygfoo-0-1-2.dll',
+ 'libfoo-0-1-2.dll.a',
+ 'libfoo.dll.a',
+ ]
+ obj = 'foo.os'
+elif 'mslink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'foo.dll',
+ 'foo.lib',
+ ]
+ obj = 'foo.obj'
+elif 'sunlink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ files = [
+ 'libfoo.so',
+ 'libfoo.so.0',
+ 'libfoo.so.0.1.2',
+ ]
+ obj = 'so_foo.os'
+else:
+ # All (?) the files we expect will get created in the current directory
+ files= [
+ 'libfoo.so',
+ ]
+ obj = 'foo.os'
+
+test.must_exist([ obj ])
+for f in files:
+ test.must_exist([ subdir, f ])
+
+test.run(arguments = ['-c'])
+
+test.must_not_exist([ obj ])
+for f in files:
+ test.must_not_exist([ subdir, f ])
+
+test.must_exist(['foo.c'])
+test.must_exist(['SConstruct'])
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/LINK/VersionedLib.py b/test/LINK/VersionedLib.py
index a2345d6e..3f4a912c 100644
--- a/test/LINK/VersionedLib.py
+++ b/test/LINK/VersionedLib.py
@@ -29,131 +29,253 @@ import sys
import TestSCons
import SCons.Platform
+import SCons.Defaults
-_exe = TestSCons._exe
+env = SCons.Defaults.DefaultEnvironment()
+platform = SCons.Platform.platform_default()
+tool_list = SCons.Platform.DefaultToolList(platform, env)
-test = TestSCons.TestSCons()
+if 'gnulink' in tool_list:
+ test_plan = [
+ {
+ 'libversion' : '2',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2') ],
+ },
+ {
+ 'libversion' : '2.5',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5'), ('libtest.so.2', 'libtest.so.2.5') ],
+ },
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5.4'), ('libtest.so.2', 'libtest.so.2.5.4') ],
+ },
+ {
+ 'libversion' : '2.5.4.7.8',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4.7.8', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4.7.8' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5.4.7.8'), ('libtest.so.2', 'libtest.so.2.5.4.7.8') ],
+ },
+ {
+ 'libversion' : 'aabf114f',
+ 'files' : [ 'libtest.so', 'libtest.so.aabf114f', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.aabf114f' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.aabf114f') ],
+ },
+ {
+ 'libversion' : '2.dfffa11',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.dfffa11', 'test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.dfffa11' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.dfffa11'), ('libtest.so.2', 'libtest.so.2.dfffa11') ],
+ },
+ ]
+elif 'applelink' in tool_list:
+ # All (?) the files we expect will get created in the current directory
+ test_plan = [
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'libtest.dylib', 'libtest.2.5.4.dylib', 'test.os' ],
+ 'instfiles' : [ 'libtest.dylib', 'libtest.2.5.4.dylib' ],
+ 'symlinks' : [],
+ },
+ ]
+elif 'cyglink' in tool_list:
+ test_plan = [
+ {
+ 'libversion' : '2',
+ 'files' : [ 'cygtest-2.dll', 'libtest-2.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-2.dll', 'libtest-2.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-2.dll.a') ],
+ },
+ {
+ 'libversion' : '2.5',
+ 'files' : [ 'cygtest-2-5.dll', 'libtest-2-5.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-2-5.dll', 'libtest-2-5.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-2-5.dll.a') ],
+ },
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'cygtest-2-5-4.dll', 'libtest-2-5-4.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-2-5-4.dll', 'libtest-2-5-4.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-2-5-4.dll.a') ],
+ },
+ {
+ 'libversion' : '2.5.4.7.8',
+ 'files' : [ 'cygtest-2-5-4-7-8.dll', 'libtest-2-5-4-7-8.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-2-5-4-7-8.dll', 'libtest-2-5-4-7-8.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-2-5-4-7-8.dll.a') ],
+ },
+ {
+ 'libversion' : 'aabf114f',
+ 'files' : [ 'cygtest-aabf114f.dll', 'libtest-aabf114f.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-aabf114f.dll', 'libtest-aabf114f.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-aabf114f.dll.a') ],
+ },
+ {
+ 'libversion' : '2.dfffa11',
+ 'files' : [ 'cygtest-2-dfffa11.dll', 'libtest-2-dfffa11.dll.a', 'libtest.dll.a', 'test.os' ],
+ 'instfiles' : [ 'cygtest-2-dfffa11.dll', 'libtest-2-dfffa11.dll.a', 'libtest.dll.a' ],
+ 'symlinks' : [ ('libtest.dll.a', 'libtest-2-dfffa11.dll.a') ],
+ },
+ ]
+elif 'mslink' in tool_list:
+ test_plan = [
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'test.dll', 'test.lib', 'test.obj' ],
+ 'instfiles' : [ 'test.dll', 'test.lib' ],
+ 'symlinks' : [],
+ },
+ ]
+elif 'sunlink' in tool_list:
+ test_plan = [
+ {
+ 'libversion' : '2',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2') ],
+ },
+ {
+ 'libversion' : '2.5',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5'), ('libtest.so.2', 'libtest.so.2.5') ],
+ },
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5.4'), ('libtest.so.2', 'libtest.so.2.5.4') ],
+ },
+ {
+ 'libversion' : '2.5.4.7.8',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4.7.8', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.5.4.7.8' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.5.4.7.8'), ('libtest.so.2', 'libtest.so.2.5.4.7.8') ],
+ },
+ {
+ 'libversion' : 'aabf114f',
+ 'files' : [ 'libtest.so', 'libtest.so.aabf114f', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.aabf114f' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.aabf114f') ],
+ },
+ {
+ 'libversion' : '2.dfffa11',
+ 'files' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.dfffa11', 'so_test.os' ],
+ 'instfiles' : [ 'libtest.so', 'libtest.so.2', 'libtest.so.2.dfffa11' ],
+ 'symlinks' : [ ('libtest.so', 'libtest.so.2.dfffa11'), ('libtest.so.2', 'libtest.so.2.dfffa11') ],
+ },
+ ]
+else:
+ test_plan = [
+ {
+ 'libversion' : '2.5.4',
+ 'files' : [ 'libtest.so', 'test.os' ],
+ 'instfiles' : [ ],
+ },
+ ]
-test.write('SConstruct', """\
-import os
-env = Environment()
-objs = env.SharedObject('test.c')
-mylib = env.SharedLibrary('test', objs, SHLIBVERSION = '2.5.4')
-env.Program(source=['testapp.c',mylib])
-env.Program(target=['testapp2'],source=['testapp.c','libtest.dylib'])
-instnode = env.InstallVersionedLib("#/installtest",mylib)
-env.Default(instnode)
-""")
+test_c_src = """\
+#if _WIN32
+__declspec(dllexport)
+#endif
+int testlib(int n) { return n+1 ; }
+"""
-test.write('test.c', """\
+test_c_src2 = """\
#if _WIN32
__declspec(dllexport)
#endif
-int testlib(int n)
-{
-return n+1 ;
-}
-""")
+int testlib(int n) { return n+11 ; }
+"""
-test.write('testapp.c', """\
+testapp_c_src = """\
+#if _WIN32
+__declspec(dllimport)
+#endif
+int testlib(int n);
#include <stdio.h>
int main(int argc, char **argv)
{
int itest ;
itest = testlib(2) ;
-printf("results: testlib(2) = %d\n",itest) ;
+printf("results: testlib(2) = %d\\n",itest) ;
return 0 ;
}
-""")
+"""
-platform = SCons.Platform.platform_default()
+for t in test_plan:
+ test = TestSCons.TestSCons()
-test.run()
+ libversion = t['libversion']
+ files = t['files']
+ symlinks = t['symlinks']
+ instfiles = t['instfiles']
-if platform == 'posix':
- # All (?) the files we expect will get created in the current directory
- files = [
- 'libtest.so',
- 'libtest.so.2',
- 'libtest.so.2.5.4',
- 'test.os',
- ]
- # All (?) the files we expect will get created in the 'installtest' directory
- instfiles = [
- 'libtest.so',
- 'libtest.so.2',
- 'libtest.so.2.5.4',
- ]
-elif platform == 'darwin':
- # All (?) the files we expect will get created in the current directory
- files = [
- 'libtest.dylib',
- 'libtest.2.5.4.dylib',
- 'test.os',
- ]
- # All (?) the files we expect will get created in the 'installtest' directory
- instfiles = [
- 'libtest.dylib',
- 'libtest.2.5.4.dylib',
- ]
-elif platform == 'cygwin':
- # All (?) the files we expect will get created in the current directory
- files = [
- 'cygtest-2-5-4.dll',
- 'libtest-2-5-4.dll.a',
- 'test.os',
- ]
- # All (?) the files we expect will get created in the 'installtest' directory
- instfiles = [
- 'cygtest-2-5-4.dll',
- 'libtest-2-5-4.dll.a',
- ]
-elif platform == 'win32':
- # All (?) the files we expect will get created in the current directory
- files = [
- 'test.dll',
- 'test.lib',
- 'test.obj',
- ]
- # All (?) the files we expect will get created in the 'installtest' directory
- instfiles = [
- 'test.dll',
- 'test.lib',
- ]
-else:
- # All (?) the files we expect will get created in the current directory
- files= [
- 'libtest.so',
- 'test.os']
- # All (?) the files we expect will get created in the 'installtest' directory
- instfiles = []
-
-for f in files:
- test.must_exist([ f])
-for f in instfiles:
- test.must_exist(['installtest', f])
-
-# modify test.c and make sure it can recompile when links already exist
-test.write('test.c', """\
-#if _WIN32
-__declspec(dllexport)
-#endif
-int testlib(int n)
-{
-return n+11 ;
-}
-""")
+ test.write('SConstruct', """\
+import os
+env = Environment()
+objs = env.SharedObject('test.c')
+mylib = env.SharedLibrary('test', objs, SHLIBVERSION = '%s')
+env.Program('testapp1.c', LIBS = mylib, LIBPATH='.')
+env.Program('testapp2.c', LIBS = ['test'], LIBPATH='.')
+instnode = env.InstallVersionedLib("#/installtest",mylib)
+env.Default(instnode)
+
+# Extra test to ensure that InstallVersionedLib can be called from the DefaultEnvironment
+# Ensures orthogonality where InstallVersionedLib wasn't previously available: SCons gave NameError.
+instnode = InstallVersionedLib("defaultenv-installtest",mylib)
+Default(instnode)
+
+""" % libversion)
+
+ test.write('test.c', test_c_src)
+ test.write('testapp1.c', testapp_c_src)
+ test.write('testapp2.c', testapp_c_src)
+
+ test.run(arguments = ['--tree=all'])
+
+ for f in files:
+ test.must_exist([ f])
+ for f in instfiles:
+ test.must_exist(['installtest', f])
+ test.must_exist(['defaultenv-installtest', f])
+
+ wrong_symlinks = []
+ for (linkname,expected) in symlinks:
+ try:
+ endpoint = os.readlink(linkname)
+ except OSError, err:
+ print "%s (expected symlink %r -> %r)" % (err, linkname, expected)
+ wrong_symlinks.append(linkname)
+ else:
+ if endpoint != expected:
+ print "Wrong symlink: %r -> %r (expected symlink: %r -> %r)" % (linkname, endpoint, linkname, expected)
+ wrong_symlinks.append(linkname)
+
+ if wrong_symlinks:
+ test.fail_test(wrong_symlinks)
+
+ # modify test.c and make sure it can recompile when links already exist
+ test.write('test.c', test_c_src2)
+
+ test.run()
-test.run()
+ test.run(arguments = ['-c'])
-test.run(arguments = '-c')
+ for f in files:
+ test.must_not_exist([ f])
-for f in files:
- test.must_not_exist([ f])
-for f in instfiles:
- test.must_not_exist(['installtest', f])
+ for f in instfiles:
+ test.must_not_exist(['installtest', f])
+ test.must_not_exist(['defaultenv-installtest', f])
test.pass_test()
diff --git a/test/Script-import.py b/test/Script-import.py
index 98ae2714..504de0ef 100644
--- a/test/Script-import.py
+++ b/test/Script-import.py
@@ -62,7 +62,6 @@ SCons.Script.CleanTask
SCons.Script.QuestionTask
old_SCons_Script_variables = [
- 'PrintHelp',
'OptParser',
'keep_going_on_error',
'print_explanations',
diff --git a/test/TEX/variant_dir_newglossary.py b/test/TEX/variant_dir_newglossary.py
index 8604270c..5a28ed48 100644
--- a/test/TEX/variant_dir_newglossary.py
+++ b/test/TEX/variant_dir_newglossary.py
@@ -25,7 +25,7 @@
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
"""
-Validate the use of \newglossary in TeX source files in conjuction
+Validate the use of \newglossary in TeX source files in conjunction
with variant_dir.
Test configuration contributed by Kendrick Boyd.
diff --git a/test/packaging/guess-package-name.py b/test/packaging/guess-package-name.py
index 9c85b9a0..33c33294 100644
--- a/test/packaging/guess-package-name.py
+++ b/test/packaging/guess-package-name.py
@@ -86,7 +86,7 @@ test.run(stderr = None)
test.must_exist( 'src.tar.gz' )
#
-# TEST: default package name creation with overriden packager.
+# TEST: default package name creation with overridden packager.
#
test.write('SConstruct', """
diff --git a/test/packaging/msi/explicit-target.py b/test/packaging/msi/explicit-target.py
index bc786eef..85bfa854 100644
--- a/test/packaging/msi/explicit-target.py
+++ b/test/packaging/msi/explicit-target.py
@@ -26,7 +26,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
"""
Test the ability to use a explicit target package name and the use
-of FindInstalledFiles() in conjuction with .msi packages.
+of FindInstalledFiles() in conjunction with .msi packages.
"""
import TestSCons