From 2209d1b9a664b2c33d788311add3f5bf7d6caf8c Mon Sep 17 00:00:00 2001 From: Manuel Francisco Naranjo Date: Mon, 3 Jun 2013 12:53:17 -0300 Subject: Allow Literal objects to be compared among each others. This small change allows Literal objects to be compared, so that calls like for example AppendUnique only append one instance when string compares to True instead of duplicated values. --- src/engine/SCons/Subst.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/engine/SCons/Subst.py b/src/engine/SCons/Subst.py index 98097dc..318d7d9 100644 --- a/src/engine/SCons/Subst.py +++ b/src/engine/SCons/Subst.py @@ -78,6 +78,14 @@ class Literal(object): def is_literal(self): return 1 + def __eq__(self, other): + if not isinstance(other, Literal): + return False + return self.lstr == other.lstr + + def __neq__(self, other): + return not self.__eq__(other) + class SpecialAttrWrapper(object): """This is a wrapper for what we call a 'Node special attribute.' This is any of the attributes of a Node that we can reference from @@ -172,7 +180,7 @@ class NLWrapper(object): In practice, this might be a wash performance-wise, but it's a little cleaner conceptually... """ - + def __init__(self, list, func): self.list = list self.func = func @@ -190,7 +198,7 @@ class NLWrapper(object): self._create_nodelist = self._return_nodelist return self.nodelist _create_nodelist = _gen_nodelist - + class Targets_or_Sources(collections.UserList): """A class that implements $TARGETS or $SOURCES expansions by in turn @@ -451,7 +459,7 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={ raise_exception(NameError(key), lvars['TARGETS'], s) else: return '' - + # Before re-expanding the result, handle # recursive expansion by copying the local # variable dictionary and overwriting a null -- cgit v0.12 From b20c2218feb24b73a3d985b1f8121e601e930f45 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sun, 29 Sep 2013 15:50:32 -0400 Subject: Added tests for Literal object comparison, and updated CHANGES.txt. --- src/CHANGES.txt | 4 ++++ src/engine/SCons/EnvironmentTests.py | 8 +++++++- src/engine/SCons/SubstTests.py | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index e80a161..dd6a717 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,10 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Manuel Francisco Naranjo: + - Allow Subst.Literal string objects to be compared with each other, + so they work better in AddUnique() and Remove(). + From David Rothenberger: - Added cyglink linker that uses Cygwin naming conventions for shared libraries and automatically generates import libraries. diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index 45cf876..db788dc 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -1682,6 +1682,8 @@ def exists(env): CCC1 = '', CCC2 = '', DDD1 = ['a', 'b', 'c']) + env['LL1'] = [env.Literal('a literal'), env.Literal('b literal')] + env['LL2'] = [env.Literal('c literal'), env.Literal('b literal')] env.AppendUnique(AAA1 = 'a1', AAA2 = ['a2'], AAA3 = ['a3', 'b', 'c', 'c', 'b', 'a3'], # ignore dups @@ -1694,7 +1696,9 @@ def exists(env): BBB5 = ['b5.new'], CCC1 = 'c1', CCC2 = ['c2'], - DDD1 = 'b') + DDD1 = 'b', + LL1 = env.Literal('a literal'), + LL2 = env.Literal('a literal')) assert env['AAA1'] == 'a1a1', env['AAA1'] assert env['AAA2'] == ['a2'], env['AAA2'] @@ -1709,6 +1713,8 @@ def exists(env): assert env['CCC1'] == 'c1', env['CCC1'] assert env['CCC2'] == ['c2'], env['CCC2'] assert env['DDD1'] == ['a', 'b', 'c'], env['DDD1'] + assert env['LL1'] == [env.Literal('a literal'), env.Literal('b literal')], env['LL1'] + assert env['LL2'] == [env.Literal('c literal'), env.Literal('b literal'), env.Literal('a literal')], [str(x) for x in env['LL2']] env.AppendUnique(DDD1 = 'b', delete_existing=1) assert env['DDD1'] == ['a', 'c', 'b'], env['DDD1'] # b moves to end diff --git a/src/engine/SCons/SubstTests.py b/src/engine/SCons/SubstTests.py index 420fd73..ee9f3db 100644 --- a/src/engine/SCons/SubstTests.py +++ b/src/engine/SCons/SubstTests.py @@ -1147,6 +1147,11 @@ class LiteralTestCase(unittest.TestCase): cmd_list = escape_list(cmd_list[0], escape_func) assert cmd_list == ['BAZ', '**$BAR**'], cmd_list + def test_LiteralEqualsTest(self): + """Test that Literals compare for equality properly""" + assert Literal('a literal') == Literal('a literal') + assert Literal('a literal') != Literal('b literal') + class SpecialAttrWrapperTestCase(unittest.TestCase): def test_SpecialAttrWrapper(self): """Test the SpecialAttrWrapper() function.""" -- cgit v0.12 From 6ac04c37e028312fa9daaf03a880153b6f0a29af Mon Sep 17 00:00:00 2001 From: antonio Date: Sat, 15 Jun 2013 17:33:18 +0100 Subject: fix for visual studio expres on win7 x86_64 (transplanted from d7e892b4978439c6374d090912f13afa13e8daf8) --- src/engine/SCons/Tool/MSCommon/vc.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py index 1266ee8..818475c 100644 --- a/src/engine/SCons/Tool/MSCommon/vc.py +++ b/src/engine/SCons/Tool/MSCommon/vc.py @@ -258,13 +258,14 @@ def find_batch_file(env,msvc_version,host_arch,target_arch): installed_sdks=get_installed_sdks() for _sdk in installed_sdks: - sdk_bat_file=_sdk.get_sdk_vc_script(host_arch,target_arch) - sdk_bat_file_path=os.path.join(pdir,sdk_bat_file) - debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) - if os.path.exists(sdk_bat_file_path): + sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch) + if sdk_bat_file and os.path.join(pdir,sdk_bat_file): + sdk_bat_file_path = os.path.join(pdir,sdk_bat_file) + debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) + return (batfilename,sdk_bat_file_path) else: - debug("vc.py:find_batch_file() not found:%s"%sdk_bat_file_path) + debug("vc.py:find_batch_file() not found:%s"%_sdk) else: return (batfilename,None) -- cgit v0.12 From 7f6db37774dd41dec591f0a54eb99ba35d833419 Mon Sep 17 00:00:00 2001 From: antonio Date: Sat, 15 Jun 2013 18:39:51 +0100 Subject: fix missing file test (transplanted from 19a5828d1523a8308cf652d18eb1824e85d1c304) --- src/engine/SCons/Tool/MSCommon/vc.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py index 818475c..c970118 100644 --- a/src/engine/SCons/Tool/MSCommon/vc.py +++ b/src/engine/SCons/Tool/MSCommon/vc.py @@ -259,15 +259,15 @@ def find_batch_file(env,msvc_version,host_arch,target_arch): installed_sdks=get_installed_sdks() for _sdk in installed_sdks: sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch) - if sdk_bat_file and os.path.join(pdir,sdk_bat_file): + if not sdk_bat_file: + debug("vc.py:find_batch_file() not found:%s"%_sdk) + else: sdk_bat_file_path = os.path.join(pdir,sdk_bat_file) - debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) + if os.path.exists(sdk_bat_file_path): + debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) + return (batfilename,sdk_bat_file_path) + return (batfilename,None) - return (batfilename,sdk_bat_file_path) - else: - debug("vc.py:find_batch_file() not found:%s"%_sdk) - else: - return (batfilename,None) __INSTALLED_VCS_RUN = None -- cgit v0.12 From 25c535f2e5997defdca96a6e0c35a0143e824982 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Wed, 11 Sep 2013 22:44:33 +0200 Subject: - fix for #2916, "Issues with versioned SharedLibrary under OpenBSD" --- src/CHANGES.txt | 4 ++++ src/engine/SCons/Tool/__init__.py | 22 +++++++++++++++------- test/Libs/SharedLibrary.py | 13 +++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index e80a161..1afe71a 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,10 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Stefan Sperling: + - Fixed the setup of linker flags for a versioned SharedLibrary + under OpenBSD (#2916). + From David Rothenberger: - Added cyglink linker that uses Cygwin naming conventions for shared libraries and automatically generates import libraries. diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index b80d6e4..00413e5 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -257,6 +257,10 @@ def VersionShLibLinkNames(version, libname, env): print "VersionShLibLinkNames: linkname = ",linkname linknames.append(linkname) elif platform == 'posix': + 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 @@ -302,13 +306,17 @@ symlinks for the platform we are on""" if version: # set the shared library link flags if platform == 'posix': - 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,-Bsymbolic', '-Wl,-soname=%s' % soname ] - if Verbose: - print " soname ",soname,", shlink_flags ",shlink_flags + 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 == 'cygwin': shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,--out-implib,${TARGET.base}.a' ] diff --git a/test/Libs/SharedLibrary.py b/test/Libs/SharedLibrary.py index b7d1374..eac575c 100644 --- a/test/Libs/SharedLibrary.py +++ b/test/Libs/SharedLibrary.py @@ -60,6 +60,13 @@ obj = env.SharedObject('bar', 'foo.c') Default(env.Library(target = 'foo', source = obj)) """) +test.write('SConstructBaz', """ +env=Environment() +env['SHLIBVERSION'] = '1.0.0' +obj = env.SharedObject('baz', 'foo.c') +Default(env.SharedLibrary(target = 'baz', source = obj)) +""") + test.write('foo.c', r""" #include @@ -287,6 +294,12 @@ main(int argc, char *argv[]) test.run(program = test.workpath('progbar'), stdout = "f4.c\nprogbar.c\n") +if sys.platform.startswith('openbsd'): + # Make sure we don't link libraries with -Wl,-soname on OpenBSD. + test.run(arguments = '-f SConstructBaz') + for line in test.stdout().split('\n'): + test.fail_test(line.find('-Wl,-soname=libbaz.so') != -1) + test.pass_test() # Local Variables: -- cgit v0.12 From c5e4dcd21f66eb61f3a0699fc733991b3d16dfc0 Mon Sep 17 00:00:00 2001 From: Alexandre Feblot Date: Sun, 15 Sep 2013 16:35:03 +0200 Subject: Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 --- src/engine/SCons/Tool/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index b80d6e4..35885f9 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -356,7 +356,9 @@ symlinks for the platform we are on""" print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver) return result -ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None) +# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 : +# varlist=['$SHLINKCOM']: ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM +ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None, varlist=['SHLINKCOM']) def createSharedLibBuilder(env): """This is a utility function that creates the SharedLibrary -- cgit v0.12 From 088338d0ac7b7f4c5ae712c46d0ba8a95448ff9b Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Thu, 26 Sep 2013 18:01:53 +0100 Subject: Addition of warning if build doesn't build expected targets. Added option to runtest.py to stop on first error --- doc/man/scons.xml | 8 ++++++++ runtest.py | 38 +++++++++++++++++++++++++------------- src/engine/SCons/Node/__init__.py | 8 ++++++++ src/engine/SCons/Script/Main.py | 1 + src/engine/SCons/Warnings.py | 3 +++ 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/doc/man/scons.xml b/doc/man/scons.xml index 602bdbe..7036caf 100644 --- a/doc/man/scons.xml +++ b/doc/man/scons.xml @@ -1940,6 +1940,14 @@ These warnings are enabled by default. + --warn=target_not_build, --warn=no-target_not_built + +Enables or disables warnings about a build rule not building the + expected targets. These warnings are not currently enabled by default. + + + + -Y repository, --repository=repository, --srcdir=repository Search the specified repository for any input and target diff --git a/runtest.py b/runtest.py index 6beb4ba..2b7f7ce 100755 --- a/runtest.py +++ b/runtest.py @@ -58,6 +58,8 @@ # command line it will execute before # executing it. This suppresses that print. # +# --quit-on-failure Quit on any test failure +# # -s Short progress. Prints only the command line # and a percentage value, based on the total and # current number of tests. @@ -123,6 +125,7 @@ print_progress = 1 suppress_stdout = False suppress_stderr = False allow_pipe_files = True +quit_on_failure = False helpstr = """\ Usage: runtest.py [OPTIONS] [TEST ...] @@ -158,6 +161,7 @@ Options: --passed Summarize which tests passed. --qmtest Run using the QMTest harness (deprecated). -q, --quiet Don't print the test being executed. + --quit-on-failure Quit on any test failure -s, --short-progress Short progress, prints only the command line and a percentage value, based on the total and current number of tests. @@ -214,7 +218,9 @@ opts, args = getopt.getopt(args, "3b:def:hj:klnP:p:qsv:Xx:t", 'jobs=', 'list', 'no-exec', 'nopipefiles', 'package=', 'passed', 'python=', 'qmtest', - 'quiet', 'short-progress', 'time', + 'quiet', + 'quit-on-failure', + 'short-progress', 'time', 'version=', 'exec=', 'verbose=']) @@ -267,7 +273,9 @@ for o, a in opts: elif o in ['-q', '--quiet']: printcommand = 0 suppress_stdout = True - suppress_stderr = True + suppress_stderr = True + elif o in ['--quit-on-failure']: + quit_on_failure = True elif o in ['-s', '--short-progress']: print_progress = 1 suppress_stdout = True @@ -373,16 +381,16 @@ else: # Else, we catch the output of both pipes... if allow_pipe_files: # The subprocess.Popen() suffers from a well-known - # problem. Data for stdout/stderr is read into a + # problem. Data for stdout/stderr is read into a # memory buffer of fixed size, 65K which is not very much. # When it fills up, it simply stops letting the child process # write to it. The child will then sit and patiently wait to - # be able to write the rest of its output. Hang! + # be able to write the rest of its output. Hang! # In order to work around this, we follow a suggestion # by Anders Pearson in # http://http://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/ # and pass temp file objects to Popen() instead of the ubiquitous - # subprocess.PIPE. + # subprocess.PIPE. def spawn_it(command_args): # Create temporary files import tempfile @@ -395,7 +403,7 @@ else: shell=True) # ... and wait for it to finish. ret = p.wait() - + try: # Rewind to start of files tmp_stdout.seek(0) @@ -407,10 +415,10 @@ else: # Remove temp files by closing them tmp_stdout.close() tmp_stderr.close() - + # Return values return (spawned_stderr, spawned_stdout, ret) - + else: # We get here only if the user gave the '--nopipefiles' # option, meaning the "temp file" approach for @@ -419,9 +427,9 @@ else: # potential deadlock situation in the following code: # If the subprocess writes a lot of data to its stderr, # the pipe will fill up (nobody's reading it yet) and the - # subprocess will wait for someone to read it. + # subprocess will wait for someone to read it. # But the parent process is trying to read from stdin - # (but the subprocess isn't writing anything there). + # (but the subprocess isn't writing anything there). # Hence a deadlock. # Be dragons here! Better don't use this! def spawn_it(command_args): @@ -469,7 +477,7 @@ class PopenExecutor(Base): shell=True) # ... and wait for it to finish. self.status = p.wait() - + try: # Rewind to start of files tmp_stdout.seek(0) @@ -481,7 +489,7 @@ class PopenExecutor(Base): # Remove temp files by closing them tmp_stdout.close() tmp_stderr.close() - else: + else: def execute(self): p = subprocess.Popen(self.command_str, stdout=subprocess.PIPE, @@ -832,7 +840,7 @@ def run_test(t, io_lock, async=True): if head: os.environ['PYTHON_SCRIPT_DIR'] = head else: - os.environ['PYTHON_SCRIPT_DIR'] = '' + os.environ['PYTHON_SCRIPT_DIR'] = '' test_start_time = time_func() if execute_tests: t.execute() @@ -849,6 +857,10 @@ def run_test(t, io_lock, async=True): print_time_func("Test execution time: %.1f seconds\n", t.test_time) if io_lock: io_lock.release() + if quit_on_failure and t.status == 1: + print "Exiting due to error" + print t.status + sys.exit(1) class RunTest(threading.Thread): def __init__(self, queue, io_lock): diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 992284d..56e4694 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -57,6 +57,10 @@ from SCons.Debug import Trace def classname(obj): return str(obj.__class__).split('.')[-1] +# Set to false if we're doing a dry run. There's more than one of these +# little treats +do_store_info = True + # Node states # # These are in "priority" order, so that the maximum value for any @@ -385,6 +389,10 @@ class Node(object): self.clear() + if not self.exists() and do_store_info: + SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning, + "Cannot find target " + str(self) + " after building") + self.ninfo.update(self) def visited(self): diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 837c103..191c7b5 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -1083,6 +1083,7 @@ def _build_targets(fs, options, targets, target_top): SCons.Action.print_actions = not options.silent SCons.Action.execute_actions = not options.no_exec SCons.Node.FS.do_store_info = not options.no_exec + SCons.Node.do_store_info = not options.no_exec SCons.SConf.dryrun = options.no_exec if options.diskcheck: diff --git a/src/engine/SCons/Warnings.py b/src/engine/SCons/Warnings.py index a260c4a..ca6acee 100644 --- a/src/engine/SCons/Warnings.py +++ b/src/engine/SCons/Warnings.py @@ -42,6 +42,9 @@ class WarningOnByDefault(Warning): # NOTE: If you add a new warning class, add it to the man page, too! +class TargetNotBuiltWarning(Warning): # Should go to OnByDefault + pass + class CacheWriteErrorWarning(Warning): pass -- cgit v0.12 From 273277af17a828c7e9868da893e1512ea9f63e47 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Fri, 27 Sep 2013 09:38:13 +0100 Subject: Added test to verify warning works and doesn't trigger for -n or aliases --- test/warning-TargetNotBuiltWarning.py | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/warning-TargetNotBuiltWarning.py diff --git a/test/warning-TargetNotBuiltWarning.py b/test/warning-TargetNotBuiltWarning.py new file mode 100644 index 0000000..76fdc5c --- /dev/null +++ b/test/warning-TargetNotBuiltWarning.py @@ -0,0 +1,55 @@ +#!/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 TestSCons + +test = TestSCons.TestSCons() + +test.write('SConstruct', """ +foo = Command('foo.out', [], '@echo boo') +bill = Command('bill.out', [], Touch('$TARGET')) +Depends(bill, foo) +Alias('jim', bill) +""") + +test.run(arguments='-Q jim', stdout = 'boo\nTouch("bill.out")\n') + +test.run(arguments='-Q jim --warning=target-not-built', + stdout = "boo\nscons: `jim' is up to date.\n", + stderr = None) +test.must_contain_all_lines(test.stderr(), + 'scons: warning: Cannot find target foo.out after building') + +test.run(arguments='-Q jim --warning=target-not-built -n', + stdout = "scons: `jim' is up to date.\n") + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From c76073b8c0dfce959545d8aec1edf0ba09edbd1e Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sun, 29 Sep 2013 16:01:02 -0400 Subject: Updated src/CHANGES.txt for pull req #81. --- src/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index dd6a717..f4229be 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,9 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Antonio Cavallo: + - Improve error if Visual Studio bat file not found. + From Manuel Francisco Naranjo: - Allow Subst.Literal string objects to be compared with each other, so they work better in AddUnique() and Remove(). -- cgit v0.12 From 6ef70e36fef5d954a7de3e17a62d28c148506d58 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sun, 29 Sep 2013 19:21:35 -0400 Subject: Added test for bug 2909, pull req #86. --- src/CHANGES.txt | 3 ++ test/Libs/SharedLibrary-update-deps.py | 57 ++++++++++++++++++++++++++++++++++ test/Libs/bug2909/SConstruct | 3 ++ test/Libs/bug2909/SConstruct-libs | 3 ++ test/Libs/bug2909/lib.c | 1 + test/Libs/bug2909/main.c | 3 ++ 6 files changed, 70 insertions(+) create mode 100644 test/Libs/SharedLibrary-update-deps.py create mode 100644 test/Libs/bug2909/SConstruct create mode 100644 test/Libs/bug2909/SConstruct-libs create mode 100644 test/Libs/bug2909/lib.c create mode 100644 test/Libs/bug2909/main.c diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 1e91144..9fa8985 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,9 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Alexandre Feblot: + - Make sure SharedLibrary depends on all dependent libs (by depending on SHLINKCOM) + From Stefan Sperling: - Fixed the setup of linker flags for a versioned SharedLibrary under OpenBSD (#2916). diff --git a/test/Libs/SharedLibrary-update-deps.py b/test/Libs/SharedLibrary-update-deps.py new file mode 100644 index 0000000..24c5262 --- /dev/null +++ b/test/Libs/SharedLibrary-update-deps.py @@ -0,0 +1,57 @@ +#!/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__" + +""" +Test that SharedLibrary() updates when a different lib is linked, even if it has the same md5. +This is Tigris bug #2909. +""" + +import os.path +import TestSCons + +test = TestSCons.TestSCons() + +test.dir_fixture( "bug2909" ) + +# Build the sub-libs (don't care about details of this) +test.run(arguments='-f SConstruct-libs') +# This should build the main lib, using libfoo.so +test.run(arguments='libname=foo') +# This should rebuild the main lib, using libbar.so; +# it should NOT say it's already up to date. +test.run(arguments='libname=bar') +test.must_not_contain_any_line(test.stdout(), ["is up to date"]) +# Try it again, in reverse, to make sure: +test.run(arguments='libname=foo') +test.must_not_contain_any_line(test.stdout(), ["is up to date"]) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Libs/bug2909/SConstruct b/test/Libs/bug2909/SConstruct new file mode 100644 index 0000000..2c5440b --- /dev/null +++ b/test/Libs/bug2909/SConstruct @@ -0,0 +1,3 @@ +env=Environment() +libname=ARGUMENTS.get('libname', 'foo') +env.SharedLibrary('myshared', ['main.c'], LIBS=[libname], LIBPATH='.') \ No newline at end of file diff --git a/test/Libs/bug2909/SConstruct-libs b/test/Libs/bug2909/SConstruct-libs new file mode 100644 index 0000000..3f59f9c --- /dev/null +++ b/test/Libs/bug2909/SConstruct-libs @@ -0,0 +1,3 @@ +env=Environment() +libfoo = env.SharedLibrary('foo', 'lib.c') +env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo) \ No newline at end of file diff --git a/test/Libs/bug2909/lib.c b/test/Libs/bug2909/lib.c new file mode 100644 index 0000000..048f715 --- /dev/null +++ b/test/Libs/bug2909/lib.c @@ -0,0 +1 @@ +int i; diff --git a/test/Libs/bug2909/main.c b/test/Libs/bug2909/main.c new file mode 100644 index 0000000..3fe7d49 --- /dev/null +++ b/test/Libs/bug2909/main.c @@ -0,0 +1,3 @@ +void func() +{ +} -- cgit v0.12 From 43f296c7c2a350de0c59a442e566c165420803e3 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sun, 29 Sep 2013 20:14:11 -0400 Subject: From Bogdan Tenea: Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly. --- src/CHANGES.txt | 3 +++ src/engine/SCons/Node/FS.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 9fa8985..50a27dc 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,9 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Bogdan Tenea: + - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly. + From Alexandre Feblot: - Make sure SharedLibrary depends on all dependent libs (by depending on SHLINKCOM) diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index f31ca83..4381697 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -1841,7 +1841,7 @@ class Dir(Base): for entry in map(_my_normcase, entries): d[entry] = True self.on_disk_entries = d - if sys.platform == 'win32': + if sys.platform == 'win32' or sys.platform == 'cygwin': name = _my_normcase(name) result = d.get(name) if result is None: -- cgit v0.12 From 3e2d5a0f8df6fe132ff7cf6b405321a7ee64a14d Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 30 Sep 2013 10:42:46 +0100 Subject: Added Pseudo command to environment and tests. If a target is declared as Pseudo, it must NOT exist after the build rule is executed. --- src/engine/SCons/Environment.py | 34 +++++++++++-------- src/engine/SCons/EnvironmentTests.py | 31 ++++++++++++++--- src/engine/SCons/Node/NodeTests.py | 13 ++++++-- src/engine/SCons/Node/__init__.py | 16 ++++++--- src/engine/SCons/Script/Main.xml | 17 +++++++++- test/Pseudo.py | 65 ++++++++++++++++++++++++++++++++++++ 6 files changed, 152 insertions(+), 24 deletions(-) create mode 100644 test/Pseudo.py diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index 55a8206..28679c1 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -704,7 +704,7 @@ class SubstitutionEnvironment(object): # -symbolic (linker global binding) # -R dir (deprecated linker rpath) # IBM compilers may also accept -qframeworkdir=foo - + params = shlex.split(arg) append_next_arg_to = None # for multi-word args for arg in params: @@ -794,7 +794,7 @@ class SubstitutionEnvironment(object): append_next_arg_to = arg else: dict['CCFLAGS'].append(arg) - + for arg in flags: do_parse(arg) return dict @@ -858,7 +858,7 @@ class SubstitutionEnvironment(object): # def MergeShellPaths(self, args, prepend=1): # """ -# Merge the dict in args into the shell environment in env['ENV']. +# Merge the dict in args into the shell environment in env['ENV']. # Shell path elements are appended or prepended according to prepend. # Uses Pre/AppendENVPath, so it always appends or prepends uniquely. @@ -961,14 +961,14 @@ class Base(SubstitutionEnvironment): platform = SCons.Platform.Platform(platform) self._dict['PLATFORM'] = str(platform) platform(self) - + self._dict['HOST_OS'] = self._dict.get('HOST_OS',None) self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None) - + # Now set defaults for TARGET_{OS|ARCH} self._dict['TARGET_OS'] = self._dict.get('TARGET_OS',None) self._dict['TARGET_ARCH'] = self._dict.get('TARGET_ARCH',None) - + # Apply the passed-in and customizable variables to the # environment before calling the tools, because they may use @@ -1157,7 +1157,7 @@ class Base(SubstitutionEnvironment): # "continue" statements whenever we finish processing an item, # but Python 1.5.2 apparently doesn't let you use "continue" # within try:-except: blocks, so we have to nest our code. - try: + try: if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]): self._dict[key] = [self._dict[key]] orig = self._dict[key] @@ -1208,7 +1208,7 @@ class Base(SubstitutionEnvironment): orig = orig.items() orig += val self._dict[key] = orig - else: + else: for v in val: orig[v] = None else: @@ -1231,7 +1231,7 @@ class Base(SubstitutionEnvironment): path = str(self.fs.Dir(path)) return path - def AppendENVPath(self, name, newpath, envname = 'ENV', + def AppendENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep, delete_existing=1): """Append path elements to the path 'name' in the 'ENV' dictionary for this environment. Will only add any particular @@ -1289,7 +1289,7 @@ class Base(SubstitutionEnvironment): dk = dk.items() elif SCons.Util.is_String(dk): dk = [(dk,)] - else: + else: tmp = [] for i in dk: if SCons.Util.is_List(i): @@ -1334,7 +1334,7 @@ class Base(SubstitutionEnvironment): dk = filter(lambda x, val=val: x not in val, dk) self._dict[key] = dk + val else: - dk = [x for x in dk if x not in val] + dk = [x for x in dk if x not in val] self._dict[key] = dk + val else: # By elimination, val is not a list. Since dk is a @@ -1381,7 +1381,7 @@ class Base(SubstitutionEnvironment): builders = self._dict['BUILDERS'] except KeyError: pass - + clone = copy.copy(self) # BUILDERS is not safe to do a simple copy clone._dict = semi_deepcopy_dict(self._dict, ['BUILDERS']) @@ -1409,7 +1409,7 @@ class Base(SubstitutionEnvironment): apply_tools(clone, tools, toolpath) # apply them again in case the tools overwrote them - clone.Replace(**new) + clone.Replace(**new) # Finally, apply any flags to be merged in if parse_flags: clone.MergeFlags(parse_flags) @@ -2086,6 +2086,14 @@ class Base(SubstitutionEnvironment): t.set_precious() return tlist + def Pseudo(self, *targets): + tlist = [] + for t in targets: + tlist.extend(self.arg2nodes(t, self.fs.Entry)) + for t in tlist: + t.set_pseudo() + return tlist + def Repository(self, *dirs, **kw): dirs = self.arg2nodes(list(dirs), self.fs.Dir) self.fs.Repository(*dirs, **kw) diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index 45cf876..750266a 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -170,7 +170,7 @@ class TestEnvironmentFixture(object): single_source = 1) kw['BUILDERS'] = {'Object' : static_obj} static_obj.add_action('.cpp', 'fake action') - + env = Environment(*args, **kw) return env @@ -1716,7 +1716,7 @@ def exists(env): assert env['DDD1'] == ['c', 'a', 'b'], env['DDD1'] # a & b move to end env.AppendUnique(DDD1 = ['e','f', 'e'], delete_existing=1) assert env['DDD1'] == ['c', 'a', 'b', 'f', 'e'], env['DDD1'] # add last - + env['CLVar'] = CLVar([]) env.AppendUnique(CLVar = 'bar') result = env['CLVar'] @@ -2024,7 +2024,7 @@ def generate(env): try: save_command = [] - env.backtick = my_backtick(save_command, + env.backtick = my_backtick(save_command, "-I/usr/include/fum -I bar -X\n" + \ "-L/usr/fax -L foo -lxxx -l yyy " + \ "-Wa,-as -Wl,-link " + \ @@ -2369,7 +2369,7 @@ f5: \ env.PrependUnique(DDD1 = ['a','c'], delete_existing=1) assert env['DDD1'] == ['a', 'c', 'b'], env['DDD1'] # a & c move to front env.PrependUnique(DDD1 = ['d','e','d'], delete_existing=1) - assert env['DDD1'] == ['d', 'e', 'a', 'c', 'b'], env['DDD1'] + assert env['DDD1'] == ['d', 'e', 'a', 'c', 'b'], env['DDD1'] env['CLVar'] = CLVar([]) @@ -3119,6 +3119,29 @@ def generate(env): assert t[4].path == 'p_ggg' assert t[4].precious + def test_Pseudo(self): + """Test the Precious() method""" + env = self.TestEnvironment(FOO='ggg', BAR='hhh') + env.Dir('p_hhhb') + env.File('p_d') + t = env.Pseudo('p_a', 'p_${BAR}b', ['p_c', 'p_d'], 'p_$FOO') + + assert t[0].__class__.__name__ == 'Entry', t[0].__class__.__name__ + assert t[0].path == 'p_a' + assert t[0].pseudo + assert t[1].__class__.__name__ == 'Dir', t[1].__class__.__name__ + assert t[1].path == 'p_hhhb' + assert t[1].pseudo + assert t[2].__class__.__name__ == 'Entry', t[2].__class__.__name__ + assert t[2].path == 'p_c' + assert t[2].pseudo + assert t[3].__class__.__name__ == 'File', t[3].__class__.__name__ + assert t[3].path == 'p_d' + assert t[3].pseudo + assert t[4].__class__.__name__ == 'Entry', t[4].__class__.__name__ + assert t[4].path == 'p_ggg' + assert t[4].pseudo + def test_Repository(self): """Test the Repository() method.""" class MyFS(object): diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index a301654..d8fd0d6 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -693,6 +693,15 @@ class NodeTestCase(unittest.TestCase): node.set_precious(7) assert node.precious == 7 + def test_set_phony(self): + """Test setting a Node's phony value + """ + node = SCons.Node.Node() + node.set_phony() + assert node.phony + node.set_phony(False) + assert not node.phony + def test_exists(self): """Test evaluating whether a Node exists. """ @@ -954,7 +963,7 @@ class NodeTestCase(unittest.TestCase): self.source_scanner = scanner builder = Builder2(ts1) - + targets = builder([source]) s = targets[0].get_source_scanner(source) assert s is ts1, s @@ -967,7 +976,7 @@ class NodeTestCase(unittest.TestCase): builder = Builder1(env=Environment(SCANNERS = [ts3])) targets = builder([source]) - + s = targets[0].get_source_scanner(source) assert s is ts3, s diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 56e4694..28fbcf7 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -218,6 +218,7 @@ class Node(object): self.env = None self.state = no_state self.precious = None + self.pseudo = False self.noclean = 0 self.nocache = 0 self.cached = 0 # is this node pulled from cache? @@ -389,10 +390,13 @@ class Node(object): self.clear() - if not self.exists() and do_store_info: - SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning, - "Cannot find target " + str(self) + " after building") - + if self.pseudo: + if self.exists(): + raise SCons.Errors.UserError("Pseudo target " + str(self) + " must not exist") + else: + if not self.exists() and do_store_info: + SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning, + "Cannot find target " + str(self) + " after building") self.ninfo.update(self) def visited(self): @@ -796,6 +800,10 @@ class Node(object): """Set the Node's precious value.""" self.precious = precious + def set_pseudo(self, pseudo = True): + """Set the Node's precious value.""" + self.pseudo = pseudo + def set_noclean(self, noclean = 1): """Set the Node's noclean value.""" # Make sure noclean is an integer so the --debug=stree diff --git a/src/engine/SCons/Script/Main.xml b/src/engine/SCons/Script/Main.xml index b582e0d..99e066e 100644 --- a/src/engine/SCons/Script/Main.xml +++ b/src/engine/SCons/Script/Main.xml @@ -685,6 +685,21 @@ Multiple targets can be passed in to a single call to + + +(target, ...) + + + +Marks each given +target +as phony, indicating it should not be created by the build rule. If a +Phony target is created, this will cause an error. +Multiple targets can be passed in to a single call to +&f-Phony;. + + + (name, value) @@ -788,4 +803,4 @@ SetOption('max_drift', 1) - \ No newline at end of file + diff --git a/test/Pseudo.py b/test/Pseudo.py new file mode 100644 index 0000000..db3c30c --- /dev/null +++ b/test/Pseudo.py @@ -0,0 +1,65 @@ +#!/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 TestSCons + +test = TestSCons.TestSCons() + +# Firstly, build a pseudo target and make sure we get no warnings it +# doesn't exist under any circumstances +test.write('SConstruct', """ +env = Environment() +env.Pseudo(env.Command('foo.out', [], '@echo boo')) +""") + +test.run(arguments='-Q', stdout = 'boo\n') + +test.run(arguments='-Q --warning=target-not-built', stdout = "boo\n") + +# Now do the same thing again but create the target and check we get an +# error if it exists after the build +test.write('SConstruct', """ +env = Environment() +env.Pseudo(env.Command('foo.out', [], Touch('$TARGET'))) +""") + +test.run(arguments='-Q', stdout = 'Touch("foo.out")\n', stderr = None, + status = 2) +test.must_contain_all_lines(test.stderr(), + 'scons: *** Pseudo target foo.out must not exist') +test.run(arguments='-Q --warning=target-not-built', + stdout = 'Touch("foo.out")\n', + stderr = None, status = 2) +test.must_contain_all_lines(test.stderr(), + 'scons: *** Pseudo target foo.out must not exist') + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From 540e095b035ce7f581fd85136216be113cabb754 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 30 Sep 2013 13:42:07 +0100 Subject: Fixed wrong name in tests --- src/engine/SCons/Node/NodeTests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index d8fd0d6..620c09b 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -693,14 +693,14 @@ class NodeTestCase(unittest.TestCase): node.set_precious(7) assert node.precious == 7 - def test_set_phony(self): + def test_set_pseudo(self): """Test setting a Node's phony value """ node = SCons.Node.Node() - node.set_phony() - assert node.phony - node.set_phony(False) - assert not node.phony + node.set_pseudo() + assert node.pseudo + node.set_pseudo(False) + assert not node.pseudo def test_exists(self): """Test evaluating whether a Node exists. -- cgit v0.12 From e014d3bfc6e5d07666361e9d3071d12617e1e2d5 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 30 Sep 2013 14:42:13 +0100 Subject: Fixing test failures --- test/option/warn-dependency.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/option/warn-dependency.py b/test/option/warn-dependency.py index 95d8fed..ca0c2aa 100644 --- a/test/option/warn-dependency.py +++ b/test/option/warn-dependency.py @@ -43,6 +43,7 @@ env=Environment() env['BUILDERS']['test'] = Builder(action=build, source_scanner=SCons.Defaults.ObjSourceScan) env.test(target='foo', source='foo.c') +env.Pseudo('foo') """) test.write("foo.c",""" -- cgit v0.12 From 01f45ca84f2b1c9f2b8113e09a270503ab8581e0 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 30 Sep 2013 15:18:50 +0100 Subject: Allow multiple options with --debug --- src/engine/SCons/Script/SConsOptions.py | 40 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/engine/SCons/Script/SConsOptions.py b/src/engine/SCons/Script/SConsOptions.py index 645ab11..c1f389a 100644 --- a/src/engine/SCons/Script/SConsOptions.py +++ b/src/engine/SCons/Script/SConsOptions.py @@ -248,7 +248,7 @@ class SConsOption(optparse.Option): class SConsOptionGroup(optparse.OptionGroup): """ A subclass for SCons-specific option groups. - + The only difference between this and the base class is that we print the group's help text flush left, underneath their own title but lined up with the normal "SCons Options". @@ -340,7 +340,7 @@ class SConsOptionParser(optparse.OptionParser): def add_local_option(self, *args, **kw): """ Adds a local option to the parser. - + This is initiated by a SetOption() call to add a user-defined command-line option. We add the option to a separate option group for the local options, creating the group if necessary. @@ -394,11 +394,11 @@ class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter): out liking: -- add our own regular expression that doesn't break on hyphens - (so things like --no-print-directory don't get broken); + (so things like --no-print-directory don't get broken); -- wrap the list of options themselves when it's too long (the wrapper.fill(opts) call below); - + -- set the subsequent_indent when wrapping the help_text. """ # The help for each option consists of two parts: @@ -606,23 +606,25 @@ def Parser(version): "pdb", "prepare", "presub", "stacktrace", "time"] - def opt_debug(option, opt, value, parser, + def opt_debug(option, opt, value__, parser, debug_options=debug_options, deprecated_debug_options=deprecated_debug_options): - if value in debug_options: - parser.values.debug.append(value) - elif value in deprecated_debug_options.keys(): - parser.values.debug.append(value) - try: - parser.values.delayed_warnings - except AttributeError: - parser.values.delayed_warnings = [] - msg = deprecated_debug_options[value] - w = "The --debug=%s option is deprecated%s." % (value, msg) - t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w) - parser.values.delayed_warnings.append(t) - else: - raise OptionValueError(opt_invalid('debug', value, debug_options)) + for value in value__.split(','): + if value in debug_options: + parser.values.debug.append(value) + elif value in deprecated_debug_options.keys(): + parser.values.debug.append(value) + try: + parser.values.delayed_warnings + except AttributeError: + parser.values.delayed_warnings = [] + msg = deprecated_debug_options[value] + w = "The --debug=%s option is deprecated%s." % (value, msg) + t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w) + parser.values.delayed_warnings.append(t) + else: + raise OptionValueError(opt_invalid('debug', value, debug_options)) + opt_debug_help = "Print various types of debugging information: %s." \ % ", ".join(debug_options) op.add_option('--debug', -- cgit v0.12 From 56875f9b7463ebb9cd1478187d9cd3ca25fd40d2 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Tue, 1 Oct 2013 11:38:32 +0100 Subject: support for --cache-readonly Setting this will fetch data from the cache but won't update it. --- doc/man/scons.xml | 23 +++++++++++++++++------ src/engine/SCons/CacheDir.py | 8 +++++++- src/engine/SCons/Script/Main.py | 1 + src/engine/SCons/Script/SConsOptions.py | 7 +++++++ 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/doc/man/scons.xml b/doc/man/scons.xml index 602bdbe..947d86d 100644 --- a/doc/man/scons.xml +++ b/doc/man/scons.xml @@ -61,12 +61,12 @@ version &buildversion; - + SCons &buildversion; MAN page - - - + + + SCONS 1 @@ -79,7 +79,7 @@ - scons + scons options name=val targets @@ -381,6 +381,7 @@ will be retrieved from the cache instead of being rebuilt locally. Caching behavior may be disabled and controlled in other ways by the , , +, and command-line options. The @@ -542,6 +543,15 @@ option. + + --cache-readonly + +Use the cache (if enabled) for reading, but do not not update the +cache with changed files. + + + + --cache-show @@ -1094,6 +1104,7 @@ command: --cache-debug=FILE --cache-disable, --no-cache --cache-force, --cache-populate +--cache-readonly --cache-show --debug=TYPE -i, --ignore-errors @@ -6775,7 +6786,7 @@ specified in the $MYPATH construction variable. It lets SCons detect the file incs/foo.inc -, even if +, even if foo.x contains the line include foo.inc diff --git a/src/engine/SCons/CacheDir.py b/src/engine/SCons/CacheDir.py index 3516018..9dd18e5 100644 --- a/src/engine/SCons/CacheDir.py +++ b/src/engine/SCons/CacheDir.py @@ -37,6 +37,7 @@ cache_enabled = True cache_debug = False cache_force = False cache_show = False +cache_readonly = False def CacheRetrieveFunc(target, source, env): t = target[0] @@ -70,6 +71,8 @@ CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString) CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None) def CachePushFunc(target, source, env): + if cache_readonly: return + t = target[0] if t.nocache: return @@ -150,6 +153,9 @@ class CacheDir(object): def is_enabled(self): return (cache_enabled and not self.path is None) + def is_readonly(self): + return cache_readonly + def cachepath(self, node): """ """ @@ -201,7 +207,7 @@ class CacheDir(object): return False def push(self, node): - if not self.is_enabled(): + if self.is_readonly() or not self.is_enabled(): return return CachePush(node, [], node.get_build_env()) diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 837c103..fea0916 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -1089,6 +1089,7 @@ def _build_targets(fs, options, targets, target_top): SCons.Node.FS.set_diskcheck(options.diskcheck) SCons.CacheDir.cache_enabled = not options.cache_disable + SCons.CacheDir.cache_readonly = options.cache_readonly SCons.CacheDir.cache_debug = options.cache_debug SCons.CacheDir.cache_force = options.cache_force SCons.CacheDir.cache_show = options.cache_show diff --git a/src/engine/SCons/Script/SConsOptions.py b/src/engine/SCons/Script/SConsOptions.py index c1f389a..62033ba 100644 --- a/src/engine/SCons/Script/SConsOptions.py +++ b/src/engine/SCons/Script/SConsOptions.py @@ -564,6 +564,11 @@ def Parser(version): action="store_true", help="Copy already-built targets into the CacheDir.") + op.add_option('--cache-readonly', + dest='cache_readonly', default=False, + action="store_true", + help="Do not update CacheDir with built targets.") + op.add_option('--cache-show', dest='cache_show', default=False, action="store_true", @@ -579,8 +584,10 @@ def Parser(version): if not value in c_options: raise OptionValueError(opt_invalid('config', value, c_options)) setattr(parser.values, option.dest, value) + opt_config_help = "Controls Configure subsystem: %s." \ % ", ".join(config_options) + op.add_option('--config', nargs=1, type="string", dest="config", default="auto", -- cgit v0.12 From c9e2d5a843115f68e37c3e0f00c2594f83150f3b Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Tue, 1 Oct 2013 12:18:49 +0100 Subject: Added stack dump on build error Added message if nothing found to build Always produce profile stats, no matter what sort of exit Print message if you drop out with a build error --- src/engine/SCons/Script/Main.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index fea0916..9c2e0b9 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -272,6 +272,9 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask): (EnvironmentError, SCons.Errors.StopError, SCons.Errors.UserError))): type, value, trace = buildError.exc_info + if tb and print_stacktrace: + sys.stderr.write("scons: internal stack trace:\n") + traceback.print_tb(tb, file=sys.stderr) traceback.print_exception(type, value, trace) elif tb and print_stacktrace: sys.stderr.write("scons: internal stack trace:\n") @@ -1071,6 +1074,7 @@ def _main(parser): # Build the targets nodes = _build_targets(fs, options, targets, target_top) if not nodes: + print 'Found nothing to build' exit_status = 2 def _build_targets(fs, options, targets, target_top): @@ -1299,12 +1303,8 @@ def _exec_main(parser, values): prof = Profile() try: prof.runcall(_main, parser) - except SConsPrintHelpException, e: + finally: prof.dump_stats(options.profile_file) - raise e - except SystemExit: - pass - prof.dump_stats(options.profile_file) else: _main(parser) @@ -1359,6 +1359,7 @@ def main(): parser.print_help() exit_status = 0 except SCons.Errors.BuildError, e: + print e exit_status = e.exitstatus except: # An exception here is likely a builtin Python exception Python -- cgit v0.12 From 0359ca7ad334f499031aacb46c0e1a6b33789024 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Tue, 1 Oct 2013 13:21:08 +0100 Subject: Revert stdout/stderr to the initial ones in a few places. There are some situations where scons error messages can just disappear, and sometimes it's because a build rule or an SConscript or something has temporarily redirected stdout/stderr. --- src/engine/SCons/Script/Main.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 9c2e0b9..1651d1e 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -79,7 +79,12 @@ def fetch_win32_parallel_msg(): import SCons.Platform.win32 return SCons.Platform.win32.parallel_msg -# +def revert_io(): + # This call is added to revert stderr and stdout to the original + # ones just in case some build rule or something else in the system + # has redirected them elsewhere. + sys.stderr = sys.__stderr__ + sys.stdout = sys.__stdout__ class SConsPrintHelpException(Exception): pass @@ -986,9 +991,9 @@ def _main(parser): # reading SConscript files and haven't started building # things yet, stop regardless of whether they used -i or -k # or anything else. + revert_io() sys.stderr.write("scons: *** %s Stop.\n" % e) - exit_status = 2 - sys.exit(exit_status) + sys.exit(2) global sconscript_time sconscript_time = time.time() - start_time @@ -1074,6 +1079,7 @@ def _main(parser): # Build the targets nodes = _build_targets(fs, options, targets, target_top) if not nodes: + revert_io() print 'Found nothing to build' exit_status = 2 @@ -1342,7 +1348,10 @@ def main(): OptionsParser = parser try: - _exec_main(parser, values) + try: + _exec_main(parser, values) + finally: + revert_io() except SystemExit, s: if s: exit_status = s -- cgit v0.12 From d83777e9c6b676c0051d120bf3405e9117a031cf Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Thu, 3 Oct 2013 17:07:25 +0100 Subject: Stop leaking of filehandles to child processes by closing on fork. Note: The close on fork bit you can set with ioctl isn't thread safe, and only linux allows you to set it on open --- src/engine/SCons/Platform/posix.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/engine/SCons/Platform/posix.py b/src/engine/SCons/Platform/posix.py index ece48d7..3da1be7 100644 --- a/src/engine/SCons/Platform/posix.py +++ b/src/engine/SCons/Platform/posix.py @@ -47,6 +47,11 @@ exitvalmap = { 13 : 126, } +try: + MAXFD = os.sysconf("SC_OPEN_MAX") +except: + MAXFD = 256 + def escape(arg): "escape shell special characters" slash = '\\' @@ -70,11 +75,12 @@ def exec_spawnvpe(l, env): # returned by os.waitpid() or os.system(). return stat -def exec_fork(l, env): +def exec_fork(l, env): pid = os.fork() if not pid: # Child process. exitval = 127 + os.closerange(3, MAXFD) try: os.execvpe(l[0], l, env) except OSError, e: @@ -161,6 +167,7 @@ def exec_piped_fork(l, env, stdout, stderr): os.close( wFdOut ) if stdout != stderr: os.close( wFdErr ) + os.closerange(3, MAXFD) exitval = 127 try: os.execvpe(l[0], l, env) @@ -205,7 +212,7 @@ def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr): def generate(env): # If os.spawnvpe() exists, we use it to spawn commands. Otherwise # if the env utility exists, we use os.system() to spawn commands, - # finally we fall back on os.fork()/os.exec(). + # finally we fall back on os.fork()/os.exec(). # # os.spawnvpe() is prefered because it is the most efficient. But # for Python versions without it, os.system() is prefered because it -- cgit v0.12 From ae5053ffaf485d77c9ee37873169e3dd6be7b579 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Fri, 4 Oct 2013 17:32:02 +0100 Subject: Change posix.py to use subprocess as we only support python 2.4. Added a test for leaking handles. --- src/engine/SCons/Platform/posix.py | 178 +++---------------------------------- test/builderrors.py | 11 +-- test/leaky-handles.py | 60 +++++++++++++ 3 files changed, 75 insertions(+), 174 deletions(-) create mode 100644 test/leaky-handles.py diff --git a/src/engine/SCons/Platform/posix.py b/src/engine/SCons/Platform/posix.py index 3da1be7..2e21e5a 100644 --- a/src/engine/SCons/Platform/posix.py +++ b/src/engine/SCons/Platform/posix.py @@ -47,11 +47,6 @@ exitvalmap = { 13 : 126, } -try: - MAXFD = os.sysconf("SC_OPEN_MAX") -except: - MAXFD = 256 - def escape(arg): "escape shell special characters" slash = '\\' @@ -63,177 +58,32 @@ def escape(arg): return '"' + arg + '"' -def exec_system(l, env): - stat = os.system(' '.join(l)) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_spawnvpe(l, env): - stat = os.spawnvpe(os.P_WAIT, l[0], l, env) - # os.spawnvpe() returns the actual exit code, not the encoding - # returned by os.waitpid() or os.system(). - return stat - -def exec_fork(l, env): - pid = os.fork() - if not pid: - # Child process. - exitval = 127 - os.closerange(3, MAXFD) - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process. - pid, stat = os.waitpid(pid, 0) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def _get_env_command(sh, escape, cmd, args, env): - s = ' '.join(args) - if env: - l = ['env', '-'] + \ - [escape(t[0])+'='+escape(t[1]) for t in env.items()] + \ - [sh, '-c', escape(s)] - s = ' '.join(l) - return s - -def env_spawn(sh, escape, cmd, args, env): - return exec_system([_get_env_command( sh, escape, cmd, args, env)], env) - -def spawnvpe_spawn(sh, escape, cmd, args, env): - return exec_spawnvpe([sh, '-c', ' '.join(args)], env) +def exec_subprocess(l, env): + proc = subprocess.Popen(l, env = env, close_fds = True) + return proc.wait() -def fork_spawn(sh, escape, cmd, args, env): - return exec_fork([sh, '-c', ' '.join(args)], env) - -def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr): - stdout_eof = stderr_eof = 0 - while not (stdout_eof and stderr_eof): - try: - (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], []) - if cmd_stdout in i: - str = cmd_stdout.read() - if len(str) == 0: - stdout_eof = 1 - elif stdout is not None: - stdout.write(str) - if cmd_stderr in i: - str = cmd_stderr.read() - if len(str) == 0: - #sys.__stderr__.write( "stderr_eof=1\n" ) - stderr_eof = 1 - else: - #sys.__stderr__.write( "str(stderr) = %s\n" % str ) - stderr.write(str) - except select.error, (_errno, _strerror): - if _errno != errno.EINTR: - raise +def subprocess_spawn(sh, escape, cmd, args, env): + return exec_subprocess([sh, '-c', ' '.join(args)], env) def exec_popen3(l, env, stdout, stderr): - proc = subprocess.Popen(' '.join(l), - stdout=stdout, - stderr=stderr, - shell=True) - stat = proc.wait() - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_piped_fork(l, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - if stdout != stderr: - (rFdOut, wFdOut) = os.pipe() - (rFdErr, wFdErr) = os.pipe() - else: - (rFdOut, wFdOut) = os.pipe() - rFdErr = rFdOut - wFdErr = wFdOut - # do the fork - pid = os.fork() - if not pid: - # Child process - os.close( rFdOut ) - if rFdOut != rFdErr: - os.close( rFdErr ) - os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ? - os.dup2( wFdErr, 2 ) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - os.closerange(3, MAXFD) - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process - pid, stat = os.waitpid(pid, 0) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - childOut = os.fdopen( rFdOut ) - if stdout != stderr: - childErr = os.fdopen( rFdErr ) - else: - childErr = childOut - process_cmd_output(childOut, childErr, stdout, stderr) - os.close( rFdOut ) - if stdout != stderr: - os.close( rFdErr ) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 + proc = subprocess.Popen(l, env = env, close_fds = True, + stdout = stdout, + stderr = stderr) + return proc.wait() def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr): # spawn using Popen3 combined with the env command # the command name and the command's stdout is written to stdout # the command's stderr is written to stderr - return exec_popen3([_get_env_command(sh, escape, cmd, args, env)], + return exec_popen3([sh, '-c', ' '.join(args)], env, stdout, stderr) -def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - return exec_piped_fork([sh, '-c', ' '.join(args)], - env, stdout, stderr) - - def generate(env): - # If os.spawnvpe() exists, we use it to spawn commands. Otherwise - # if the env utility exists, we use os.system() to spawn commands, - # finally we fall back on os.fork()/os.exec(). - # - # os.spawnvpe() is prefered because it is the most efficient. But - # for Python versions without it, os.system() is prefered because it - # is claimed that it works better with threads (i.e. -j) and is more - # efficient than forking Python. - # - # NB: Other people on the scons-users mailing list have claimed that - # os.fork()/os.exec() works better than os.system(). There may just - # not be a default that works best for all users. - - if 'spawnvpe' in os.__dict__: - spawn = spawnvpe_spawn - elif env.Detect('env'): - spawn = env_spawn - else: - spawn = fork_spawn - - if env.Detect('env'): - pspawn = piped_env_spawn - else: - pspawn = piped_fork_spawn + # Bearing in mind we have python 2.4 as a baseline, we can just do this: + spawn = subprocess_spawn + pspawn = piped_env_spawn + # Note that this means that 'escape' is no longer used if 'ENV' not in env: env['ENV'] = {} diff --git a/test/builderrors.py b/test/builderrors.py index 0133107..3d443bf 100644 --- a/test/builderrors.py +++ b/test/builderrors.py @@ -107,9 +107,6 @@ test.fail_test(os.path.exists(test.workpath('f3.out'))) test.write('SConstruct', """ env=Environment() -if env['PLATFORM'] == 'posix': - from SCons.Platform.posix import fork_spawn - env['SPAWN'] = fork_spawn env['ENV']['PATH'] = '' env.Command(target='foo.out', source=[], action='not_a_program') """) @@ -123,9 +120,6 @@ test.must_not_contain_any_line(test.stderr(), ['Exception', 'Traceback']) long_cmd = 'xyz ' + "foobarxyz" * 100000 test.write('SConstruct', """ env=Environment() -if env['PLATFORM'] == 'posix': - from SCons.Platform.posix import fork_spawn - env['SPAWN'] = fork_spawn env.Command(target='longcmd.out', source=[], action='echo %s') """%long_cmd) @@ -147,9 +141,6 @@ test.must_not_contain_any_line(test.stderr(), ['Exception', 'Traceback']) # with error "Permission denied" or "No such file or directory". test.write('SConstruct', """ env=Environment() -if env['PLATFORM'] in ('posix', 'darwin'): - from SCons.Platform.posix import fork_spawn - env['SPAWN'] = fork_spawn env['SHELL'] = 'one' env.Command(target='badshell.out', source=[], action='foo') """) @@ -191,7 +182,7 @@ env2.Install("target", "dir2/myFile") def print_build_failures(): from SCons.Script import GetBuildFailures for bf in GetBuildFailures(): - print bf.action + print bf.action atexit.register(print_build_failures) """) diff --git a/test/leaky-handles.py b/test/leaky-handles.py new file mode 100644 index 0000000..9502d1b --- /dev/null +++ b/test/leaky-handles.py @@ -0,0 +1,60 @@ +#!/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__" + +""" +Verify that file handles aren't leaked to child processes +""" + +import os + +import TestSCons + +test = TestSCons.TestSCons() + +if os.name != 'posix': + msg = "Skipping fork leak test on non-posix platform '%s'\n" % os.name + test.skip_test(msg) + +test.write('SConstruct', """ + +#Leak a file handle +open('/dev/null') + +#Check it gets closed +test2 = Command('test2', [], '@ls /proc/$$$$/fd|wc -l') +""") + +# In theory that should have 3 lines (handles 0/1/2). This is v. unix specific + +test.run(arguments = '-Q', stdout='3\n') + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From e2d8d87c5911067374d0b3b5be562c4ce2dddcce Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sun, 6 Oct 2013 17:04:19 +0200 Subject: - left-aligned all code examples in documentation - accordingly updated the generated files, containing example output --- doc/design/engine.xml | 8 +- doc/generated/builders.gen | 13 +- .../commandline_Variables_custom_py_1_custom.py | 2 +- doc/generated/examples/depends_ex1_5.xml | 2 +- doc/generated/examples/depends_include_SConstruct | 2 +- doc/generated/examples/depends_include_hello.h | 2 +- .../examples/hierarchy_Return_foo_SConscript | 6 +- .../examples/hierarchy_ex1_prog1_SConscript | 4 +- .../examples/hierarchy_ex1_prog2_SConscript | 4 +- .../separate_builddir_sconscript_SConstruct | 4 +- doc/generated/variables.gen | 20 + doc/generated/variables.mod | 2 + doc/man/scons.xml | 36 +- doc/python10/design.xml | 26 +- doc/reference/Library.xml | 36 +- doc/user/actions.xml | 4 +- doc/user/add-method.xml | 18 +- doc/user/alias.xml | 30 +- doc/user/build-install.xml | 26 +- doc/user/builders-built-in.xml | 126 +++--- doc/user/builders-commands.xml | 20 +- doc/user/builders-writing.xml | 318 ++++++------- doc/user/caching.xml | 50 +-- doc/user/command-line.xml | 490 ++++++++++----------- doc/user/depends.xml | 300 ++++++------- doc/user/environments.xml | 156 +++---- doc/user/factories.xml | 146 +++--- doc/user/file-removal.xml | 42 +- doc/user/gettext.xml | 276 ++++++------ doc/user/hierarchy.xml | 138 +++--- doc/user/install.xml | 72 +-- doc/user/java.xml | 408 ++++++++--------- doc/user/less-simple.xml | 92 ++-- doc/user/libraries.xml | 54 +-- doc/user/mergeflags.xml | 32 +- doc/user/misc.xml | 144 +++--- doc/user/nodes.xml | 60 +-- doc/user/output.xml | 78 ++-- doc/user/parseconfig.xml | 28 +- doc/user/parseflags.xml | 64 +-- doc/user/repositories.xml | 114 ++--- doc/user/scanners.xml | 28 +- doc/user/sconf.xml | 152 +++---- doc/user/separate.xml | 72 +-- doc/user/sideeffect.xml | 46 +- doc/user/simple.xml | 56 +-- doc/user/sourcecode.xml | 36 +- doc/user/troubleshoot.xml | 130 +++--- doc/user/variants.xml | 6 +- 49 files changed, 2006 insertions(+), 1973 deletions(-) diff --git a/doc/design/engine.xml b/doc/design/engine.xml index b8bdd4b..6989f8a 100644 --- a/doc/design/engine.xml +++ b/doc/design/engine.xml @@ -1411,8 +1411,8 @@ Comments? - env.Library(target = 'libfoo.a', source = ['aaa.c', 'bbb.c', 'ccc.c']) - env.NoClean('libfoo.a') +env.Library(target = 'libfoo.a', source = ['aaa.c', 'bbb.c', 'ccc.c']) +env.NoClean('libfoo.a') @@ -1425,8 +1425,8 @@ Comments? during "cleanup": - env.Clean(target = 'foo') - env.NoClean('foo') +env.Clean(target = 'foo') +env.NoClean('foo') diff --git a/doc/generated/builders.gen b/doc/generated/builders.gen index eec4711..3fdafb6 100644 --- a/doc/generated/builders.gen +++ b/doc/generated/builders.gen @@ -1841,6 +1841,17 @@ listed in the targets. +On Cygwin systems, the +SharedLibrary +builder method will always build an import +(.dll.a) library +in addition to the shared (.dll) library, +adding a .dll.a library with the same basename +if there is not already a .dll.a file explicitly +listed in the targets. + + + Any object files listed in the source must have been built for a shared library @@ -1870,7 +1881,7 @@ alpha, beta, or release candidate patch levels. 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, libbar.so.2, and libbar.so.2.3; on a Darwin (OSX) system +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. diff --git a/doc/generated/examples/commandline_Variables_custom_py_1_custom.py b/doc/generated/examples/commandline_Variables_custom_py_1_custom.py index f2acb0d..ff314fa 100644 --- a/doc/generated/examples/commandline_Variables_custom_py_1_custom.py +++ b/doc/generated/examples/commandline_Variables_custom_py_1_custom.py @@ -1,3 +1,3 @@ - RELEASE = 1 +RELEASE = 1 diff --git a/doc/generated/examples/depends_ex1_5.xml b/doc/generated/examples/depends_ex1_5.xml index abbe64e..136def6 100644 --- a/doc/generated/examples/depends_ex1_5.xml +++ b/doc/generated/examples/depends_ex1_5.xml @@ -5,5 +5,5 @@ cc -o hello hello.o % [CHANGE A COMMENT IN hello.c] % scons -Q hello cc -o hello.o -c hello.c -scons: `hello' is up to date. +cc -o hello hello.o diff --git a/doc/generated/examples/depends_include_SConstruct b/doc/generated/examples/depends_include_SConstruct index 5f6d7f5..2da2ecf 100644 --- a/doc/generated/examples/depends_include_SConstruct +++ b/doc/generated/examples/depends_include_SConstruct @@ -1,3 +1,3 @@ - Program('hello.c', CPPPATH = '.') +Program('hello.c', CPPPATH = '.') diff --git a/doc/generated/examples/depends_include_hello.h b/doc/generated/examples/depends_include_hello.h index c9046b3..d6032ce 100644 --- a/doc/generated/examples/depends_include_hello.h +++ b/doc/generated/examples/depends_include_hello.h @@ -1,3 +1,3 @@ - #define string "world" +#define string "world" diff --git a/doc/generated/examples/hierarchy_Return_foo_SConscript b/doc/generated/examples/hierarchy_Return_foo_SConscript index 5d74264..4f45c0f 100644 --- a/doc/generated/examples/hierarchy_Return_foo_SConscript +++ b/doc/generated/examples/hierarchy_Return_foo_SConscript @@ -1,5 +1,5 @@ - Import('env') - obj = env.Object('foo.c') - Return('obj') +Import('env') +obj = env.Object('foo.c') +Return('obj') diff --git a/doc/generated/examples/hierarchy_ex1_prog1_SConscript b/doc/generated/examples/hierarchy_ex1_prog1_SConscript index 425f1b8..caf2636 100644 --- a/doc/generated/examples/hierarchy_ex1_prog1_SConscript +++ b/doc/generated/examples/hierarchy_ex1_prog1_SConscript @@ -1,4 +1,4 @@ - env = Environment() - env.Program('prog1', ['main.c', 'foo1.c', 'foo2.c']) +env = Environment() +env.Program('prog1', ['main.c', 'foo1.c', 'foo2.c']) diff --git a/doc/generated/examples/hierarchy_ex1_prog2_SConscript b/doc/generated/examples/hierarchy_ex1_prog2_SConscript index fb529b4..88b05a3 100644 --- a/doc/generated/examples/hierarchy_ex1_prog2_SConscript +++ b/doc/generated/examples/hierarchy_ex1_prog2_SConscript @@ -1,4 +1,4 @@ - env = Environment() - env.Program('prog2', ['main.c', 'bar1.c', 'bar2.c']) +env = Environment() +env.Program('prog2', ['main.c', 'bar1.c', 'bar2.c']) diff --git a/doc/generated/examples/separate_builddir_sconscript_SConstruct b/doc/generated/examples/separate_builddir_sconscript_SConstruct index c3da725..d53d1c6 100644 --- a/doc/generated/examples/separate_builddir_sconscript_SConstruct +++ b/doc/generated/examples/separate_builddir_sconscript_SConstruct @@ -1,4 +1,4 @@ - VariantDir('build', 'src') - SConscript('build/SConscript') +VariantDir('build', 'src') +SConscript('build/SConscript') diff --git a/doc/generated/variables.gen b/doc/generated/variables.gen index 1828112..b213916 100644 --- a/doc/generated/variables.gen +++ b/doc/generated/variables.gen @@ -7352,6 +7352,26 @@ General options passed to the zip utility. + + ZIPROOT + +An optional zip root directory (default empty). The filenames stored +in the zip file will be relative to this directory, if given. +Otherwise the filenames are relative to the current directory of the +command. +For instance: + +env = Environment() +env.Zip('foo.zip', 'subdir1/subdir2/file1', ZIPROOT='subdir1') + + +will produce a zip file foo.zip +containing a file with the name +subdir2/file1 rather than +subdir1/subdir2/file1. + + + ZIPSUFFIX diff --git a/doc/generated/variables.mod b/doc/generated/variables.mod index 7247f55..8a898ec 100644 --- a/doc/generated/variables.mod +++ b/doc/generated/variables.mod @@ -576,6 +576,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. $ZIPCOMPRESSION"> $ZIPCOMSTR"> $ZIPFLAGS"> +$ZIPROOT"> $ZIPSUFFIX"> @@ -419,8 +419,8 @@ - # cd scons-&buildversion; - # python setup.py install +# cd scons-&buildversion; +# python setup.py install @@ -480,7 +480,7 @@ - # python setup.py install --version-lib +# python setup.py install --version-lib @@ -522,7 +522,7 @@ - # python setup.py install --prefix=/opt/scons +# python setup.py install --prefix=/opt/scons @@ -573,7 +573,7 @@ - $ python setup.py install --prefix=$HOME +$ python setup.py install --prefix=$HOME diff --git a/doc/user/builders-built-in.xml b/doc/user/builders-built-in.xml index 9c28020..2fcf313 100644 --- a/doc/user/builders-built-in.xml +++ b/doc/user/builders-built-in.xml @@ -77,7 +77,7 @@ - Program('prog', 'file1.o') +Program('prog', 'file1.o') @@ -102,8 +102,8 @@ - env = Environment(PROGPREFIX='my', PROGSUFFIX='.xxx') - env.Program('prog', ['file1.o', 'file2.o']) +env = Environment(PROGPREFIX='my', PROGSUFFIX='.xxx') +env.Program('prog', ['file1.o', 'file2.o']) @@ -126,7 +126,7 @@ - Program(['hello.c', 'goodbye.c']) +Program(['hello.c', 'goodbye.c']) @@ -154,15 +154,15 @@ - env = Environment(LIBS = ['foo1', 'foo2'], - LIBPATH = ['/usr/dir1', 'dir2']) - env.Program(['hello.c', 'goodbye.c']) +env = Environment(LIBS = ['foo1', 'foo2'], + LIBPATH = ['/usr/dir1', 'dir2']) +env.Program(['hello.c', 'goodbye.c']) - int hello() { printf("Hello, world!\n"); } +int hello() { printf("Hello, world!\n"); } - int goodbye() { printf("Goodbye, world!\n"); } +int goodbye() { printf("Goodbye, world!\n"); } @@ -258,7 +258,7 @@ - StaticObject('file', 'file.c') +StaticObject('file', 'file.c') @@ -283,8 +283,8 @@ - env = Environment(OBJPREFIX='my', OBJSUFFIX='.xxx') - env.StaticObject('file', 'file.c') +env = Environment(OBJPREFIX='my', OBJSUFFIX='.xxx') +env.StaticObject('file', 'file.c') @@ -307,7 +307,7 @@ - StaticObject('file.c') +StaticObject('file.c') @@ -337,7 +337,7 @@ - SharedObject('file', 'file.c') +SharedObject('file', 'file.c') @@ -362,8 +362,8 @@ - env = Environment(SHOBJPREFIX='my', SHOBJSUFFIX='.xxx') - env.SharedObject('file', 'file.c') +env = Environment(SHOBJPREFIX='my', SHOBJSUFFIX='.xxx') +env.SharedObject('file', 'file.c') @@ -386,7 +386,7 @@ - SharedObject('file.c') +SharedObject('file.c') @@ -440,7 +440,7 @@ - StaticLibrary('foo', ['file1.c', 'file2.c']) +StaticLibrary('foo', ['file1.c', 'file2.c']) @@ -457,8 +457,8 @@ - env = Environment(LIBPREFIX='my', LIBSUFFIX='.xxx') - env.StaticLibrary('lib', ['file1.o', 'file2.o']) +env = Environment(LIBPREFIX='my', LIBSUFFIX='.xxx') +env.StaticLibrary('lib', ['file1.o', 'file2.o']) @@ -470,7 +470,7 @@ - StaticLibrary('foo', ['file1.c', 'file2.c']) +StaticLibrary('foo', ['file1.c', 'file2.c']) @@ -484,7 +484,7 @@ - StaticLibrary(['file.c', 'another.c']) +StaticLibrary(['file.c', 'another.c']) @@ -514,7 +514,7 @@ - SharedLibrary('foo', ['file1.c', 'file2.c']) +SharedLibrary('foo', ['file1.c', 'file2.c']) @@ -531,8 +531,8 @@ - env = Environment(SHLIBPREFIX='my', SHLIBSUFFIX='.xxx') - env.SharedLibrary('shared', ['file1.o', 'file2.o']) +env = Environment(SHLIBPREFIX='my', SHLIBSUFFIX='.xxx') +env.SharedLibrary('shared', ['file1.o', 'file2.o']) @@ -544,7 +544,7 @@ - SharedLibrary('foo', ['file1.c', 'file2.c']) +SharedLibrary('foo', ['file1.c', 'file2.c']) @@ -558,7 +558,7 @@ - SharedLibrary(['file.c', 'another.c']) +SharedLibrary(['file.c', 'another.c']) @@ -631,11 +631,11 @@ - XXX CFile() programlisting +XXX CFile() programlisting - XXX CFile() screen +XXX CFile() screen @@ -650,11 +650,11 @@ - XXX CXXFILE() programlisting +XXX CXXFILE() programlisting - XXX CXXFILE() screen +XXX CXXFILE() screen @@ -681,11 +681,11 @@ - XXX DVI() programlisting +XXX DVI() programlisting - XXX DVI() screen +XXX DVI() screen @@ -711,11 +711,11 @@ - XXX PostScript() programlisting +XXX PostScript() programlisting - XXX PostScript() screen +XXX PostScript() screen @@ -745,18 +745,18 @@ - env = Environment() - env.Tar('out1.tar', ['file1', 'file2']) - env.Tar('out2', 'directory') +env = Environment() +env.Tar('out1.tar', ['file1', 'file2']) +env.Tar('out2', 'directory') - file1 +file1 - file2 +file2 - directory/file3 +directory/file3 @@ -781,11 +781,11 @@ - env = Environment(TARFLAGS = '-c -z') - env.Tar('out.tar.gz', 'directory') +env = Environment(TARFLAGS = '-c -z') +env.Tar('out.tar.gz', 'directory') - directory/file +directory/file @@ -805,12 +805,12 @@ - env = Environment(TARFLAGS = '-c -z', - TARSUFFIX = '.tgz') - env.Tar('out', 'directory') +env = Environment(TARFLAGS = '-c -z', + TARSUFFIX = '.tgz') +env.Tar('out', 'directory') - directory/file +directory/file @@ -837,14 +837,14 @@ - env = Environment() - env.Zip('out', ['file1', 'file2']) +env = Environment() +env.Zip('out', ['file1', 'file2']) - file1 +file1 - file2 +file2 @@ -891,8 +891,8 @@ - env = Environment() - env.Java(target = 'classes', source = 'src') +env = Environment() +env.Java(target = 'classes', source = 'src') @@ -905,7 +905,7 @@ - XXX Java() screen +XXX Java() screen @@ -920,13 +920,13 @@ - env = Environment() - env.Java(target = 'classes', source = 'src') - env.Jar(target = '', source = 'classes') +env = Environment() +env.Java(target = 'classes', source = 'src') +env.Jar(target = '', source = 'classes') - XXX Jar() screen +XXX Jar() screen @@ -941,11 +941,11 @@ - XXX JavaH() programlisting +XXX JavaH() programlisting - XXX JavaH() screen +XXX JavaH() screen @@ -960,11 +960,11 @@ - XXX RMIC() programlisting +XXX RMIC() programlisting - XXX RMIC() screen +XXX RMIC() screen diff --git a/doc/user/builders-commands.xml b/doc/user/builders-commands.xml index 52e98c8..d496ef1 100644 --- a/doc/user/builders-commands.xml +++ b/doc/user/builders-commands.xml @@ -93,11 +93,11 @@ - env = Environment() - env.Command('foo.out', 'foo.in', "sed 's/x/y/' < $SOURCE > $TARGET") +env = Environment() +env.Command('foo.out', 'foo.in', "sed 's/x/y/' < $SOURCE > $TARGET") - foo.in +foo.in @@ -133,14 +133,14 @@ - env = Environment() - def build(target, source, env): - # Whatever it takes to build - return None - env.Command('foo.out', 'foo.in', build) +env = Environment() +def build(target, source, env): + # Whatever it takes to build + return None +env.Command('foo.out', 'foo.in', build) - foo.in +foo.in @@ -164,7 +164,7 @@ - env.Command('${SOURCE.basename}.out', 'foo.in', build) +env.Command('${SOURCE.basename}.out', 'foo.in', build) diff --git a/doc/user/builders-writing.xml b/doc/user/builders-writing.xml index 2dea8f7..383823a 100644 --- a/doc/user/builders-writing.xml +++ b/doc/user/builders-writing.xml @@ -151,7 +151,7 @@ This functionality could be invoked as in the following example: - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') @@ -187,23 +187,23 @@ This functionality could be invoked as in the following example: - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env = Environment(BUILDERS = {'Foo' : bld}) - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - env.Foo('file.foo', 'file.input') +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env = Environment(BUILDERS = {'Foo' : bld}) +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +env.Foo('file.foo', 'file.input') - file.input +file.input - cat +cat - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env = Environment(BUILDERS = {'Foo' : bld}) +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env = Environment(BUILDERS = {'Foo' : bld}) @@ -215,7 +215,7 @@ This functionality could be invoked as in the following example: - env.Foo('file.foo', 'file.input') +env.Foo('file.foo', 'file.input') @@ -261,22 +261,22 @@ This functionality could be invoked as in the following example: --> - import SCons.Defaults; SCons.Defaults.ConstructionEnvironment['TOOLS'] = {}; bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file.foo', 'file.input') - env.Program('hello.c') +import SCons.Defaults; SCons.Defaults.ConstructionEnvironment['TOOLS'] = {}; bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file.foo', 'file.input') +env.Program('hello.c') - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file.foo', 'file.input') - env.Program('hello.c') +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file.foo', 'file.input') +env.Program('hello.c') - file.input +file.input - hello.c +hello.c @@ -295,31 +295,31 @@ This functionality could be invoked as in the following example: - env = Environment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env.Append(BUILDERS = {'Foo' : bld}) - env.Foo('file.foo', 'file.input') - env.Program('hello.c') +env = Environment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env.Append(BUILDERS = {'Foo' : bld}) +env.Foo('file.foo', 'file.input') +env.Program('hello.c') - file.input +file.input - hello.c +hello.c - cat +cat - env = Environment() - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env.Append(BUILDERS = {'Foo' : bld}) - env.Foo('file.foo', 'file.input') - env.Program('hello.c') +env = Environment() +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env.Append(BUILDERS = {'Foo' : bld}) +env.Foo('file.foo', 'file.input') +env.Program('hello.c') @@ -330,11 +330,11 @@ This functionality could be invoked as in the following example: - env = Environment() - bld = Builder(action = 'foobuild < $SOURCE > $TARGET') - env['BUILDERS']['Foo'] = bld - env.Foo('file.foo', 'file.input') - env.Program('hello.c') +env = Environment() +bld = Builder(action = 'foobuild < $SOURCE > $TARGET') +env['BUILDERS']['Foo'] = bld +env.Foo('file.foo', 'file.input') +env.Program('hello.c') @@ -374,33 +374,33 @@ This functionality could be invoked as in the following example: - bld = Builder(action = 'foobuild < $SOURCE > $TARGET', - suffix = '.foo', - src_suffix = '.input') - env = Environment(BUILDERS = {'Foo' : bld}) - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - env.Foo('file1') - env.Foo('file2') +bld = Builder(action = 'foobuild < $SOURCE > $TARGET', + suffix = '.foo', + src_suffix = '.input') +env = Environment(BUILDERS = {'Foo' : bld}) +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +env.Foo('file1') +env.Foo('file2') - file1.input +file1.input - file2.input +file2.input - cat +cat - bld = Builder(action = 'foobuild < $SOURCE > $TARGET', - suffix = '.foo', - src_suffix = '.input') - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file1') - env.Foo('file2') +bld = Builder(action = 'foobuild < $SOURCE > $TARGET', + suffix = '.foo', + src_suffix = '.input') +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file1') +env.Foo('file2') @@ -432,9 +432,9 @@ This functionality could be invoked as in the following example: - def build_function(target, source, env): - # Code to build "target" from "source" - return None +def build_function(target, source, env): + # Code to build "target" from "source" + return None @@ -521,17 +521,17 @@ This functionality could be invoked as in the following example: - def build_function(target, source, env): - # Code to build "target" from "source" - return None - bld = Builder(action = build_function, - suffix = '.foo', - src_suffix = '.input') - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file') +def build_function(target, source, env): + # Code to build "target" from "source" + return None +bld = Builder(action = build_function, + suffix = '.foo', + src_suffix = '.input') +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file') - file.input +file.input @@ -565,8 +565,8 @@ This functionality could be invoked as in the following example: - def generate_actions(source, target, env, for_signature): - return 'foobuild < %s > %s' % (target[0], source[0]) +def generate_actions(source, target, env, for_signature): + return 'foobuild < %s > %s' % (target[0], source[0]) @@ -668,32 +668,32 @@ This functionality could be invoked as in the following example: - def generate_actions(source, target, env, for_signature): - return 'foobuild < %s > %s' % (source[0], target[0]) - bld = Builder(generator = generate_actions, - suffix = '.foo', - src_suffix = '.input') - env = Environment(BUILDERS = {'Foo' : bld}) - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - env.Foo('file') +def generate_actions(source, target, env, for_signature): + return 'foobuild < %s > %s' % (source[0], target[0]) +bld = Builder(generator = generate_actions, + suffix = '.foo', + src_suffix = '.input') +env = Environment(BUILDERS = {'Foo' : bld}) +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +env.Foo('file') - file.input +file.input - cat +cat - def generate_actions(source, target, env, for_signature): - return 'foobuild < %s > %s' % (source[0], target[0]) - bld = Builder(generator = generate_actions, - suffix = '.foo', - src_suffix = '.input') - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file') +def generate_actions(source, target, env, for_signature): + return 'foobuild < %s > %s' % (source[0], target[0]) +bld = Builder(generator = generate_actions, + suffix = '.foo', + src_suffix = '.input') +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file') @@ -746,41 +746,41 @@ This functionality could be invoked as in the following example: - def modify_targets(target, source, env): - target.append('new_target') - source.append('new_source') - return target, source - bld = Builder(action = 'foobuild $TARGETS - $SOURCES', - suffix = '.foo', - src_suffix = '.input', - emitter = modify_targets) - env = Environment(BUILDERS = {'Foo' : bld}) - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - env.Foo('file') +def modify_targets(target, source, env): + target.append('new_target') + source.append('new_source') + return target, source +bld = Builder(action = 'foobuild $TARGETS - $SOURCES', + suffix = '.foo', + src_suffix = '.input', + emitter = modify_targets) +env = Environment(BUILDERS = {'Foo' : bld}) +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +env.Foo('file') - file.input +file.input - new_source +new_source - cat +cat - def modify_targets(target, source, env): - target.append('new_target') - source.append('new_source') - return target, source - bld = Builder(action = 'foobuild $TARGETS - $SOURCES', - suffix = '.foo', - src_suffix = '.input', - emitter = modify_targets) - env = Environment(BUILDERS = {'Foo' : bld}) - env.Foo('file') +def modify_targets(target, source, env): + target.append('new_target') + source.append('new_source') + return target, source +bld = Builder(action = 'foobuild $TARGETS - $SOURCES', + suffix = '.foo', + src_suffix = '.input', + emitter = modify_targets) +env = Environment(BUILDERS = {'Foo' : bld}) +env.Foo('file') @@ -849,20 +849,20 @@ This functionality could be invoked as in the following example: - bld = Builder(action = 'my_command $SOURCES > $TARGET', - suffix = '.foo', - src_suffix = '.input', - emitter = '$MY_EMITTER') - def modify1(target, source, env): - return target, source + ['modify1.in'] - def modify2(target, source, env): - return target, source + ['modify2.in'] - env1 = Environment(BUILDERS = {'Foo' : bld}, - MY_EMITTER = modify1) - env2 = Environment(BUILDERS = {'Foo' : bld}, - MY_EMITTER = modify2) - env1.Foo('file1') - env2.Foo('file2') +bld = Builder(action = 'my_command $SOURCES > $TARGET', + suffix = '.foo', + src_suffix = '.input', + emitter = '$MY_EMITTER') +def modify1(target, source, env): + return target, source + ['modify1.in'] +def modify2(target, source, env): + return target, source + ['modify2.in'] +env1 = Environment(BUILDERS = {'Foo' : bld}, + MY_EMITTER = modify1) +env2 = Environment(BUILDERS = {'Foo' : bld}, + MY_EMITTER = modify2) +env1.Foo('file1') +env2.Foo('file2') @@ -962,19 +962,19 @@ This functionality could be invoked as in the following example: - def TOOL_ADD_HEADER(env): - """A Tool to add a header from $HEADER to the source file""" - add_header = Builder(action=['echo "$HEADER" > $TARGET', - 'cat $SOURCE >> $TARGET']) - env.Append(BUILDERS = {'AddHeader' : add_header}) - env['HEADER'] = '' # set default value +def TOOL_ADD_HEADER(env): + """A Tool to add a header from $HEADER to the source file""" + add_header = Builder(action=['echo "$HEADER" > $TARGET', + 'cat $SOURCE >> $TARGET']) + env.Append(BUILDERS = {'AddHeader' : add_header}) + env['HEADER'] = '' # set default value - env=Environment(tools=['default', TOOL_ADD_HEADER], HEADER="=====") - env.AddHeader('tgt', 'src') +env=Environment(tools=['default', TOOL_ADD_HEADER], HEADER="=====") +env.AddHeader('tgt', 'src') - hi there +hi there @@ -985,9 +985,9 @@ This functionality could be invoked as in the following example: - # Use TOOL_ADD_HEADER from site_scons/site_init.py - env=Environment(tools=['default', TOOL_ADD_HEADER], HEADER="=====") - env.AddHeader('tgt', 'src') +# Use TOOL_ADD_HEADER from site_scons/site_init.py +env=Environment(tools=['default', TOOL_ADD_HEADER], HEADER="=====") +env.AddHeader('tgt', 'src') @@ -1036,18 +1036,18 @@ This functionality could be invoked as in the following example: - from SCons.Script import * # for Execute and Mkdir - def build_id(): - """Return a build ID (stub version)""" - return "100" - def MakeWorkDir(workdir): - """Create the specified dir immediately""" - Execute(Mkdir(workdir)) +from SCons.Script import * # for Execute and Mkdir +def build_id(): + """Return a build ID (stub version)""" + return "100" +def MakeWorkDir(workdir): + """Create the specified dir immediately""" + Execute(Mkdir(workdir)) - import my_utils - MakeWorkDir('/tmp/work') - print "build_id=" + my_utils.build_id() +import my_utils +MakeWorkDir('/tmp/work') +print "build_id=" + my_utils.build_id() @@ -1059,9 +1059,9 @@ This functionality could be invoked as in the following example: - import my_utils - print "build_id=" + my_utils.build_id() - my_utils.MakeWorkDir('/tmp/work') +import my_utils +print "build_id=" + my_utils.build_id() +my_utils.MakeWorkDir('/tmp/work') @@ -1074,7 +1074,7 @@ This functionality could be invoked as in the following example: than a &SConstruct; or &SConscript; you always need to do - from SCons.Script import * +from SCons.Script import * @@ -1112,12 +1112,12 @@ This functionality could be invoked as in the following example: - env = Environment() - #env.SourceCode('.', env.BitKeeper('my_command')) - env.Program('hello.c') +env = Environment() +#env.SourceCode('.', env.BitKeeper('my_command')) +env.Program('hello.c') - hello.c +hello.c diff --git a/doc/user/caching.xml b/doc/user/caching.xml index 4e6dcf5..f728653 100644 --- a/doc/user/caching.xml +++ b/doc/user/caching.xml @@ -67,17 +67,17 @@ - env = Environment() - env.Program('hello.c') - CacheDir('cache') +env = Environment() +env.Program('hello.c') +CacheDir('cache') - hello.c +hello.c - CacheDir('/usr/local/build_cache') +CacheDir('/usr/local/build_cache') @@ -205,14 +205,14 @@ - env = Environment() - obj = env.Object('hello.c') - env.Program('hello.c') - CacheDir('cache') - NoCache('hello.o') +env = Environment() +obj = env.Object('hello.c') +env.Program('hello.c') +CacheDir('cache') +NoCache('hello.o') - hello.c +hello.c @@ -241,15 +241,15 @@ --> - % scons -Q - cc -o hello.o -c hello.c - cc -o hello hello.o - % scons -Q -c - Removed hello.o - Removed hello - % scons -Q - cc -o hello.o -c hello.c - Retrieved `hello' from cache +% scons -Q +cc -o hello.o -c hello.c +cc -o hello hello.o +% scons -Q -c +Removed hello.o +Removed hello +% scons -Q +cc -o hello.o -c hello.c +Retrieved `hello' from cache @@ -367,8 +367,8 @@ - Program('prog', - ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c']) +Program('prog', + ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c']) f1.c f2.c @@ -479,9 +479,9 @@ - SetOption('random', 1) - Program('prog', - ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c']) +SetOption('random', 1) +Program('prog', + ['f1.c', 'f2.c', 'f3.c', 'f4.c', 'f5.c']) f1.c f2.c diff --git a/doc/user/command-line.xml b/doc/user/command-line.xml index a167eca..d2e4146 100644 --- a/doc/user/command-line.xml +++ b/doc/user/command-line.xml @@ -170,16 +170,16 @@ - def b(target, source, env): - pass - def s(target, source, env): - return " ... [build output] ..." - a = Action(b, strfunction = s) - env = Environment(BUILDERS = {'A' : Builder(action=a)}) - env.A('foo.out', 'foo.in') +def b(target, source, env): + pass +def s(target, source, env): + return " ... [build output] ..." +a = Action(b, strfunction = s) +env = Environment(BUILDERS = {'A' : Builder(action=a)}) +env.A('foo.out', 'foo.in') - foo.in +foo.in @@ -197,7 +197,7 @@ - $ setenv SCONSFLAGS "-Q" +$ setenv SCONSFLAGS "-Q" @@ -244,8 +244,8 @@ - if not GetOption('help'): - SConscript('src/SConscript', export='env') +if not GetOption('help'): + SConscript('src/SConscript', export='env') @@ -314,13 +314,13 @@ - import os - num_cpu = int(os.environ.get('NUM_CPU', 2)) - SetOption('num_jobs', num_cpu) - print "running with -j", GetOption('num_jobs') +import os +num_cpu = int(os.environ.get('NUM_CPU', 2)) +SetOption('num_jobs', num_cpu) +print "running with -j", GetOption('num_jobs') - foo.in +foo.in @@ -699,7 +699,7 @@ - % scons -Q debug=1 +% scons -Q debug=1 @@ -733,14 +733,14 @@ - env = Environment() - debug = ARGUMENTS.get('debug', 0) - if int(debug): - env.Append(CCFLAGS = '-g') - env.Program('prog.c') +env = Environment() +debug = ARGUMENTS.get('debug', 0) +if int(debug): + env.Append(CCFLAGS = '-g') +env.Program('prog.c') - prog.c +prog.c @@ -822,15 +822,15 @@ - cppdefines = [] - for key, value in ARGLIST: - if key == 'define': - cppdefines.append(value) - env = Environment(CPPDEFINES = cppdefines) - env.Object('prog.c') +cppdefines = [] +for key, value in ARGLIST: + if key == 'define': + cppdefines.append(value) +env = Environment(CPPDEFINES = cppdefines) +env.Object('prog.c') - prog.c +prog.c @@ -907,17 +907,17 @@ - vars = Variables(None, ARGUMENTS) - vars.Add('RELEASE', 'Set to 1 to build for release', 0) - env = Environment(variables = vars, - CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) - env.Program(['foo.c', 'bar.c']) +vars = Variables(None, ARGUMENTS) +vars.Add('RELEASE', 'Set to 1 to build for release', 0) +env = Environment(variables = vars, + CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) +env.Program(['foo.c', 'bar.c']) - foo.c +foo.c - bar.c +bar.c @@ -998,10 +998,10 @@ - vars = Variables(None, ARGUMENTS) - vars.Add('RELEASE', 'Set to 1 to build for release', 0) - env = Environment(variables = vars) - Help(vars.GenerateHelpText(env)) +vars = Variables(None, ARGUMENTS) +vars.Add('RELEASE', 'Set to 1 to build for release', 0) +env = Environment(variables = vars) +Help(vars.GenerateHelpText(env)) @@ -1045,21 +1045,21 @@ - vars = Variables('custom.py') - vars.Add('RELEASE', 'Set to 1 to build for release', 0) - env = Environment(variables = vars, - CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) - env.Program(['foo.c', 'bar.c']) - Help(vars.GenerateHelpText(env)) +vars = Variables('custom.py') +vars.Add('RELEASE', 'Set to 1 to build for release', 0) +env = Environment(variables = vars, + CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) +env.Program(['foo.c', 'bar.c']) +Help(vars.GenerateHelpText(env)) - foo.c +foo.c - bar.c +bar.c - RELEASE = 1 +RELEASE = 1 @@ -1128,7 +1128,7 @@ - vars = Variables('custom.py', ARGUMENTS) +vars = Variables('custom.py', ARGUMENTS) @@ -1182,14 +1182,14 @@ - vars = Variables('custom.py') - vars.Add(BoolVariable('RELEASE', 'Set to build for release', 0)) - env = Environment(variables = vars, - CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(BoolVariable('RELEASE', 'Set to build for release', 0)) +env = Environment(variables = vars, + CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) +env.Program('foo.c') - foo.c +foo.c @@ -1286,15 +1286,15 @@ - vars = Variables('custom.py') - vars.Add(EnumVariable('COLOR', 'Set background color', 'red', - allowed_values=('red', 'green', 'blue'))) - env = Environment(variables = vars, - CPPDEFINES={'COLOR' : '"${COLOR}"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(EnumVariable('COLOR', 'Set background color', 'red', + allowed_values=('red', 'green', 'blue'))) +env = Environment(variables = vars, + CPPDEFINES={'COLOR' : '"${COLOR}"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1340,16 +1340,16 @@ - vars = Variables('custom.py') - vars.Add(EnumVariable('COLOR', 'Set background color', 'red', - allowed_values=('red', 'green', 'blue'), - map={'navy':'blue'})) - env = Environment(variables = vars, - CPPDEFINES={'COLOR' : '"${COLOR}"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(EnumVariable('COLOR', 'Set background color', 'red', + allowed_values=('red', 'green', 'blue'), + map={'navy':'blue'})) +env = Environment(variables = vars, + CPPDEFINES={'COLOR' : '"${COLOR}"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1395,17 +1395,17 @@ - vars = Variables('custom.py') - vars.Add(EnumVariable('COLOR', 'Set background color', 'red', - allowed_values=('red', 'green', 'blue'), - map={'navy':'blue'}, - ignorecase=1)) - env = Environment(variables = vars, - CPPDEFINES={'COLOR' : '"${COLOR}"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(EnumVariable('COLOR', 'Set background color', 'red', + allowed_values=('red', 'green', 'blue'), + map={'navy':'blue'}, + ignorecase=1)) +env = Environment(variables = vars, + CPPDEFINES={'COLOR' : '"${COLOR}"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1435,17 +1435,17 @@ - vars = Variables('custom.py') - vars.Add(EnumVariable('COLOR', 'Set background color', 'red', - allowed_values=('red', 'green', 'blue'), - map={'navy':'blue'}, - ignorecase=2)) - env = Environment(variables = vars, - CPPDEFINES={'COLOR' : '"${COLOR}"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(EnumVariable('COLOR', 'Set background color', 'red', + allowed_values=('red', 'green', 'blue'), + map={'navy':'blue'}, + ignorecase=2)) +env = Environment(variables = vars, + CPPDEFINES={'COLOR' : '"${COLOR}"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1484,15 +1484,15 @@ - vars = Variables('custom.py') - vars.Add(ListVariable('COLORS', 'List of colors', 0, - ['red', 'green', 'blue'])) - env = Environment(variables = vars, - CPPDEFINES={'COLORS' : '"${COLORS}"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(ListVariable('COLORS', 'List of colors', 0, + ['red', 'green', 'blue'])) +env = Environment(variables = vars, + CPPDEFINES={'COLORS' : '"${COLORS}"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1555,22 +1555,22 @@ - vars = Variables('custom.py') - vars.Add(PathVariable('CONFIG', - 'Path to configuration file', - '__ROOT__/etc/my_config')) - env = Environment(variables = vars, - CPPDEFINES={'CONFIG_FILE' : '"$CONFIG"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PathVariable('CONFIG', + 'Path to configuration file', + '__ROOT__/etc/my_config')) +env = Environment(variables = vars, + CPPDEFINES={'CONFIG_FILE' : '"$CONFIG"'}) +env.Program('foo.c') - foo.c +foo.c - /opt/location +/opt/location - /opt/location +/opt/location @@ -1611,20 +1611,20 @@ - vars = Variables('custom.py') - vars.Add(PathVariable('CONFIG', - 'Path to configuration file', - '__ROOT__/etc/my_config', - PathVariable.PathIsFile)) - env = Environment(variables = vars, - CPPDEFINES={'CONFIG_FILE' : '"$CONFIG"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PathVariable('CONFIG', + 'Path to configuration file', + '__ROOT__/etc/my_config', + PathVariable.PathIsFile)) +env = Environment(variables = vars, + CPPDEFINES={'CONFIG_FILE' : '"$CONFIG"'}) +env.Program('foo.c') - foo.c +foo.c - /opt/location +/opt/location @@ -1638,20 +1638,20 @@ - vars = Variables('custom.py') - vars.Add(PathVariable('DBDIR', - 'Path to database directory', - '__ROOT__/var/my_dbdir', - PathVariable.PathIsDir)) - env = Environment(variables = vars, - CPPDEFINES={'DBDIR' : '"$DBDIR"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PathVariable('DBDIR', + 'Path to database directory', + '__ROOT__/var/my_dbdir', + PathVariable.PathIsDir)) +env = Environment(variables = vars, + CPPDEFINES={'DBDIR' : '"$DBDIR"'}) +env.Program('foo.c') - foo.c +foo.c - /opt/location +/opt/location @@ -1667,20 +1667,20 @@ - vars = Variables('custom.py') - vars.Add(PathVariable('DBDIR', - 'Path to database directory', - '__ROOT__/var/my_dbdir', - PathVariable.PathIsDirCreate)) - env = Environment(variables = vars, - CPPDEFINES={'DBDIR' : '"$DBDIR"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PathVariable('DBDIR', + 'Path to database directory', + '__ROOT__/var/my_dbdir', + PathVariable.PathIsDirCreate)) +env = Environment(variables = vars, + CPPDEFINES={'DBDIR' : '"$DBDIR"'}) +env.Program('foo.c') - foo.c +foo.c - /opt/location +/opt/location @@ -1695,17 +1695,17 @@ - vars = Variables('custom.py') - vars.Add(PathVariable('OUTPUT', - 'Path to output file or directory', - None, - PathVariable.PathAccept)) - env = Environment(variables = vars, - CPPDEFINES={'OUTPUT' : '"$OUTPUT"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PathVariable('OUTPUT', + 'Path to output file or directory', + None, + PathVariable.PathAccept)) +env = Environment(variables = vars, + CPPDEFINES={'OUTPUT' : '"$OUTPUT"'}) +env.Program('foo.c') - foo.c +foo.c @@ -1730,22 +1730,22 @@ - vars = Variables('custom.py') - vars.Add(PackageVariable('PACKAGE', - 'Location package', - '__ROOT__/opt/location')) - env = Environment(variables = vars, - CPPDEFINES={'PACKAGE' : '"$PACKAGE"'}) - env.Program('foo.c') +vars = Variables('custom.py') +vars.Add(PackageVariable('PACKAGE', + 'Location package', + '__ROOT__/opt/location')) +env = Environment(variables = vars, + CPPDEFINES={'PACKAGE' : '"$PACKAGE"'}) +env.Program('foo.c') - foo.c +foo.c - /opt/location +/opt/location - /opt/location +/opt/location @@ -1796,23 +1796,23 @@ - vars = Variables() - vars.AddVariables( - ('RELEASE', 'Set to 1 to build for release', 0), - ('CONFIG', 'Configuration file', '/etc/my_config'), - BoolVariable('warnings', 'compilation with -Wall and similiar', 1), - EnumVariable('debug', 'debug output and symbols', 'no', - allowed_values=('yes', 'no', 'full'), - map={}, ignorecase=0), # case sensitive - ListVariable('shared', - 'libraries to build as shared libraries', - 'all', - names = list_of_libs), - PackageVariable('x11', - 'use X11 installed here (yes = search some places)', - 'yes'), - PathVariable('qtdir', 'where the root of Qt is installed', qtdir), - ) +vars = Variables() +vars.AddVariables( + ('RELEASE', 'Set to 1 to build for release', 0), + ('CONFIG', 'Configuration file', '/etc/my_config'), + BoolVariable('warnings', 'compilation with -Wall and similiar', 1), + EnumVariable('debug', 'debug output and symbols', 'no', + allowed_values=('yes', 'no', 'full'), + map={}, ignorecase=0), # case sensitive + ListVariable('shared', + 'libraries to build as shared libraries', + 'all', + names = list_of_libs), + PackageVariable('x11', + 'use X11 installed here (yes = search some places)', + 'yes'), + PathVariable('qtdir', 'where the root of Qt is installed', qtdir), +) @@ -1857,18 +1857,18 @@ - vars = Variables(None) - vars.Add('RELEASE', 'Set to 1 to build for release', 0) - env = Environment(variables = vars, - CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) - unknown = vars.UnknownVariables() - if unknown: - print "Unknown variables:", unknown.keys() - Exit(1) - env.Program('foo.c') +vars = Variables(None) +vars.Add('RELEASE', 'Set to 1 to build for release', 0) +env = Environment(variables = vars, + CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) +unknown = vars.UnknownVariables() +if unknown: + print "Unknown variables:", unknown.keys() + Exit(1) +env.Program('foo.c') - foo.c +foo.c @@ -1944,16 +1944,16 @@ - if 'bar' in COMMAND_LINE_TARGETS: - print "Don't forget to copy `bar' to the archive!" - Default(Program('foo.c')) - Program('bar.c') +if 'bar' in COMMAND_LINE_TARGETS: + print "Don't forget to copy `bar' to the archive!" +Default(Program('foo.c')) +Program('bar.c') - foo.c +foo.c - foo.c +foo.c @@ -2006,16 +2006,16 @@ - env = Environment() - hello = env.Program('hello.c') - env.Program('goodbye.c') - Default(hello) +env = Environment() +hello = env.Program('hello.c') +env.Program('goodbye.c') +Default(hello) - hello.c +hello.c - goodbye.c +goodbye.c @@ -2060,21 +2060,21 @@ - env = Environment() - prog1 = env.Program('prog1.c') - Default(prog1) - prog2 = env.Program('prog2.c') - prog3 = env.Program('prog3.c') - Default(prog3) +env = Environment() +prog1 = env.Program('prog1.c') +Default(prog1) +prog2 = env.Program('prog2.c') +prog3 = env.Program('prog3.c') +Default(prog3) - prog1.c +prog1.c - prog2.c +prog2.c - prog3.c +prog3.c @@ -2086,11 +2086,11 @@ - env = Environment() - prog1 = env.Program('prog1.c') - prog2 = env.Program('prog2.c') - prog3 = env.Program('prog3.c') - Default(prog1, prog3) +env = Environment() +prog1 = env.Program('prog1.c') +prog2 = env.Program('prog2.c') +prog3 = env.Program('prog3.c') +Default(prog1, prog3) @@ -2118,24 +2118,24 @@ - env = Environment() - env.Program(['prog1/main.c', 'prog1/foo.c']) - env.Program(['prog2/main.c', 'prog2/bar.c']) - Default('prog1') +env = Environment() +env.Program(['prog1/main.c', 'prog1/foo.c']) +env.Program(['prog2/main.c', 'prog2/bar.c']) +Default('prog1') - int main() { printf("prog1/main.c\n"); } +int main() { printf("prog1/main.c\n"); } - int foo() { printf("prog1/foo.c\n"); } +int foo() { printf("prog1/foo.c\n"); } - int main() { printf("prog2/main.c\n"); } +int main() { printf("prog2/main.c\n"); } - int bar() { printf("prog2/bar.c\n"); } +int bar() { printf("prog2/bar.c\n"); } @@ -2163,16 +2163,16 @@ - env = Environment() - prog1 = env.Program('prog1.c') - prog2 = env.Program('prog2.c') - Default(None) +env = Environment() +prog1 = env.Program('prog1.c') +prog2 = env.Program('prog2.c') +Default(None) - prog1.c +prog1.c - prog2.c +prog2.c @@ -2208,12 +2208,12 @@ - prog1 = Program('prog1.c') - Default(prog1) - print "DEFAULT_TARGETS is", map(str, DEFAULT_TARGETS) +prog1 = Program('prog1.c') +Default(prog1) +print "DEFAULT_TARGETS is", map(str, DEFAULT_TARGETS) - prog1.c +prog1.c @@ -2242,18 +2242,18 @@ - prog1 = Program('prog1.c') - Default(prog1) - print "DEFAULT_TARGETS is now", map(str, DEFAULT_TARGETS) - prog2 = Program('prog2.c') - Default(prog2) - print "DEFAULT_TARGETS is now", map(str, DEFAULT_TARGETS) +prog1 = Program('prog1.c') +Default(prog1) +print "DEFAULT_TARGETS is now", map(str, DEFAULT_TARGETS) +prog2 = Program('prog2.c') +Default(prog2) +print "DEFAULT_TARGETS is now", map(str, DEFAULT_TARGETS) - prog1.c +prog1.c - prog2.c +prog2.c @@ -2304,10 +2304,10 @@ - if COMMAND_LINE_TARGETS: - targets = COMMAND_LINE_TARGETS - else: - targets = DEFAULT_TARGETS +if COMMAND_LINE_TARGETS: + targets = COMMAND_LINE_TARGETS +else: + targets = DEFAULT_TARGETS @@ -2335,16 +2335,16 @@ - prog1 = Program('prog1.c') - Program('prog2.c') - Default(prog1) - print "BUILD_TARGETS is", map(str, BUILD_TARGETS) +prog1 = Program('prog1.c') +Program('prog2.c') +Default(prog1) +print "BUILD_TARGETS is", map(str, BUILD_TARGETS) - prog1.c +prog1.c - prog2.c +prog2.c diff --git a/doc/user/depends.xml b/doc/user/depends.xml index d252544..2dd7ea6 100644 --- a/doc/user/depends.xml +++ b/doc/user/depends.xml @@ -60,10 +60,10 @@ - Program('hello.c') +Program('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -173,8 +173,8 @@ - Program('hello.c') - Decider('MD5') +Program('hello.c') +Decider('MD5') @@ -270,11 +270,11 @@ - Object('hello.c') - Decider('timestamp-newer') +Object('hello.c') +Decider('timestamp-newer') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -303,8 +303,8 @@ - Object('hello.c') - Decider('make') +Object('hello.c') +Decider('make') @@ -339,11 +339,11 @@ - Object('hello.c') - Decider('timestamp-match') +Object('hello.c') +Decider('timestamp-match') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -398,11 +398,11 @@ - Program('hello.c') - Decider('MD5-timestamp') +Program('hello.c') +Decider('MD5-timestamp') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -431,17 +431,17 @@ --> - % scons -Q hello - cc -o hello.o -c hello.c - cc -o hello hello.o - % touch hello.c - % scons -Q hello - scons: `hello' is up to date. - % edit hello.c - [CHANGE THE CONTENTS OF hello.c] - % scons -Q hello - cc -o hello.o -c hello.c - cc -o hello hello.o +% scons -Q hello +cc -o hello.o -c hello.c +cc -o hello hello.o +% touch hello.c +% scons -Q hello +scons: `hello' is up to date. +% edit hello.c + [CHANGE THE CONTENTS OF hello.c] +% scons -Q hello +cc -o hello.o -c hello.c +cc -o hello hello.o @@ -516,18 +516,18 @@ - Program('hello.c') - def decide_if_changed(dependency, target, prev_ni): - if self.get_timestamp() != prev_ni.timestamp: - dep = str(dependency) - tgt = str(target) - if specific_part_of_file_has_changed(dep, tgt): - return True - return False - Decider(decide_if_changed) +Program('hello.c') +def decide_if_changed(dependency, target, prev_ni): + if self.get_timestamp() != prev_ni.timestamp: + dep = str(dependency) + tgt = str(target) + if specific_part_of_file_has_changed(dep, tgt): + return True + return False +Decider(decide_if_changed) - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -635,35 +635,35 @@ - env = Environment() - - def config_file_decider(dependency, target, prev_ni): - import os.path - - # We always have to init the .csig value... - dep_csig = dependency.get_csig() - # .csig may not exist, because no target was built yet... - if 'csig' not in dir(prev_ni): - return True - # Target file may not exist yet - if not os.path.exists(str(target.abspath)): - return True - if dep_csig != prev_ni.csig: - # Some change on source file => update installed one - return True - return False - - def update_file(): - f = open("test.txt","a") - f.write("some line\n") - f.close() - - update_file() - - # Activate our own decider function - env.Decider(config_file_decider) - - env.Install("install","test.txt") +env = Environment() + +def config_file_decider(dependency, target, prev_ni): + import os.path + + # We always have to init the .csig value... + dep_csig = dependency.get_csig() + # .csig may not exist, because no target was built yet... + if 'csig' not in dir(prev_ni): + return True + # Target file may not exist yet + if not os.path.exists(str(target.abspath)): + return True + if dep_csig != prev_ni.csig: + # Some change on source file => update installed one + return True + return False + +def update_file(): + f = open("test.txt","a") + f.write("some line\n") + f.close() + +update_file() + +# Activate our own decider function +env.Decider(config_file_decider) + +env.Install("install","test.txt") @@ -698,22 +698,22 @@ - env1 = Environment(CPPPATH = ['.']) - env2 = env1.Clone() - env2.Decider('timestamp-match') - env1.Program('prog-MD5', 'program1.c') - env2.Program('prog-timestamp', 'program2.c') +env1 = Environment(CPPPATH = ['.']) +env2 = env1.Clone() +env2.Decider('timestamp-match') +env1.Program('prog-MD5', 'program1.c') +env2.Program('prog-timestamp', 'program2.c') - #include "inc.h" - int main() { printf("Hello, world!\n"); } +#include "inc.h" +int main() { printf("Hello, world!\n"); } - #include "inc.h" - int main() { printf("Hello, world!\n"); } +#include "inc.h" +int main() { printf("Hello, world!\n"); } - #define INC 1 +#define INC 1 @@ -771,8 +771,8 @@ - Program('hello.c') - SourceSignatures('MD5') +Program('hello.c') +SourceSignatures('MD5') @@ -782,8 +782,8 @@ - Program('hello.c') - SourceSignatures('timestamp') +Program('hello.c') +SourceSignatures('timestamp') @@ -839,8 +839,8 @@ - Program('hello.c') - TargetSignatures('MD5') +Program('hello.c') +TargetSignatures('MD5') @@ -853,8 +853,8 @@ - Program('hello.c') - TargetSignatures('timestamp') +Program('hello.c') +TargetSignatures('timestamp') @@ -882,9 +882,9 @@ - Program('hello.c') - TargetSignatures('source') - SourceSignatures('timestamp') +Program('hello.c') +TargetSignatures('source') +SourceSignatures('timestamp') @@ -949,18 +949,18 @@ - Program('hello.c', CPPPATH = '.') +Program('hello.c', CPPPATH = '.') - #include <hello.h> - int - main() - { - printf("Hello, %s!\n", string); - } +#include <hello.h> +int +main() +{ + printf("Hello, %s!\n", string); +} - #define string "world" +#define string "world" @@ -1049,10 +1049,10 @@ - Program('hello.c', CPPPATH = ['include', '/home/project/inc']) +Program('hello.c', CPPPATH = ['include', '/home/project/inc']) - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -1142,7 +1142,7 @@ - SetOption('implicit_cache', 1) +SetOption('implicit_cache', 1) @@ -1291,23 +1291,23 @@ - hello = Program('hello.c') - Depends(hello, 'other_file') +hello = Program('hello.c') +Depends(hello, 'other_file') - % scons -Q hello - cc -c hello.c -o hello.o - cc -o hello hello.o - % scons -Q hello - scons: `hello' is up to date. - % edit other_file - [CHANGE THE CONTENTS OF other_file] - % scons -Q hello - cc -c hello.c -o hello.o - cc -o hello hello.o +% scons -Q hello +cc -c hello.c -o hello.o +cc -o hello hello.o +% scons -Q hello +scons: `hello' is up to date. +% edit other_file + [CHANGE THE CONTENTS OF other_file] +% scons -Q hello +cc -c hello.c -o hello.o +cc -o hello hello.o @@ -1320,9 +1320,9 @@ - hello = Program('hello.c') - goodbye = Program('goodbye.c') - Depends(hello, goodbye) +hello = Program('hello.c') +goodbye = Program('goodbye.c') +Depends(hello, goodbye) @@ -1333,11 +1333,11 @@ - % scons -Q hello - cc -c goodbye.c -o goodbye.o - cc -o goodbye goodbye.o - cc -c hello.c -o hello.o - cc -o hello hello.o +% scons -Q hello +cc -c goodbye.c -o goodbye.o +cc -o goodbye goodbye.o +cc -c hello.c -o hello.o +cc -o hello hello.o @@ -1480,14 +1480,14 @@ --> - % scons -Q - cc -o hello.o -c -MD -MF hello.d -I. hello.c - cc -o hello hello.o - % scons -Q --debug=explain - scons: rebuilding `hello.o' because `foo.h' is a new dependency - cc -o hello.o -c -MD -MF hello.d -I. hello.c - % scons -Q - scons: `.' is up to date. +% scons -Q +cc -o hello.o -c -MD -MF hello.d -I. hello.c +cc -o hello hello.o +% scons -Q --debug=explain +scons: rebuilding `hello.o' because `foo.h' is a new dependency +cc -o hello.o -c -MD -MF hello.d -I. hello.c +% scons -Q +scons: `.' is up to date. @@ -1532,16 +1532,16 @@ - hello_obj=Object('hello.c') - hello = Program(hello_obj) - Ignore(hello_obj, 'hello.h') +hello_obj=Object('hello.c') +hello = Program(hello_obj) +Ignore(hello_obj, 'hello.h') - #include "hello.h" - int main() { printf("Hello, %s!\n", string); } +#include "hello.h" +int main() { printf("Hello, %s!\n", string); } - #define string "world" +#define string "world" @@ -1558,15 +1558,15 @@ --> - % scons -Q hello - cc -c -o hello.o hello.c - cc -o hello hello.o - % scons -Q hello - scons: `hello' is up to date. - % edit hello.h - [CHANGE THE CONTENTS OF hello.h] - % scons -Q hello - scons: `hello' is up to date. +% scons -Q hello +cc -c -o hello.o hello.c +cc -o hello hello.o +% scons -Q hello +scons: `hello' is up to date. +% edit hello.h + [CHANGE THE CONTENTS OF hello.h] +% scons -Q hello +scons: `hello' is up to date. @@ -1591,8 +1591,8 @@ - hello = Program('hello.c', CPPPATH=['/usr/include']) - Ignore(hello, '/usr/include/stdio.h') +hello = Program('hello.c', CPPPATH=['/usr/include']) +Ignore(hello, '/usr/include/stdio.h') @@ -1608,13 +1608,13 @@ - hello_obj=Object('hello.c') - hello = Program(hello_obj) - Ignore('.',[hello,hello_obj]) +hello_obj=Object('hello.c') +hello = Program(hello_obj) +Ignore('.',[hello,hello_obj]) - #include "stdio.h" - int main() { printf("Hello!\n"); } +#include "stdio.h" +int main() { printf("Hello!\n"); } @@ -1801,11 +1801,11 @@ - hello = Program('hello.c') - AlwaysBuild(hello) +hello = Program('hello.c') +AlwaysBuild(hello) - int main() { printf("Hello, %s!\n", string); } +int main() { printf("Hello, %s!\n", string); } diff --git a/doc/user/environments.xml b/doc/user/environments.xml index 0a4192f..f11a95b 100644 --- a/doc/user/environments.xml +++ b/doc/user/environments.xml @@ -490,10 +490,10 @@ environment, of directory names, suffixes, etc. - import os +import os - int main() { } +int main() { } @@ -546,7 +546,7 @@ environment, of directory names, suffixes, etc. - env = Environment() +env = Environment() @@ -626,8 +626,8 @@ environment, of directory names, suffixes, etc. - env = Environment() - print "CC is:", env['CC'] +env = Environment() +print "CC is:", env['CC'] @@ -655,10 +655,10 @@ environment, of directory names, suffixes, etc. - env = Environment(FOO = 'foo', BAR = 'bar') - dict = env.Dictionary() - for key in ['OBJSUFFIX', 'LIBSUFFIX', 'PROGSUFFIX']: - print "key = %s, value = %s" % (key, dict[key]) +env = Environment(FOO = 'foo', BAR = 'bar') +dict = env.Dictionary() +for key in ['OBJSUFFIX', 'LIBSUFFIX', 'PROGSUFFIX']: + print "key = %s, value = %s" % (key, dict[key]) @@ -693,9 +693,9 @@ environment, of directory names, suffixes, etc. - env = Environment() - for item in sorted(env.Dictionary().items()): - print "construction variable = '%s', value = '%s'" % item +env = Environment() +for item in sorted(env.Dictionary().items()): + print "construction variable = '%s', value = '%s'" % item @@ -720,8 +720,8 @@ environment, of directory names, suffixes, etc. - env = Environment() - print "CC is:", env.subst('$CC') +env = Environment() +print "CC is:", env.subst('$CC') @@ -737,8 +737,8 @@ environment, of directory names, suffixes, etc. - env = Environment(CCFLAGS = '-DFOO') - print "CCCOM is:", env['CCCOM'] +env = Environment(CCFLAGS = '-DFOO') +print "CCCOM is:", env['CCCOM'] @@ -750,9 +750,9 @@ environment, of directory names, suffixes, etc. - % scons -Q - CCCOM is: $CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES - scons: `.' is up to date. +% scons -Q +CCCOM is: $CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES +scons: `.' is up to date. @@ -763,8 +763,8 @@ environment, of directory names, suffixes, etc. - env = Environment(CCFLAGS = '-DFOO') - print "CCCOM is:", env.subst('$CCCOM') +env = Environment(CCFLAGS = '-DFOO') +print "CCCOM is:", env.subst('$CCCOM') @@ -777,9 +777,9 @@ environment, of directory names, suffixes, etc. - % scons -Q - CCCOM is: gcc -DFOO -c -o - scons: `.' is up to date. +% scons -Q +CCCOM is: gcc -DFOO -c -o +scons: `.' is up to date. @@ -805,8 +805,8 @@ environment, of directory names, suffixes, etc. - env = Environment() - print "value is:", env.subst( '->$MISSING<-' ) +env = Environment() +print "value is:", env.subst( '->$MISSING<-' ) @@ -832,9 +832,9 @@ environment, of directory names, suffixes, etc. - AllowSubstExceptions() - env = Environment() - print "value is:", env.subst( '->$MISSING<-' ) +AllowSubstExceptions() +env = Environment() +print "value is:", env.subst( '->$MISSING<-' ) @@ -852,9 +852,9 @@ environment, of directory names, suffixes, etc. - AllowSubstExceptions(IndexError, NameError, ZeroDivisionError) - env = Environment() - print "value is:", env.subst( '->${1 / 0}<-' ) +AllowSubstExceptions(IndexError, NameError, ZeroDivisionError) +env = Environment() +print "value is:", env.subst( '->${1 / 0}<-' ) @@ -1190,12 +1190,12 @@ environment, of directory names, suffixes, etc. - env = Environment(CCFLAGS = '-DDEFINE1') - env.Replace(CCFLAGS = '-DDEFINE2') - env.Program('foo.c') +env = Environment(CCFLAGS = '-DDEFINE1') +env.Replace(CCFLAGS = '-DDEFINE2') +env.Program('foo.c') - int main() { } +int main() { } @@ -1222,9 +1222,9 @@ environment, of directory names, suffixes, etc. - env = Environment() - env.Replace(NEW_VARIABLE = 'xyzzy') - print "NEW_VARIABLE =", env['NEW_VARIABLE'] +env = Environment() +env.Replace(NEW_VARIABLE = 'xyzzy') +print "NEW_VARIABLE =", env['NEW_VARIABLE'] @@ -1321,7 +1321,7 @@ environment, of directory names, suffixes, etc. - env.SetDefault(SPECIAL_FLAG = '-extra-option') +env.SetDefault(SPECIAL_FLAG = '-extra-option') @@ -1352,12 +1352,12 @@ environment, of directory names, suffixes, etc. - env = Environment(CCFLAGS = ['-DMY_VALUE']) - env.Append(CCFLAGS = ['-DLAST']) - env.Program('foo.c') +env = Environment(CCFLAGS = ['-DMY_VALUE']) +env.Append(CCFLAGS = ['-DLAST']) +env.Program('foo.c') - int main() { } +int main() { } @@ -1381,9 +1381,9 @@ environment, of directory names, suffixes, etc. - env = Environment() - env.Append(NEW_VARIABLE = 'added') - print "NEW_VARIABLE =", env['NEW_VARIABLE'] +env = Environment() +env.Append(NEW_VARIABLE = 'added') +print "NEW_VARIABLE =", env['NEW_VARIABLE'] @@ -1425,7 +1425,7 @@ environment, of directory names, suffixes, etc. - env.AppendUnique(CCFLAGS=['-g']) +env.AppendUnique(CCFLAGS=['-g']) @@ -1452,12 +1452,12 @@ environment, of directory names, suffixes, etc. - env = Environment(CCFLAGS = ['-DMY_VALUE']) - env.Prepend(CCFLAGS = ['-DFIRST']) - env.Program('foo.c') +env = Environment(CCFLAGS = ['-DMY_VALUE']) +env.Prepend(CCFLAGS = ['-DFIRST']) +env.Program('foo.c') - int main() { } +int main() { } @@ -1481,9 +1481,9 @@ environment, of directory names, suffixes, etc. - env = Environment() - env.Prepend(NEW_VARIABLE = 'added') - print "NEW_VARIABLE =", env['NEW_VARIABLE'] +env = Environment() +env.Prepend(NEW_VARIABLE = 'added') +print "NEW_VARIABLE =", env['NEW_VARIABLE'] @@ -1527,7 +1527,7 @@ environment, of directory names, suffixes, etc. - env.PrependUnique(CCFLAGS=['-g']) +env.PrependUnique(CCFLAGS=['-g']) @@ -1598,8 +1598,8 @@ environment, of directory names, suffixes, etc. - path = ['/usr/local/bin', '/bin', '/usr/bin'] - env = Environment(ENV = {'PATH' : path}) +path = ['/usr/local/bin', '/bin', '/usr/bin'] +env = Environment(ENV = {'PATH' : path}) @@ -1618,7 +1618,7 @@ environment, of directory names, suffixes, etc. - env['ENV']['PATH'] = ['/usr/local/bin', '/bin', '/usr/bin'] +env['ENV']['PATH'] = ['/usr/local/bin', '/bin', '/usr/bin'] @@ -1631,7 +1631,7 @@ environment, of directory names, suffixes, etc. - env['ENV']['PATH'] = '/usr/local/bin:/bin:/usr/bin' +env['ENV']['PATH'] = '/usr/local/bin:/bin:/usr/bin' @@ -1646,19 +1646,19 @@ environment, of directory names, suffixes, etc. - env = Environment() - env.Command('foo', [], '__ROOT__/usr/bin/printenv.py') +env = Environment() +env.Command('foo', [], '__ROOT__/usr/bin/printenv.py') - #!/usr/bin/env python - import os - import sys - if len(sys.argv) > 1: - keys = sys.argv[1:] - else: - keys = sorted(os.environ.keys()) - for key in keys: - print " " + key + "=" + os.environ[key] +#!/usr/bin/env python +import os +import sys +if len(sys.argv) > 1: + keys = sys.argv[1:] +else: + keys = sorted(os.environ.keys()) +for key in keys: + print " " + key + "=" + os.environ[key] @@ -1689,8 +1689,8 @@ environment, of directory names, suffixes, etc. - import os - env = Environment(ENV = {'PATH' : os.environ['PATH']}) +import os +env = Environment(ENV = {'PATH' : os.environ['PATH']}) @@ -1705,8 +1705,8 @@ environment, of directory names, suffixes, etc. - import os - env = Environment(ENV = os.environ) +import os +env = Environment(ENV = os.environ) @@ -1752,9 +1752,9 @@ environment, of directory names, suffixes, etc. - env = Environment(ENV = os.environ) - env.PrependENVPath('PATH', '/usr/local/bin') - env.AppendENVPath('LIB', '/usr/local/lib') +env = Environment(ENV = os.environ) +env.PrependENVPath('PATH', '/usr/local/bin') +env.AppendENVPath('LIB', '/usr/local/lib') diff --git a/doc/user/factories.xml b/doc/user/factories.xml index 15a962d..93283bb 100644 --- a/doc/user/factories.xml +++ b/doc/user/factories.xml @@ -84,7 +84,7 @@ - Command("file.out", "file.in", Copy("$TARGET", "$SOURCE")) +Command("file.out", "file.in", Copy("$TARGET", "$SOURCE")) file.in @@ -113,7 +113,7 @@ - Command("file.out", [], Copy("$TARGET", "file.in")) +Command("file.out", [], Copy("$TARGET", "file.in")) file.in @@ -147,22 +147,22 @@ - Command("file.out", "file.in", - [ - Copy("tempfile", "$SOURCE"), - "modify tempfile", - Copy("$TARGET", "tempfile"), - ]) +Command("file.out", "file.in", + [ + Copy("tempfile", "$SOURCE"), + "modify tempfile", + Copy("$TARGET", "tempfile"), + ]) - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') file.in - touch $* +touch $* @@ -198,23 +198,23 @@ - Command("file.out", "file.in", - [ - Delete("tempfile"), - Copy("tempfile", "$SOURCE"), - "modify tempfile", - Copy("$TARGET", "tempfile"), - ]) +Command("file.out", "file.in", + [ + Delete("tempfile"), + Copy("tempfile", "$SOURCE"), + "modify tempfile", + Copy("$TARGET", "tempfile"), + ]) - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') file.in - touch $* +touch $* @@ -239,11 +239,11 @@ - Command("file.out", "file.in", - [ - Delete("$TARGET"), - Copy("$TARGET", "$SOURCE") - ]) +Command("file.out", "file.in", + [ + Delete("$TARGET"), + Copy("$TARGET", "$SOURCE") + ]) file.in @@ -293,22 +293,22 @@ - Command("file.out", "file.in", - [ - Copy("tempfile", "$SOURCE"), - "modify tempfile", - Move("$TARGET", "tempfile"), - ]) +Command("file.out", "file.in", + [ + Copy("tempfile", "$SOURCE"), + "modify tempfile", + Move("$TARGET", "tempfile"), + ]) - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') file.in - touch $* +touch $* @@ -337,17 +337,17 @@ - Command("file.out", "file.in", - [ - Copy("$TARGET", "$SOURCE"), - Touch("$TARGET"), - ]) +Command("file.out", "file.in", + [ + Copy("$TARGET", "$SOURCE"), + Touch("$TARGET"), + ]) - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') file.in @@ -381,25 +381,25 @@ - Command("file.out", "file.in", - [ - Delete("tempdir"), - Mkdir("tempdir"), - Copy("tempdir/${SOURCE.file}", "$SOURCE"), - "process tempdir", - Move("$TARGET", "tempdir/output_file"), - Delete("tempdir"), - ]) +Command("file.out", "file.in", + [ + Delete("tempdir"), + Mkdir("tempdir"), + Copy("tempdir/${SOURCE.file}", "$SOURCE"), + "process tempdir", + Move("$TARGET", "tempdir/output_file"), + Delete("tempdir"), + ]) - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') file.in - touch $* +touch $* @@ -431,11 +431,11 @@ - Command("file.out", "file.in", - [ - Copy("$TARGET", "$SOURCE"), - Chmod("$TARGET", 0755), - ]) +Command("file.out", "file.in", + [ + Copy("$TARGET", "$SOURCE"), + Chmod("$TARGET", 0755), + ]) file.in @@ -470,7 +470,7 @@ - Execute(Mkdir('__ROOT__/tmp/my_temp_directory')) +Execute(Mkdir('__ROOT__/tmp/my_temp_directory')) @@ -521,9 +521,9 @@ - if Execute(Mkdir('__ROOT__/tmp/my_temp_directory')): - # A problem occurred while making the temp directory. - Exit(1) +if Execute(Mkdir('__ROOT__/tmp/my_temp_directory')): + # A problem occurred while making the temp directory. + Exit(1) diff --git a/doc/user/file-removal.xml b/doc/user/file-removal.xml index 3b1c36e..ebf7cc9 100644 --- a/doc/user/file-removal.xml +++ b/doc/user/file-removal.xml @@ -80,18 +80,18 @@ - env = Environment(RANLIBCOM='') - lib = env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) - env.Precious(lib) + env = Environment(RANLIBCOM='') + lib = env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) + env.Precious(lib) - int f1() { } +int f1() { } - int f2() { } +int f2() { } - int f3() { } +int f3() { } @@ -138,18 +138,18 @@ - env = Environment(RANLIBCOM='') - lib = env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) - env.NoClean(lib) +env = Environment(RANLIBCOM='') +lib = env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) +env.NoClean(lib) - int f1() { } +int f1() { } - int f2() { } +int f2() { } - int f3() { } +int f3() { } @@ -199,23 +199,23 @@ - t = Command('foo.out', 'foo.in', 'build -o $TARGET $SOURCE') - Clean(t, 'foo.log') +t = Command('foo.out', 'foo.in', 'build -o $TARGET $SOURCE') +Clean(t, 'foo.log') - env = DefaultEnvironment() - import os - env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() - SConscript('S') +env = DefaultEnvironment() +import os +env['ENV']['PATH'] = env['ENV']['PATH'] + os.pathsep + os.getcwd() +SConscript('S') - foo.in +foo.in - foo.log +foo.log - cat $3 > $2 +cat $3 > $2 diff --git a/doc/user/gettext.xml b/doc/user/gettext.xml index 9698c95..4b1e9ea 100644 --- a/doc/user/gettext.xml +++ b/doc/user/gettext.xml @@ -80,13 +80,13 @@ for example - /* hello.c */ - #include <stdio.h> - int main(int argc, char* argv[]) - { - printf("Hello world\n"); - return 0; - } +/* hello.c */ +#include <stdio.h> +int main(int argc, char* argv[]) +{ + printf("Hello world\n"); + return 0; +} @@ -94,9 +94,9 @@ as usual. - # SConstruct - env = Environment() - hello = Program(["hello.c"]) +# SConstruct +env = Environment() +hello = Program(["hello.c"]) @@ -120,18 +120,18 @@ internationalization. Change the previous code so it reads as follows: - /* hello.c */ - #include <stdio.h> - #include <libintl.h> - #include <locale.h> - int main(int argc, char* argv[]) - { - bindtextdomain("hello", "locale"); - setlocale(LC_ALL, ""); - textdomain("hello"); - printf(gettext("Hello world\n")); - return 0; - } +/* hello.c */ +#include <stdio.h> +#include <libintl.h> +#include <locale.h> +int main(int argc, char* argv[]) +{ + bindtextdomain("hello", "locale"); + setlocale(LC_ALL, ""); + textdomain("hello"); + printf(gettext("Hello world\n")); + return 0; +} Detailed recipes for such conversion can @@ -162,18 +162,18 @@ SConstruct is as follows: - # SConstruct - env = Environment( tools = ['default', 'gettext'] ) - hello = env.Program(["hello.c"]) - env['XGETTEXTFLAGS'] = [ - '--package-name=%s' % 'hello', - '--package-version=%s' % '1.0', - ] - po = env.Translate(["pl","en", "de"], ["hello.c"], POAUTOINIT = 1) - mo = env.MOFiles(po) - InstallAs(["locale/en/LC_MESSAGES/hello.mo"], ["en.mo"]) - InstallAs(["locale/pl/LC_MESSAGES/hello.mo"], ["pl.mo"]) - InstallAs(["locale/de/LC_MESSAGES/hello.mo"], ["de.mo"]) +# SConstruct +env = Environment( tools = ['default', 'gettext'] ) +hello = env.Program(["hello.c"]) +env['XGETTEXTFLAGS'] = [ + '--package-name=%s' % 'hello', + '--package-version=%s' % '1.0', +] +po = env.Translate(["pl","en", "de"], ["hello.c"], POAUTOINIT = 1) +mo = env.MOFiles(po) +InstallAs(["locale/en/LC_MESSAGES/hello.mo"], ["en.mo"]) +InstallAs(["locale/pl/LC_MESSAGES/hello.mo"], ["pl.mo"]) +InstallAs(["locale/de/LC_MESSAGES/hello.mo"], ["de.mo"]) @@ -181,29 +181,29 @@ Generate the translation files with scons po-update. You should see the output from SCons simillar to this: - user@host:$ scons po-update - scons: Reading SConscript files ... - scons: done reading SConscript files. - scons: Building targets ... - Entering '/home/ptomulik/projects/tmp' - xgettext --package-name=hello --package-version=1.0 -o - hello.c - Leaving '/home/ptomulik/projects/tmp' - Writting 'messages.pot' (new file) - msginit --no-translator -l pl -i messages.pot -o pl.po - Created pl.po. - msginit --no-translator -l en -i messages.pot -o en.po - Created en.po. - msginit --no-translator -l de -i messages.pot -o de.po - Created de.po. - scons: done building targets. +user@host:$ scons po-update +scons: Reading SConscript files ... +scons: done reading SConscript files. +scons: Building targets ... +Entering '/home/ptomulik/projects/tmp' +xgettext --package-name=hello --package-version=1.0 -o - hello.c +Leaving '/home/ptomulik/projects/tmp' +Writting 'messages.pot' (new file) +msginit --no-translator -l pl -i messages.pot -o pl.po +Created pl.po. +msginit --no-translator -l en -i messages.pot -o en.po +Created en.po. +msginit --no-translator -l de -i messages.pot -o de.po +Created de.po. +scons: done building targets. If everything is right, you should see following new files. - user@host:$ ls *.po* - de.po en.po messages.pot pl.po +user@host:$ ls *.po* +de.po en.po messages.pot pl.po @@ -228,19 +228,19 @@ Now compile the project by executing scons. The output should be similar to this: - user@host:$ scons - scons: Reading SConscript files ... - scons: done reading SConscript files. - scons: Building targets ... - msgfmt -c -o de.mo de.po - msgfmt -c -o en.mo en.po - gcc -o hello.o -c hello.c - gcc -o hello hello.o - Install file: "de.mo" as "locale/de/LC_MESSAGES/hello.mo" - Install file: "en.mo" as "locale/en/LC_MESSAGES/hello.mo" - msgfmt -c -o pl.mo pl.po - Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" - scons: done building targets. +user@host:$ scons +scons: Reading SConscript files ... +scons: done reading SConscript files. +scons: Building targets ... +msgfmt -c -o de.mo de.po +msgfmt -c -o en.mo en.po +gcc -o hello.o -c hello.c +gcc -o hello hello.o +Install file: "de.mo" as "locale/de/LC_MESSAGES/hello.mo" +Install file: "en.mo" as "locale/en/LC_MESSAGES/hello.mo" +msgfmt -c -o pl.mo pl.po +Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" +scons: done building targets. SCons automatically compiled the PO files to binary format MO, and the InstallAs lines installed @@ -249,16 +249,16 @@ Your program should be now ready. You may try it as follows (linux): - user@host:$ LANG=en_US.UTF-8 ./hello - Welcome to beautiful world +user@host:$ LANG=en_US.UTF-8 ./hello +Welcome to beautiful world - user@host:$ LANG=de_DE.UTF-8 ./hello - Hallo Welt +user@host:$ LANG=de_DE.UTF-8 ./hello +Hallo Welt - user@host:$ LANG=pl_PL.UTF-8 ./hello - Witaj swiecie +user@host:$ LANG=pl_PL.UTF-8 ./hello +Witaj swiecie @@ -267,13 +267,13 @@ swiecie\n". Run scons to see how scons reacts to this - user@host:$scons - scons: Reading SConscript files ... - scons: done reading SConscript files. - scons: Building targets ... - msgfmt -c -o pl.mo pl.po - Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" - scons: done building targets. +user@host:$scons +scons: Reading SConscript files ... +scons: done reading SConscript files. +scons: Building targets ... +msgfmt -c -o pl.mo pl.po +Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" +scons: done building targets. @@ -281,19 +281,19 @@ printf line with new message. - /* hello.c */ - #include <stdio.h> - #include <libintl.h> - #include <locale.h> - int main(int argc, char* argv[]) - { - bindtextdomain("hello", "locale"); - setlocale(LC_ALL, ""); - textdomain("hello"); - printf(gettext("Hello world\n")); - printf(gettext("and good bye\n")); - return 0; - } +/* hello.c */ +#include <stdio.h> +#include <libintl.h> +#include <locale.h> +int main(int argc, char* argv[]) +{ + bindtextdomain("hello", "locale"); + setlocale(LC_ALL, ""); + textdomain("hello"); + printf(gettext("Hello world\n")); + printf(gettext("and good bye\n")); + return 0; +} @@ -302,29 +302,29 @@ msgmerge(1) program is used by SCons to update PO file. The output from compilation is like: - user@host:$scons - scons: Reading SConscript files ... - scons: done reading SConscript files. - scons: Building targets ... - Entering '/home/ptomulik/projects/tmp' - xgettext --package-name=hello --package-version=1.0 -o - hello.c - Leaving '/home/ptomulik/projects/tmp' - Writting 'messages.pot' (messages in file were outdated) - msgmerge --update de.po messages.pot - ... done. - msgfmt -c -o de.mo de.po - msgmerge --update en.po messages.pot - ... done. - msgfmt -c -o en.mo en.po - gcc -o hello.o -c hello.c - gcc -o hello hello.o - Install file: "de.mo" as "locale/de/LC_MESSAGES/hello.mo" - Install file: "en.mo" as "locale/en/LC_MESSAGES/hello.mo" - msgmerge --update pl.po messages.pot - ... done. - msgfmt -c -o pl.mo pl.po - Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" - scons: done building targets. +user@host:$scons +scons: Reading SConscript files ... +scons: done reading SConscript files. +scons: Building targets ... +Entering '/home/ptomulik/projects/tmp' +xgettext --package-name=hello --package-version=1.0 -o - hello.c +Leaving '/home/ptomulik/projects/tmp' +Writting 'messages.pot' (messages in file were outdated) +msgmerge --update de.po messages.pot +... done. +msgfmt -c -o de.mo de.po +msgmerge --update en.po messages.pot +... done. +msgfmt -c -o en.mo en.po +gcc -o hello.o -c hello.c +gcc -o hello hello.o +Install file: "de.mo" as "locale/de/LC_MESSAGES/hello.mo" +Install file: "en.mo" as "locale/en/LC_MESSAGES/hello.mo" +msgmerge --update pl.po messages.pot +... done. +msgfmt -c -o pl.mo pl.po +Install file: "pl.mo" as "locale/pl/LC_MESSAGES/hello.mo" +scons: done building targets. @@ -336,35 +336,35 @@ line to the program (after the last printf), so its code becomes: - /* hello.c */ - #include <stdio.h> - #include <libintl.h> - #include <locale.h> - int main(int argc, char* argv[]) - { - bindtextdomain("hello", "locale"); - setlocale(LC_ALL, ""); - textdomain("hello"); - printf(gettext("Hello world\n")); - printf(gettext("and good bye\n")); - printf("----------------\n"); - return a; - } +/* hello.c */ +#include <stdio.h> +#include <libintl.h> +#include <locale.h> +int main(int argc, char* argv[]) +{ + bindtextdomain("hello", "locale"); + setlocale(LC_ALL, ""); + textdomain("hello"); + printf(gettext("Hello world\n")); + printf(gettext("and good bye\n")); + printf("----------------\n"); + return a; +} Compile the project. You'll see on your screen - user@host:$scons - scons: Reading SConscript files ... - scons: done reading SConscript files. - scons: Building targets ... - Entering '/home/ptomulik/projects/tmp' - xgettext --package-name=hello --package-version=1.0 -o - hello.c - Leaving '/home/ptomulik/projects/tmp' - Not writting 'messages.pot' (messages in file found to be up-to-date) - gcc -o hello.o -c hello.c - gcc -o hello hello.o - scons: done building targets. +user@host:$scons +scons: Reading SConscript files ... +scons: done reading SConscript files. +scons: Building targets ... +Entering '/home/ptomulik/projects/tmp' +xgettext --package-name=hello --package-version=1.0 -o - hello.c +Leaving '/home/ptomulik/projects/tmp' +Not writting 'messages.pot' (messages in file found to be up-to-date) +gcc -o hello.o -c hello.c +gcc -o hello hello.o +scons: done building targets. As you see, the internationalized messages ditn't change, so the POT and the rest of translation files have not diff --git a/doc/user/hierarchy.xml b/doc/user/hierarchy.xml index d2d01e7..9aaecc2 100644 --- a/doc/user/hierarchy.xml +++ b/doc/user/hierarchy.xml @@ -219,10 +219,10 @@ make no difference to the build. - SConscript(['drivers/display/SConscript', - 'drivers/mouse/SConscript', - 'parser/SConscript', - 'utilities/SConscript']) +SConscript(['drivers/display/SConscript', + 'drivers/mouse/SConscript', + 'parser/SConscript', + 'utilities/SConscript']) @@ -241,9 +241,9 @@ make no difference to the build. - SConscript(['drivers/SConscript', - 'parser/SConscript', - 'utilities/SConscript']) +SConscript(['drivers/SConscript', + 'parser/SConscript', + 'utilities/SConscript']) @@ -255,8 +255,8 @@ make no difference to the build. - SConscript(['display/SConscript', - 'mouse/SConscript']) +SConscript(['display/SConscript', + 'mouse/SConscript']) @@ -303,36 +303,36 @@ make no difference to the build. - SConscript(['prog1/SConscript', - 'prog2/SConscript']) +SConscript(['prog1/SConscript', + 'prog2/SConscript']) - env = Environment() - env.Program('prog1', ['main.c', 'foo1.c', 'foo2.c']) +env = Environment() +env.Program('prog1', ['main.c', 'foo1.c', 'foo2.c']) - env = Environment() - env.Program('prog2', ['main.c', 'bar1.c', 'bar2.c']) +env = Environment() +env.Program('prog2', ['main.c', 'bar1.c', 'bar2.c']) - x +x - x +x - x +x - x +x - x +x - x +x @@ -404,20 +404,20 @@ make no difference to the build. - SConscript('src/prog/SConscript') +SConscript('src/prog/SConscript') - env = Environment() - env.Program('prog', ['main.c', '#lib/foo1.c', 'foo2.c']) +env = Environment() +env.Program('prog', ['main.c', '#lib/foo1.c', 'foo2.c']) - x +x - x +x - x +x @@ -460,20 +460,20 @@ make no difference to the build. - SConscript('src/prog/SConscript') +SConscript('src/prog/SConscript') - env = Environment() - env.Program('prog', ['main.c', '__ROOT__/usr/joe/lib/foo1.c', 'foo2.c']) +env = Environment() +env.Program('prog', ['main.c', '__ROOT__/usr/joe/lib/foo1.c', 'foo2.c']) - x +x - x +x - x +x @@ -549,8 +549,8 @@ make no difference to the build. - env = Environment() - Export('env') +env = Environment() +Export('env') @@ -560,9 +560,9 @@ make no difference to the build. - env = Environment() - debug = ARGUMENTS['debug'] - Export('env', 'debug') +env = Environment() +debug = ARGUMENTS['debug'] +Export('env', 'debug') @@ -574,7 +574,7 @@ make no difference to the build. - Export('env debug') +Export('env debug') @@ -586,7 +586,7 @@ make no difference to the build. - SConscript('src/SConscript', 'env') +SConscript('src/SConscript', 'env') @@ -596,7 +596,7 @@ make no difference to the build. - SConscript('src/SConscript', exports='env') +SConscript('src/SConscript', exports='env') @@ -609,8 +609,8 @@ make no difference to the build. - SConscript(['src1/SConscript', - 'src2/SConscript'], exports='env') +SConscript(['src1/SConscript', + 'src2/SConscript'], exports='env') @@ -637,8 +637,8 @@ make no difference to the build. - Import('env') - env.Program('prog', ['prog.c']) +Import('env') +env.Program('prog', ['prog.c']) @@ -659,9 +659,9 @@ make no difference to the build. - Import('env', 'debug') - env = env.Clone(DEBUG = debug) - env.Program('prog', ['prog.c']) +Import('env', 'debug') +env = env.Clone(DEBUG = debug) +env.Program('prog', ['prog.c']) @@ -673,9 +673,9 @@ make no difference to the build. - Import('env debug') - env = env.Clone(DEBUG = debug) - env.Program('prog', ['prog.c']) +Import('env debug') +env = env.Clone(DEBUG = debug) +env.Program('prog', ['prog.c']) @@ -688,9 +688,9 @@ make no difference to the build. - Import('*') - env = env.Clone(DEBUG = debug) - env.Program('prog', ['prog.c']) +Import('*') +env = env.Clone(DEBUG = debug) +env.Program('prog', ['prog.c']) @@ -738,31 +738,31 @@ make no difference to the build. - env = Environment() - Export('env') - objs = [] - for subdir in ['foo', 'bar']: - o = SConscript('%s/SConscript' % subdir) - objs.append(o) - env.Library('prog', objs) +env = Environment() +Export('env') +objs = [] +for subdir in ['foo', 'bar']: + o = SConscript('%s/SConscript' % subdir) + objs.append(o) +env.Library('prog', objs) - Import('env') - obj = env.Object('foo.c') - Return('obj') +Import('env') +obj = env.Object('foo.c') +Return('obj') - Import('env') - obj = env.Object('bar.c') - Return('obj') +Import('env') +obj = env.Object('bar.c') +Return('obj') - void foo(void) { printf("foo/foo.c\n"); } +void foo(void) { printf("foo/foo.c\n"); } - void bar(void) { printf("bar/bar.c\n"); } +void bar(void) { printf("bar/bar.c\n"); } diff --git a/doc/user/install.xml b/doc/user/install.xml index 7c2f00e..159b886 100644 --- a/doc/user/install.xml +++ b/doc/user/install.xml @@ -58,12 +58,12 @@ - env = Environment() - hello = env.Program('hello.c') - env.Install('__ROOT__/usr/bin', hello) +env = Environment() +hello = env.Program('hello.c') +env.Install('__ROOT__/usr/bin', hello) - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -104,13 +104,13 @@ - env = Environment() - hello = env.Program('hello.c') - env.Install('__ROOT__/usr/bin', hello) - env.Alias('install', '__ROOT__/usr/bin') +env = Environment() +hello = env.Program('hello.c') +env.Install('__ROOT__/usr/bin', hello) +env.Alias('install', '__ROOT__/usr/bin') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -139,18 +139,18 @@ - env = Environment() - hello = env.Program('hello.c') - goodbye = env.Program('goodbye.c') - env.Install('__ROOT__/usr/bin', hello) - env.Install('__ROOT__/usr/bin', goodbye) - env.Alias('install', '__ROOT__/usr/bin') +env = Environment() +hello = env.Program('hello.c') +goodbye = env.Program('goodbye.c') +env.Install('__ROOT__/usr/bin', hello) +env.Install('__ROOT__/usr/bin', goodbye) +env.Alias('install', '__ROOT__/usr/bin') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Goodbye, world!\n"); } +int main() { printf("Goodbye, world!\n"); } @@ -163,11 +163,11 @@ - env = Environment() - hello = env.Program('hello.c') - goodbye = env.Program('goodbye.c') - env.Install('__ROOT__/usr/bin', [hello, goodbye]) - env.Alias('install', '__ROOT__/usr/bin') +env = Environment() +hello = env.Program('hello.c') +goodbye = env.Program('goodbye.c') +env.Install('__ROOT__/usr/bin', [hello, goodbye]) +env.Alias('install', '__ROOT__/usr/bin') @@ -197,13 +197,13 @@ - env = Environment() - hello = env.Program('hello.c') - env.InstallAs('__ROOT__/usr/bin/hello-new', hello) - env.Alias('install', '__ROOT__/usr/bin') +env = Environment() +hello = env.Program('hello.c') +env.InstallAs('__ROOT__/usr/bin/hello-new', hello) +env.Alias('install', '__ROOT__/usr/bin') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -237,19 +237,19 @@ - env = Environment() - hello = env.Program('hello.c') - goodbye = env.Program('goodbye.c') - env.InstallAs(['__ROOT__/usr/bin/hello-new', - '__ROOT__/usr/bin/goodbye-new'], - [hello, goodbye]) - env.Alias('install', '__ROOT__/usr/bin') +env = Environment() +hello = env.Program('hello.c') +goodbye = env.Program('goodbye.c') +env.InstallAs(['__ROOT__/usr/bin/hello-new', + '__ROOT__/usr/bin/goodbye-new'], + [hello, goodbye]) +env.Alias('install', '__ROOT__/usr/bin') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Goodbye, world!\n"); } +int main() { printf("Goodbye, world!\n"); } diff --git a/doc/user/java.xml b/doc/user/java.xml index 418faf6..40a82a3 100644 --- a/doc/user/java.xml +++ b/doc/user/java.xml @@ -80,34 +80,34 @@ - Java('classes', 'src') +Java('classes', 'src') - public class Example1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example2 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example2 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example3 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example3 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} @@ -155,50 +155,50 @@ - Java('classes', 'src') +Java('classes', 'src') - public class Example1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } - public class AdditionalClass1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} +public class AdditionalClass1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example2 - { - class Inner2 { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } - } +public class Example2 +{ + class Inner2 { + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } + } +} - public class Example3 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } - public class AdditionalClass3 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example3 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} +public class AdditionalClass3 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} @@ -253,7 +253,7 @@ - Java('classes', 'src', JAVAVERSION='1.6') +Java('classes', 'src', JAVAVERSION='1.6') @@ -280,35 +280,35 @@ - Java(target = 'classes', source = 'src') - Jar(target = 'test.jar', source = 'classes') +Java(target = 'classes', source = 'src') +Jar(target = 'test.jar', source = 'classes') - public class Example1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example2 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example2 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example3 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example3 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} @@ -344,46 +344,46 @@ - prog1_class_files = Java(target = 'classes', source = 'prog1') - prog2_class_files = Java(target = 'classes', source = 'prog2') - Jar(target = 'prog1.jar', source = prog1_class_files) - Jar(target = 'prog2.jar', source = prog2_class_files) +prog1_class_files = Java(target = 'classes', source = 'prog1') +prog2_class_files = Java(target = 'classes', source = 'prog2') +Jar(target = 'prog1.jar', source = prog1_class_files) +Jar(target = 'prog2.jar', source = prog2_class_files) - public class Example1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example2 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example2 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example3 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example3 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} - public class Example4 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example4 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} @@ -418,35 +418,35 @@ - classes = Java(target = 'classes', source = 'src/pkg/sub') - JavaH(target = 'native', source = classes) +classes = Java(target = 'classes', source = 'src/pkg/sub') +JavaH(target = 'native', source = classes) - package pkg.sub; - public class Example1 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example1 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example2 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example2 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example3 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example3 +{ + public static void main(String[] args) + { + } +} @@ -502,38 +502,38 @@ - Java(target = 'classes', source = 'src/pkg/sub') - class_file_list = ['classes/pkg/sub/Example1.class', - 'classes/pkg/sub/Example2.class', - 'classes/pkg/sub/Example3.class'] - JavaH(target = 'native', source = class_file_list, JAVACLASSDIR = 'classes') +Java(target = 'classes', source = 'src/pkg/sub') +class_file_list = ['classes/pkg/sub/Example1.class', + 'classes/pkg/sub/Example2.class', + 'classes/pkg/sub/Example3.class'] +JavaH(target = 'native', source = class_file_list, JAVACLASSDIR = 'classes') - package pkg.sub; - public class Example1 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example1 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example2 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example2 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example3 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example3 +{ + public static void main(String[] args) + { + } +} @@ -560,35 +560,35 @@ - classes = Java(target = 'classes', source = 'src/pkg/sub') - JavaH(target = File('native.h'), source = classes) +classes = Java(target = 'classes', source = 'src/pkg/sub') +JavaH(target = File('native.h'), source = classes) - package pkg.sub; - public class Example1 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example1 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example2 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example2 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example3 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example3 +{ + public static void main(String[] args) + { + } +} @@ -629,26 +629,26 @@ - classes = Java(target = 'classes', source = 'src/pkg/sub') - RMIC(target = 'outdir', source = classes) +classes = Java(target = 'classes', source = 'src/pkg/sub') +RMIC(target = 'outdir', source = classes) - package pkg.sub; - public class Example1 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example1 +{ + public static void main(String[] args) + { + } +} - package pkg.sub; - public class Example2 - { - public static void main(String[] args) - { - } - } +package pkg.sub; +public class Example2 +{ + public static void main(String[] args) + { + } +} diff --git a/doc/user/less-simple.xml b/doc/user/less-simple.xml index 53e6433..4c60cc7 100644 --- a/doc/user/less-simple.xml +++ b/doc/user/less-simple.xml @@ -72,7 +72,7 @@ - Program('hello.c') +Program('hello.c') @@ -86,10 +86,10 @@ - Program('new_hello', 'hello.c') +Program('new_hello', 'hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -147,16 +147,16 @@ - Program(['prog.c', 'file1.c', 'file2.c']) +Program(['prog.c', 'file1.c', 'file2.c']) - int main() { printf("prog.c\n"); } +int main() { printf("prog.c\n"); } - void file1() { printf("file1.c\n"); } +void file1() { printf("file1.c\n"); } - void file2() { printf("file2.c\n"); } +void file2() { printf("file2.c\n"); } @@ -194,16 +194,16 @@ - Program('program', ['prog.c', 'file1.c', 'file2.c']) +Program('program', ['prog.c', 'file1.c', 'file2.c']) - int main() { printf("prog.c\n"); } +int main() { printf("prog.c\n"); } - void file1() { printf("file1.c\n"); } +void file1() { printf("file1.c\n"); } - void file2() { printf("file2.c\n"); } +void file2() { printf("file2.c\n"); } @@ -247,7 +247,7 @@ - Program('program', Glob('*.c')) +Program('program', Glob('*.c')) @@ -275,7 +275,7 @@ - Program('hello', ['file1.c', 'file2.c']) +Program('hello', ['file1.c', 'file2.c']) @@ -285,7 +285,7 @@ - Program('hello', 'hello.c') +Program('hello', 'hello.c') @@ -296,7 +296,7 @@ - Program('hello', ['hello.c']) +Program('hello', ['hello.c']) @@ -324,9 +324,9 @@ - # The following two calls both work correctly: - Program('program1', 'program1.c') - Program('program2', ['program2.c']) +# The following two calls both work correctly: +Program('program1', 'program1.c') +Program('program2', ['program2.c']) @@ -383,7 +383,7 @@ - Program('program', Split('main.c file1.c file2.c')) +Program('program', Split('main.c file1.c file2.c')) @@ -417,8 +417,8 @@ - src_files = Split('main.c file1.c file2.c') - Program('program', src_files) +src_files = Split('main.c file1.c file2.c') +Program('program', src_files) @@ -433,10 +433,10 @@ - src_files = Split("""main.c - file1.c - file2.c""") - Program('program', src_files) +src_files = Split("""main.c + file1.c + file2.c""") +Program('program', src_files) @@ -469,8 +469,8 @@ - src_files = Split('main.c file1.c file2.c') - Program(target = 'program', source = src_files) +src_files = Split('main.c file1.c file2.c') +Program(target = 'program', source = src_files) @@ -482,8 +482,8 @@ - src_files = Split('main.c file1.c file2.c') - Program(source = src_files, target = 'program') +src_files = Split('main.c file1.c file2.c') +Program(source = src_files, target = 'program') @@ -514,17 +514,17 @@ - Program('foo.c') - Program('bar', ['bar1.c', 'bar2.c']) +Program('foo.c') +Program('bar', ['bar1.c', 'bar2.c']) - int main() { printf("foo.c\n"); } +int main() { printf("foo.c\n"); } - int main() { printf("bar1.c\n"); } +int main() { printf("bar1.c\n"); } - void bar2() { printf("bar2.c\n"); } +void bar2() { printf("bar2.c\n"); } @@ -579,23 +579,23 @@ - Program(Split('foo.c common1.c common2.c')) - Program('bar', Split('bar1.c bar2.c common1.c common2.c')) +Program(Split('foo.c common1.c common2.c')) +Program('bar', Split('bar1.c bar2.c common1.c common2.c')) - int main() { printf("foo.c\n"); } +int main() { printf("foo.c\n"); } - int main() { printf("bar1.c\n"); } +int main() { printf("bar1.c\n"); } - int bar2() { printf("bar2.c\n"); } +int bar2() { printf("bar2.c\n"); } - void common1() { printf("common1.c\n"); } +void common1() { printf("common1.c\n"); } - void common22() { printf("common2.c\n"); } +void common22() { printf("common2.c\n"); } @@ -628,11 +628,11 @@ - common = ['common1.c', 'common2.c'] - foo_files = ['foo.c'] + common - bar_files = ['bar1.c', 'bar2.c'] + common - Program('foo', foo_files) - Program('bar', bar_files) +common = ['common1.c', 'common2.c'] +foo_files = ['foo.c'] + common +bar_files = ['bar1.c', 'bar2.c'] + common +Program('foo', foo_files) +Program('bar', bar_files) diff --git a/doc/user/libraries.xml b/doc/user/libraries.xml index 1b43a48..63d4544 100644 --- a/doc/user/libraries.xml +++ b/doc/user/libraries.xml @@ -65,16 +65,16 @@ - Library('foo', ['f1.c', 'f2.c', 'f3.c']) +Library('foo', ['f1.c', 'f2.c', 'f3.c']) - void f1() { printf("f1.c\n"); } +void f1() { printf("f1.c\n"); } - void f2() { printf("f2.c\n"); } +void f2() { printf("f2.c\n"); } - void f3() { printf("f3.c\n"); } +void f3() { printf("f3.c\n"); } @@ -131,19 +131,19 @@ - Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o']) +Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o']) - void f1() { printf("f1.c\n"); } +void f1() { printf("f1.c\n"); } - object file +object file - void f3() { printf("f3.c\n"); } +void f3() { printf("f3.c\n"); } - object file +object file @@ -186,7 +186,7 @@ - StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) +StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) @@ -212,16 +212,16 @@ - SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) +SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) - void f1() { printf("f1.c\n"); } +void f1() { printf("f1.c\n"); } - void f2() { printf("f2.c\n"); } +void f2() { printf("f2.c\n"); } - void f3() { printf("f3.c\n"); } +void f3() { printf("f3.c\n"); } @@ -280,20 +280,20 @@ - Library('foo', ['f1.c', 'f2.c', 'f3.c']) - Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') +Library('foo', ['f1.c', 'f2.c', 'f3.c']) +Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -347,7 +347,7 @@ - Program('prog.c', LIBS='foo', LIBPATH='.') +Program('prog.c', LIBS='foo', LIBPATH='.') @@ -357,7 +357,7 @@ - Program('prog.c', LIBS=['foo'], LIBPATH='.') +Program('prog.c', LIBS=['foo'], LIBPATH='.') @@ -387,11 +387,11 @@ - Program('prog.c', LIBS = 'm', - LIBPATH = ['/usr/lib', '/usr/local/lib']) +Program('prog.c', LIBS = 'm', + LIBPATH = ['/usr/lib', '/usr/local/lib']) - int main() { printf("prog.c\n"); } +int main() { printf("prog.c\n"); } @@ -406,7 +406,7 @@ - LIBPATH = '/usr/lib:/usr/local/lib' +LIBPATH = '/usr/lib:/usr/local/lib' @@ -416,7 +416,7 @@ - LIBPATH = 'C:\\lib;D:\\lib' +LIBPATH = 'C:\\lib;D:\\lib' diff --git a/doc/user/mergeflags.xml b/doc/user/mergeflags.xml index 393cfbc..1143ee9 100644 --- a/doc/user/mergeflags.xml +++ b/doc/user/mergeflags.xml @@ -73,11 +73,11 @@ - env = Environment() - env.Append(CCFLAGS = '-option -O3 -O1') - flags = { 'CCFLAGS' : '-whatever -O3' } - env.MergeFlags(flags) - print env['CCFLAGS'] +env = Environment() +env.Append(CCFLAGS = '-option -O3 -O1') +flags = { 'CCFLAGS' : '-whatever -O3' } +env.MergeFlags(flags) +print env['CCFLAGS'] @@ -100,11 +100,11 @@ - env = Environment() - env.Append(CPPPATH = ['/include', '/usr/local/include', '/usr/include']) - flags = { 'CPPPATH' : ['/usr/opt/include', '/usr/local/include'] } - env.MergeFlags(flags) - print env['CPPPATH'] +env = Environment() +env.Append(CPPPATH = ['/include', '/usr/local/include', '/usr/include']) +flags = { 'CPPPATH' : ['/usr/opt/include', '/usr/local/include'] } +env.MergeFlags(flags) +print env['CPPPATH'] @@ -134,12 +134,12 @@ - env = Environment() - env.Append(CCFLAGS = '-option -O3 -O1') - env.Append(CPPPATH = ['/include', '/usr/local/include', '/usr/include']) - env.MergeFlags('-whatever -I/usr/opt/include -O3 -I/usr/local/include') - print env['CCFLAGS'] - print env['CPPPATH'] +env = Environment() +env.Append(CCFLAGS = '-option -O3 -O1') +env.Append(CPPPATH = ['/include', '/usr/local/include', '/usr/include']) +env.MergeFlags('-whatever -I/usr/opt/include -O3 -I/usr/local/include') +print env['CCFLAGS'] +print env['CPPPATH'] diff --git a/doc/user/misc.xml b/doc/user/misc.xml index 3739302..4145d49 100644 --- a/doc/user/misc.xml +++ b/doc/user/misc.xml @@ -91,14 +91,14 @@ - EnsurePythonVersion(2, 5) +EnsurePythonVersion(2, 5) --> - EnsurePythonVersion(2, 5) +EnsurePythonVersion(2, 5) @@ -122,8 +122,8 @@ --> - % scons -Q - Python 2.5 or greater required, but you have Python 2.3.6 +% scons -Q +Python 2.5 or greater required, but you have Python 2.3.6 @@ -160,14 +160,14 @@ - EnsureSConsVersion(1, 0) +EnsureSConsVersion(1, 0) --> - EnsureSConsVersion(1, 0) +EnsureSConsVersion(1, 0) @@ -191,8 +191,8 @@ --> - % scons -Q - SCons 1.0 or greater required, but you have SCons 0.98.5 +% scons -Q +SCons 1.0 or greater required, but you have SCons 0.98.5 @@ -212,14 +212,14 @@ - if ARGUMENTS.get('FUTURE'): - print "The FUTURE option is not supported yet!" - Exit(2) - env = Environment() - env.Program('hello.c') +if ARGUMENTS.get('FUTURE'): + print "The FUTURE option is not supported yet!" + Exit(2) +env = Environment() +env.Program('hello.c') - hello.c +hello.c @@ -268,13 +268,13 @@ - # one directory - print FindFile('missing', '.') - t = FindFile('exists', '.') - print t.__class__, t +# one directory +print FindFile('missing', '.') +t = FindFile('exists', '.') +print t.__class__, t - exists + exists @@ -284,23 +284,23 @@ - # several directories - includes = [ '.', 'include', 'src/include'] - headers = [ 'nonesuch.h', 'config.h', 'private.h', 'dist.h'] - for hdr in headers: - print '%-12s' % ('%s:' % hdr), FindFile(hdr, includes) +# several directories +includes = [ '.', 'include', 'src/include'] +headers = [ 'nonesuch.h', 'config.h', 'private.h', 'dist.h'] +for hdr in headers: + print '%-12s' % ('%s:' % hdr), FindFile(hdr, includes) - exists +exists - exists +exists - exists +exists @@ -318,23 +318,23 @@ - # several directories - includes = [ '.', 'include', 'src/include'] - headers = [ 'nonesuch.h', 'config.h', 'private.h', 'dist.h'] - print FindFile(headers, includes) +# several directories +includes = [ '.', 'include', 'src/include'] +headers = [ 'nonesuch.h', 'config.h', 'private.h', 'dist.h'] +print FindFile(headers, includes) - exists +exists - exists +exists - exists +exists @@ -351,21 +351,21 @@ - print FindFile('multiple', ['sub1', 'sub2', 'sub3']) - print FindFile('multiple', ['sub2', 'sub3', 'sub1']) - print FindFile('multiple', ['sub3', 'sub1', 'sub2']) +print FindFile('multiple', ['sub1', 'sub2', 'sub3']) +print FindFile('multiple', ['sub2', 'sub3', 'sub1']) +print FindFile('multiple', ['sub3', 'sub1', 'sub2']) - exists +exists - exists +exists - exists +exists @@ -385,10 +385,10 @@ - # Neither file exists, so build will fail - Command('derived', 'leaf', 'cat >$TARGET $SOURCE') - print FindFile('leaf', '.') - print FindFile('derived', '.') +# Neither file exists, so build will fail +Command('derived', 'leaf', 'cat >$TARGET $SOURCE') +print FindFile('leaf', '.') +print FindFile('derived', '.') @@ -398,13 +398,13 @@ - # Only 'leaf' exists - Command('derived', 'leaf', 'cat >$TARGET $SOURCE') - print FindFile('leaf', '.') - print FindFile('derived', '.') +# Only 'leaf' exists +Command('derived', 'leaf', 'cat >$TARGET $SOURCE') +print FindFile('leaf', '.') +print FindFile('derived', '.') - leaf +leaf @@ -421,13 +421,13 @@ - # Only 'src/leaf' exists - VariantDir('build', 'src') - print FindFile('leaf', 'build') +# Only 'src/leaf' exists +VariantDir('build', 'src') +print FindFile('leaf', 'build') - leaf +leaf @@ -460,17 +460,17 @@ - objects = [ - Object('prog1.c'), - Object('prog2.c', CCFLAGS='-DFOO'), - ] - Program(objects) +objects = [ + Object('prog1.c'), + Object('prog2.c', CCFLAGS='-DFOO'), +] +Program(objects) - prog1.c +prog1.c - prog2.c +prog2.c @@ -570,12 +570,12 @@ --> - % scons -Q - /home/me/project/prog1.o - /home/me/project/prog2.o - cc -o prog1.o -c prog1.c - cc -o prog2.o -c -DFOO prog2.c - cc -o prog1 prog1.o prog2.o +% scons -Q +/home/me/project/prog1.o +/home/me/project/prog2.o +cc -o prog1.o -c prog1.c +cc -o prog2.o -c -DFOO prog2.c +cc -o prog1 prog1.o prog2.o @@ -592,12 +592,12 @@ - env = Environment( - LAUNCHDIR = GetLaunchDir(), - ) - env.Command('directory_build_info', - '$LAUNCHDIR/build_info' - Copy('$TARGET', '$SOURCE')) +env = Environment( + LAUNCHDIR = GetLaunchDir(), +) +env.Command('directory_build_info', + '$LAUNCHDIR/build_info' + Copy('$TARGET', '$SOURCE')) diff --git a/doc/user/nodes.xml b/doc/user/nodes.xml index 9b5a7d6..78f15e3 100644 --- a/doc/user/nodes.xml +++ b/doc/user/nodes.xml @@ -80,8 +80,8 @@ - Object('hello.c', CCFLAGS='-DHELLO') - Object('goodbye.c', CCFLAGS='-DGOODBYE') +Object('hello.c', CCFLAGS='-DHELLO') +Object('goodbye.c', CCFLAGS='-DGOODBYE') @@ -95,9 +95,9 @@ - Object('hello.c', CCFLAGS='-DHELLO') - Object('goodbye.c', CCFLAGS='-DGOODBYE') - Program(['hello.o', 'goodbye.o']) +Object('hello.c', CCFLAGS='-DHELLO') +Object('goodbye.c', CCFLAGS='-DGOODBYE') +Program(['hello.o', 'goodbye.o']) @@ -123,15 +123,15 @@ - hello_list = Object('hello.c', CCFLAGS='-DHELLO') - goodbye_list = Object('goodbye.c', CCFLAGS='-DGOODBYE') - Program(hello_list + goodbye_list) +hello_list = Object('hello.c', CCFLAGS='-DHELLO') +goodbye_list = Object('goodbye.c', CCFLAGS='-DGOODBYE') +Program(hello_list + goodbye_list) - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Goodbye, world!\n"); } +int main() { printf("Goodbye, world!\n"); } @@ -229,7 +229,7 @@ - xyzzy = Entry('xyzzy') +xyzzy = Entry('xyzzy') @@ -263,13 +263,13 @@ - object_list = Object('hello.c') - program_list = Program(object_list) - print "The object file is:", object_list[0] - print "The program file is:", program_list[0] +object_list = Object('hello.c') +program_list = Program(object_list) +print "The object file is:", object_list[0] +print "The program file is:", program_list[0] - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -330,14 +330,14 @@ - import os.path - program_list = Program('hello.c') - program_name = str(program_list[0]) - if not os.path.exists(program_name): - print program_name, "does not exist!" +import os.path +program_list = Program('hello.c') +program_name = str(program_list[0]) +if not os.path.exists(program_name): + print program_name, "does not exist!" - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -372,9 +372,9 @@ - env=Environment(VAR="value") - n=File("foo.c") - print env.GetBuildPath([n, "sub/dir/$VAR"]) +env=Environment(VAR="value") +n=File("foo.c") +print env.GetBuildPath([n, "sub/dir/$VAR"]) @@ -412,13 +412,13 @@ - hello_c = File('hello.c') - contents = hello_c.read() - print "contents are:" - print contents +hello_c = File('hello.c') +contents = hello_c.read() +print "contents are:" +print contents - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } diff --git a/doc/user/output.xml b/doc/user/output.xml index d601e72..de6b8d4 100644 --- a/doc/user/output.xml +++ b/doc/user/output.xml @@ -74,10 +74,10 @@ - Help(""" - Type: 'scons program' to build the production program, - 'scons debug' to build the debug version. - """) +Help(""" +Type: 'scons program' to build the production program, + 'scons debug' to build the debug version. +""") @@ -214,12 +214,12 @@ - env = Environment(CCCOMSTR = "Compiling $TARGET", - LINKCOMSTR = "Linking $TARGET") - env.Program('foo.c') +env = Environment(CCCOMSTR = "Compiling $TARGET", + LINKCOMSTR = "Linking $TARGET") +env.Program('foo.c') - foo.c +foo.c @@ -238,9 +238,9 @@ --> - % scons -Q - Compiling foo.o - Linking foo +% scons -Q +Compiling foo.o +Linking foo @@ -286,14 +286,14 @@ - env = Environment() - if ARGUMENTS.get('VERBOSE') != "1': - env['CCCOMSTR'] = "Compiling $TARGET" - env['LINKCOMSTR'] = "Linking $TARGET" - env.Program('foo.c') +env = Environment() +if ARGUMENTS.get('VERBOSE') != "1': + env['CCCOMSTR'] = "Compiling $TARGET" + env['LINKCOMSTR'] = "Linking $TARGET" +env.Program('foo.c') - foo.c +foo.c @@ -322,15 +322,15 @@ --> - % scons -Q - Compiling foo.o - Linking foo - % scons -Q -c - Removed foo.o - Removed foo - % scons -Q VERBOSE=1 - cc -o foo.o -c foo.c - cc -o foo foo.o +% scons -Q +Compiling foo.o +Linking foo +% scons -Q -c +Removed foo.o +Removed foo +% scons -Q VERBOSE=1 +cc -o foo.o -c foo.c +cc -o foo foo.o @@ -372,15 +372,15 @@ - Progress('Evaluating $TARGET\n') - Program('f1.c') - Program('f2.c') +Progress('Evaluating $TARGET\n') +Program('f1.c') +Program('f2.c') - f1.c +f1.c - f2.c +f2.c @@ -425,11 +425,11 @@ - Progress('$TARGET\r', - file=open('/dev/tty', 'w'), - overwrite=True) - Program('f1.c') - Program('f2.c') +Progress('$TARGET\r', + file=open('/dev/tty', 'w'), + overwrite=True) +Program('f1.c') +Program('f2.c') @@ -482,9 +482,9 @@ - Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5) - Program('f1.c') - Program('f2.c') +Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5) +Program('f1.c') +Program('f2.c') diff --git a/doc/user/parseconfig.xml b/doc/user/parseconfig.xml index cf3531b..6125812 100644 --- a/doc/user/parseconfig.xml +++ b/doc/user/parseconfig.xml @@ -84,10 +84,10 @@ - env = Environment() - env['CPPPATH'] = ['/lib/compat'] - env.ParseConfig("pkg-config x11 --cflags --libs") - print env['CPPPATH'] +env = Environment() +env['CPPPATH'] = ['/lib/compat'] +env.ParseConfig("pkg-config x11 --cflags --libs") +print env['CPPPATH'] @@ -111,9 +111,9 @@ --> - % scons -Q - ['/lib/compat', '/usr/X11/include'] - scons: `.' is up to date. +% scons -Q +['/lib/compat', '/usr/X11/include'] +scons: `.' is up to date. @@ -136,10 +136,10 @@ - env = Environment() - env.ParseConfig("pkg-config x11 --cflags --libs") - env.ParseConfig("pkg-config x11 --cflags --libs") - print env['CPPPATH'] +env = Environment() +env.ParseConfig("pkg-config x11 --cflags --libs") +env.ParseConfig("pkg-config x11 --cflags --libs") +print env['CPPPATH'] @@ -155,9 +155,9 @@ --> - % scons -Q - ['/usr/X11/include'] - scons: `.' is up to date. +% scons -Q +['/usr/X11/include'] +scons: `.' is up to date. diff --git a/doc/user/parseflags.xml b/doc/user/parseflags.xml index d20df80..a3462a5 100644 --- a/doc/user/parseflags.xml +++ b/doc/user/parseflags.xml @@ -80,16 +80,16 @@ - env = Environment() - d = env.ParseFlags("-I/opt/include -L/opt/lib -lfoo") - for k,v in sorted(d.items()): - if v: - print k, v - env.MergeFlags(d) - env.Program('f1.c') +env = Environment() +d = env.ParseFlags("-I/opt/include -L/opt/lib -lfoo") +for k,v in sorted(d.items()): + if v: + print k, v +env.MergeFlags(d) +env.Program('f1.c') - int main() { return 0; } +int main() { return 0; } @@ -119,16 +119,16 @@ - env = Environment() - d = env.ParseFlags("-whatever") - for k,v in sorted(d.items()): - if v: - print k, v - env.MergeFlags(d) - env.Program('f1.c') +env = Environment() +d = env.ParseFlags("-whatever") +for k,v in sorted(d.items()): + if v: + print k, v +env.MergeFlags(d) +env.Program('f1.c') - int main() { return 0; } + int main() { return 0; } @@ -145,16 +145,16 @@ - env = Environment() - d = env.ParseFlags(["-I/opt/include", ["-L/opt/lib", "-lfoo"]]) - for k,v in sorted(d.items()): - if v: - print k, v - env.MergeFlags(d) - env.Program('f1.c') +env = Environment() +d = env.ParseFlags(["-I/opt/include", ["-L/opt/lib", "-lfoo"]]) +for k,v in sorted(d.items()): + if v: + print k, v +env.MergeFlags(d) +env.Program('f1.c') - int main() { return 0; } +int main() { return 0; } @@ -172,16 +172,16 @@ - env = Environment() - d = env.ParseFlags(["!echo -I/opt/include", "!echo -L/opt/lib", "-lfoo"]) - for k,v in sorted(d.items()): - if v: - print k, v - env.MergeFlags(d) - env.Program('f1.c') +env = Environment() +d = env.ParseFlags(["!echo -I/opt/include", "!echo -L/opt/lib", "-lfoo"]) +for k,v in sorted(d.items()): + if v: + print k, v +env.MergeFlags(d) +env.Program('f1.c') - int main() { return 0; } +int main() { return 0; } diff --git a/doc/user/repositories.xml b/doc/user/repositories.xml index 8e8ba4e..4ff8b93 100644 --- a/doc/user/repositories.xml +++ b/doc/user/repositories.xml @@ -96,12 +96,12 @@ - env = Environment() - env.Program('hello.c') - Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') +env = Environment() +env.Program('hello.c') +Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -165,12 +165,12 @@ - env = Environment() - env.Program('hello.c') - Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') +env = Environment() +env.Program('hello.c') +Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -188,12 +188,12 @@ - env = Environment() - env.Program('hello.c') - Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') +env = Environment() +env.Program('hello.c') +Repository('__ROOT__/usr/repository1', '__ROOT__/usr/repository2') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -238,9 +238,9 @@ - % scons -Q - cc -o hello.o -c hello.c - hello.c:1: hello.h: No such file or directory +% scons -Q +cc -o hello.o -c hello.c +hello.c:1: hello.h: No such file or directory @@ -256,12 +256,12 @@ - env = Environment(CPPPATH = ['.']) - env.Program('hello.c') - Repository('__ROOT__/usr/repository1') +env = Environment(CPPPATH = ['.']) +env.Program('hello.c') +Repository('__ROOT__/usr/repository1') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -292,12 +292,12 @@ - env = Environment(CPPPATH = ['dir1', 'dir2', 'dir3']) - env.Program('hello.c') - Repository('__ROOT__/r1', '__ROOT__/r2') +env = Environment(CPPPATH = ['dir1', 'dir2', 'dir3']) +env.Program('hello.c') +Repository('__ROOT__/r1', '__ROOT__/r2') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -355,13 +355,13 @@ coming into existence.) - #include "hello.h" - int - main(int argc, char *argv[]) - { - printf(HELLO_MESSAGE); - return (0); - } +#include "hello.h" +int +main(int argc, char *argv[]) +{ + printf(HELLO_MESSAGE); + return (0); +} @@ -376,12 +376,12 @@ coming into existence.) - env = Environment(CPPPATH = ['.']) - env.Program('hello.c') - Repository('__ROOT__/usr/repository1') +env = Environment(CPPPATH = ['.']) +env.Program('hello.c') +Repository('__ROOT__/usr/repository1') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -471,7 +471,7 @@ coming into existence.) - % scons -Q -Y /usr/repository1 -Y /usr/repository2 +% scons -Q -Y /usr/repository1 -Y /usr/repository2 @@ -515,18 +515,18 @@ coming into existence.) - env = Environment() - env.Program(['hello.c', 'file1.c', 'file2.c']) - Repository('/usr/repository1', '/usr/repository2') +env = Environment() +env.Program(['hello.c', 'file1.c', 'file2.c']) +Repository('/usr/repository1', '/usr/repository2') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int f1() { printf("file1\n"); } +int f1() { printf("file1\n"); } - int f2() { printf("file2.c\n"); } +int f2() { printf("file2.c\n"); } @@ -563,11 +563,11 @@ coming into existence.) --> - % cd $HOME/build - % edit hello.c - % scons -Q -Y /usr/repository1 - cc -c -o hello.o hello.c - cc -o hello hello.o /usr/repository1/file1.o /usr/repository1/file2.o +% cd $HOME/build +% edit hello.c +% scons -Q -Y /usr/repository1 +cc -c -o hello.o hello.c +cc -o hello hello.o /usr/repository1/file1.o /usr/repository1/file2.o @@ -594,10 +594,10 @@ coming into existence.) - % mkdir $HOME/build2 - % cd $HOME/build2 - % scons -Q -Y /usr/all/repository hello - scons: `hello' is up-to-date. +% mkdir $HOME/build2 +% cd $HOME/build2 +% scons -Q -Y /usr/all/repository hello +scons: `hello' is up-to-date. @@ -627,12 +627,12 @@ coming into existence.) - env = Environment() - hello = env.Program('hello.c') - Local(hello) +env = Environment() +hello = env.Program('hello.c') +Local(hello) - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -646,9 +646,9 @@ coming into existence.) - % scons -Y /usr/all/repository hello - Local copy of hello from /usr/all/repository/hello - scons: `hello' is up-to-date. +% scons -Y /usr/all/repository hello +Local copy of hello from /usr/all/repository/hello +scons: `hello' is up-to-date. diff --git a/doc/user/scanners.xml b/doc/user/scanners.xml index 46b2a9f..5ed0d62 100644 --- a/doc/user/scanners.xml +++ b/doc/user/scanners.xml @@ -172,7 +172,7 @@ over the file scanning rather than being called for each input line: - include filename.foo +include filename.foo @@ -186,13 +186,13 @@ over the file scanning rather than being called for each input line: - import re - - include_re = re.compile(r'^include\s+(\S+)$', re.M) - - def kfile_scan(node, env, path, arg): - contents = node.get_text_contents() - return env.File(include_re.findall(contents)) +import re + +include_re = re.compile(r'^include\s+(\S+)$', re.M) + +def kfile_scan(node, env, path, arg): + contents = node.get_text_contents() + return env.File(include_re.findall(contents)) @@ -295,9 +295,9 @@ over the file scanning rather than being called for each input line: - kscan = Scanner(function = kfile_scan, - skeys = ['.k']) - env.Append(SCANNERS = kscan) +kscan = Scanner(function = kfile_scan, + skeys = ['.k']) +env.Append(SCANNERS = kscan) @@ -393,9 +393,9 @@ over the file scanning rather than being called for each input line: - kscan = Scanner(function = kfile_scan, - skeys = ['.k'], - path=FindPathDirs('KPATH')) +kscan = Scanner(function = kfile_scan, + skeys = ['.k'], + path=FindPathDirs('KPATH')) diff --git a/doc/user/sconf.xml b/doc/user/sconf.xml index 92fb454..e787db9 100644 --- a/doc/user/sconf.xml +++ b/doc/user/sconf.xml @@ -80,10 +80,10 @@ - env = Environment() - conf = Configure(env) - # Checks for libraries, header files, etc. go here! - env = conf.Finish() +env = Environment() +conf = Configure(env) +# Checks for libraries, header files, etc. go here! +env = conf.Finish() @@ -131,14 +131,14 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckCHeader('math.h'): - print 'Math.h must be installed!' - Exit(1) - if conf.CheckCHeader('foo.h'): - conf.env.Append('-DHAS_FOO_H') - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckCHeader('math.h'): + print 'Math.h must be installed!' + Exit(1) +if conf.CheckCHeader('foo.h'): + conf.env.Append('-DHAS_FOO_H') +env = conf.Finish() @@ -159,12 +159,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckCXXHeader('vector.h'): - print 'vector.h must be installed!' - Exit(1) - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckCXXHeader('vector.h'): + print 'vector.h must be installed!' + Exit(1) +env = conf.Finish() @@ -180,12 +180,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckFunc('strcpy'): - print 'Did not find strcpy(), using local version' - conf.env.Append(CPPDEFINES = '-Dstrcpy=my_local_strcpy') - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckFunc('strcpy'): + print 'Did not find strcpy(), using local version' + conf.env.Append(CPPDEFINES = '-Dstrcpy=my_local_strcpy') +env = conf.Finish() @@ -204,12 +204,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckLib('m'): - print 'Did not find libm.a or m.lib, exiting!' - Exit(1) - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckLib('m'): + print 'Did not find libm.a or m.lib, exiting!' + Exit(1) +env = conf.Finish() @@ -225,12 +225,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckLibWithHeader('m', 'math.h', 'c'): - print 'Did not find libm.a or m.lib, exiting!' - Exit(1) - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckLibWithHeader('m', 'math.h', 'c'): + print 'Did not find libm.a or m.lib, exiting!' + Exit(1) +env = conf.Finish() @@ -254,12 +254,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckType('off_t'): - print 'Did not find off_t typedef, assuming int' - conf.env.Append(CCFLAGS = '-Doff_t=int') - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckType('off_t'): + print 'Did not find off_t typedef, assuming int' + conf.env.Append(CCFLAGS = '-Doff_t=int') +env = conf.Finish() @@ -273,12 +273,12 @@ - env = Environment() - conf = Configure(env) - if not conf.CheckType('off_t', '#include &lt;sys/types.h&gt;\n'): - print 'Did not find off_t typedef, assuming int' - conf.env.Append(CCFLAGS = '-Doff_t=int') - env = conf.Finish() +env = Environment() +conf = Configure(env) +if not conf.CheckType('off_t', '#include &lt;sys/types.h&gt;\n'): + print 'Did not find off_t typedef, assuming int' + conf.env.Append(CCFLAGS = '-Doff_t=int') +env = conf.Finish() @@ -358,8 +358,8 @@ - env = Environment() - conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) +env = Environment() +conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) @@ -414,10 +414,10 @@ - % scons - scons: Reading SConscript file ... - Checking for MyLibrary... failed - MyLibrary is not installed! +% scons +scons: Reading SConscript file ... +Checking for MyLibrary... failed +MyLibrary is not installed! @@ -428,14 +428,14 @@ - % scons - scons: Reading SConscript file ... - Checking for MyLibrary... failed - scons: done reading SConscript - scons: Building targets ... - . - . - . +% scons +scons: Reading SConscript file ... +Checking for MyLibrary... failed +scons: done reading SConscript +scons: Building targets ... + . + . + . @@ -455,10 +455,10 @@ - % scons -Q -c - Checking for MyLibrary... yes - Removed foo.o - Removed foo +% scons -Q -c +Checking for MyLibrary... yes +Removed foo.o +Removed foo @@ -474,19 +474,19 @@ - env = Environment() - if not env.GetOption('clean'): - conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) - if not conf.CheckMyLibrary(): - print 'MyLibrary is not installed!' - Exit(1) - env = conf.Finish() +env = Environment() +if not env.GetOption('clean'): + conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) + if not conf.CheckMyLibrary(): + print 'MyLibrary is not installed!' + Exit(1) + env = conf.Finish() - % scons -Q -c - Removed foo.o - Removed foo +% scons -Q -c +Removed foo.o +Removed foo diff --git a/doc/user/separate.xml b/doc/user/separate.xml index dfe83f6..0a2e0db 100644 --- a/doc/user/separate.xml +++ b/doc/user/separate.xml @@ -174,14 +174,14 @@ program using the F path name. - SConscript('src/SConscript', variant_dir='build') +SConscript('src/SConscript', variant_dir='build') - env = Environment() - env.Program('hello.c') +env = Environment() +env.Program('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -267,7 +267,7 @@ program using the F path name. - #include "file.h" +#include "file.h" @@ -320,7 +320,7 @@ program using the F path name. - SConscript('src/SConscript', variant_dir='build', duplicate=0) +SConscript('src/SConscript', variant_dir='build', duplicate=0) @@ -334,15 +334,15 @@ program using the F path name. - % ls src - SConscript - hello.c - % scons -Q - cc -c src/hello.c -o build/hello.o - cc -o build/hello build/hello.o - % ls build - hello - hello.o +% ls src +SConscript +hello.c +% scons -Q +cc -c src/hello.c -o build/hello.o +cc -o build/hello build/hello.o +% ls build +hello +hello.o @@ -360,12 +360,12 @@ program using the F path name. - VariantDir('build', 'src') - env = Environment() - env.Program('build/hello.c') +VariantDir('build', 'src') +env = Environment() +env.Program('build/hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -404,12 +404,12 @@ program using the F path name. - VariantDir('build', 'src', duplicate=0) - env = Environment() - env.Program('build/hello.c') +VariantDir('build', 'src', duplicate=0) +env = Environment() +env.Program('build/hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -444,15 +444,15 @@ program using the F path name. - VariantDir('build', 'src') - SConscript('build/SConscript') +VariantDir('build', 'src') +SConscript('build/SConscript') - env = Environment() - env.Program('hello.c') +env = Environment() +env.Program('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -502,22 +502,22 @@ program using the F path name. - VariantDir('build', 'src') - SConscript('build/SConscript') +VariantDir('build', 'src') +SConscript('build/SConscript') - env = Environment() - env.Program('hello', Glob('*.c')) +env = Environment() +env.Program('hello', Glob('*.c')) - #include "f2.h" - int main() { printf(f2()); } +#include "f2.h" +int main() { printf(f2()); } - const char * f2() { return("Hello, world!\n"); } +const char * f2() { return("Hello, world!\n"); } - const char * f2(); +const char * f2(); diff --git a/doc/user/sideeffect.xml b/doc/user/sideeffect.xml index c0c7eca..cf959af 100644 --- a/doc/user/sideeffect.xml +++ b/doc/user/sideeffect.xml @@ -77,12 +77,12 @@ - env = Environment() - f2 = env.Command('file2', 'log', Copy('$TARGET', '$SOURCE')) - f1 = env.Command('file1', [], - 'echo >$TARGET data1; echo >log updated file1')) - env.SideEffect('log', env.Command('file1', [], - 'echo >$TARGET data1; echo >log updated file1')) +env = Environment() +f2 = env.Command('file2', 'log', Copy('$TARGET', '$SOURCE')) +f1 = env.Command('file1', [], + 'echo >$TARGET data1; echo >log updated file1')) +env.SideEffect('log', env.Command('file1', [], + 'echo >$TARGET data1; echo >log updated file1')) @@ -114,11 +114,11 @@ - env = Environment() - env.Command('file1.out', 'file.in', - './build --log logfile.txt $SOURCE $TARGET') - env.Command('file2.out', 'file.in', - './build --log logfile.txt $SOURCE $TARGET') +env = Environment() +env.Command('file1.out', 'file.in', + './build --log logfile.txt $SOURCE $TARGET') +env.Command('file2.out', 'file.in', + './build --log logfile.txt $SOURCE $TARGET') @@ -155,17 +155,17 @@ - env = Environment() - f1 = env.Command('file1.out', 'file1.in', - './build --log logfile.txt $SOURCE $TARGET') - f2 = env.Command('file2.out', 'file2.in', - './build --log logfile.txt $SOURCE $TARGET') - env.SideEffect('logfile.txt', f1 + f2) +env = Environment() +f1 = env.Command('file1.out', 'file1.in', + './build --log logfile.txt $SOURCE $TARGET') +f2 = env.Command('file2.out', 'file2.in', + './build --log logfile.txt $SOURCE $TARGET') +env.SideEffect('logfile.txt', f1 + f2) file1.in file2.in - cat +cat @@ -199,11 +199,11 @@ - env = Environment() - f1 = env.Command('file1.out', [], 'echo >$TARGET data1') - env.SideEffect('not_really_updated', f1) - f2 = env.Command('file2.out', [], 'echo >$TARGET data2') - env.SideEffect('not_really_updated', f2) +env = Environment() +f1 = env.Command('file1.out', [], 'echo >$TARGET data1') +env.SideEffect('not_really_updated', f1) +f2 = env.Command('file2.out', [], 'echo >$TARGET data2') +env.SideEffect('not_really_updated', f2) diff --git a/doc/user/simple.xml b/doc/user/simple.xml index 0e67e1e..33b9e27 100644 --- a/doc/user/simple.xml +++ b/doc/user/simple.xml @@ -66,11 +66,11 @@ - int - main() - { - printf("Hello, world!\n"); - } +int +main() +{ + printf("Hello, world!\n"); +} @@ -82,10 +82,10 @@ - Program('hello.c') +Program('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -179,10 +179,10 @@ - Object('hello.c') +Object('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -228,16 +228,16 @@ - Java('classes', 'src') +Java('classes', 'src') - public class Example1 - { - public static void main(String[] args) - { - System.out.println("Hello Java world!\n"); - } - } +public class Example1 +{ + public static void main(String[] args) + { + System.out.println("Hello Java world!\n"); + } +} @@ -285,10 +285,10 @@ - Program('hello.c') +Program('hello.c') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } @@ -358,8 +358,8 @@ - # Arrange to build the "hello" program. - Program('hello.c') # "hello.c" is the source file. +# Arrange to build the "hello" program. +Program('hello.c') # "hello.c" is the source file. @@ -442,17 +442,17 @@ - print "Calling Program('hello.c')" - Program('hello.c') - print "Calling Program('goodbye.c')" - Program('goodbye.c') - print "Finished calling Program()" +print "Calling Program('hello.c')" +Program('hello.c') +print "Calling Program('goodbye.c')" +Program('goodbye.c') +print "Finished calling Program()" - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - int main() { printf("Goodbye, world!\n"); } +int main() { printf("Goodbye, world!\n"); } diff --git a/doc/user/sourcecode.xml b/doc/user/sourcecode.xml index 2225882..c6d645f 100644 --- a/doc/user/sourcecode.xml +++ b/doc/user/sourcecode.xml @@ -65,12 +65,12 @@ - env = Environment() - env.SourceCode('.', env.BitKeeper()) - env.Program('hello.c') +env = Environment() +env.SourceCode('.', env.BitKeeper()) +env.Program('hello.c') - s.hello.c +s.hello.c @@ -91,9 +91,9 @@ - env = Environment() - env.SourceCode('.', env.CVS('/usr/local/CVS')) - env.Program('hello.c') +env = Environment() +env.SourceCode('.', env.CVS('/usr/local/CVS')) +env.Program('hello.c') @@ -114,12 +114,12 @@ - env = Environment() - env.SourceCode('.', env.RCS()) - env.Program('hello.c') +env = Environment() +env.SourceCode('.', env.RCS()) +env.Program('hello.c') - hello.c,v +hello.c,v @@ -140,12 +140,12 @@ - env = Environment() - env.SourceCode('.', env.SCCS()) - env.Program('hello.c') +env = Environment() +env.SourceCode('.', env.SCCS()) +env.Program('hello.c') - s.hello.c +s.hello.c @@ -168,9 +168,9 @@ - env = Environment() - env.SourceCode('.', env.Subversion('XXX')) - env.Program('hello.c') +env = Environment() +env.SourceCode('.', env.Subversion('XXX')) +env.Program('hello.c') diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml index 076c054..94af727 100644 --- a/doc/user/troubleshoot.xml +++ b/doc/user/troubleshoot.xml @@ -92,12 +92,12 @@ - # Intentionally misspell the output file name in the - # command used to create the file: - Command('file.out', 'file.in', 'cp $SOURCE file.oout') +# Intentionally misspell the output file name in the +# command used to create the file: +Command('file.out', 'file.in', 'cp $SOURCE file.oout') - file.in +file.in @@ -174,16 +174,16 @@ - Program('prog', ['file1.c', 'file2.c', 'file3.c']) +Program('prog', ['file1.c', 'file2.c', 'file3.c']) - file1.c +file1.c - file2.c +file2.c - file3.c +file3.c @@ -212,21 +212,21 @@ - Program('prog', ['file1.c', 'file2.c', 'file3.c'], CPPPATH='.') +Program('prog', ['file1.c', 'file2.c', 'file3.c'], CPPPATH='.') - #include <hello.h> - file1.c +#include <hello.h> +file1.c - file2.c +file2.c - #include <hello.h> - file3.c +#include <hello.h> +file3.c - #define string "world" +#define string "world" @@ -278,8 +278,8 @@ - env = Environment() - print env.Dump() +env = Environment() +print env.Dump() @@ -338,8 +338,8 @@ - env = Environment() - print env.Dump('ENV') +env = Environment() +print env.Dump('ENV') @@ -391,20 +391,20 @@ - env = Environment(CPPPATH = ['.']) - env.Program('prog', ['f1.c', 'f2.c', 'f3.c']) +env = Environment(CPPPATH = ['.']) +env.Program('prog', ['f1.c', 'f2.c', 'f3.c']) - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - inc.h +inc.h @@ -523,30 +523,30 @@ - env = Environment(CPPPATH = ['.'], - LIBS = ['foo'], - LIBPATH = ['.']) - env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) - env.Program('prog1.c') - env.Program('prog2.c') +env = Environment(CPPPATH = ['.'], + LIBS = ['foo'], + LIBPATH = ['.']) +env.Library('foo', ['f1.c', 'f2.c', 'f3.c']) +env.Program('prog1.c') +env.Program('prog2.c') - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - #include "inc.h" +#include "inc.h" - inc.h +inc.h @@ -609,11 +609,11 @@ - env = Environment(CPPPATH = ['.']) - env.Program('prog', 'prog.c') +env = Environment(CPPPATH = ['.']) +env.Program('prog', 'prog.c') - prog.c +prog.c @@ -630,13 +630,13 @@ --> - % scons -Q --debug=presub - Building prog.o with action: - $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCOMCOM $SOURCES - cc -o prog.o -c -I. prog.c - Building prog with action: - $SMART_LINKCOM - cc -o prog prog.o +% scons -Q --debug=presub +Building prog.o with action: + $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCOMCOM $SOURCES +cc -o prog.o -c -I. prog.c +Building prog with action: + $SMART_LINKCOM +cc -o prog prog.o @@ -657,17 +657,17 @@ - env = Environment(LIBPATH = ['libs1', 'libs2']) - env.Program('prog.c', LIBS=['foo', 'bar']) +env = Environment(LIBPATH = ['libs1', 'libs2']) +env.Program('prog.c', LIBS=['foo', 'bar']) - prog.c +prog.c - libs1/libfoo.a +libs1/libfoo.a - libs2/libbar.a +libs2/libbar.a @@ -701,19 +701,19 @@ - env = Environment(CPPPATH = ['inc1', 'inc2']) - env.Program('prog.c') +env = Environment(CPPPATH = ['inc1', 'inc2']) +env.Program('prog.c') - #include "file1.h" - #include "file2.h" - prog.c +#include "file1.h" +#include "file2.h" +prog.c - inc1/file1.h +inc1/file1.h - inc2/file2.h +inc2/file2.h @@ -749,7 +749,7 @@ - Program('prog.c') +Program('prog.c') @@ -829,15 +829,15 @@ - env = Environment(CPPPATH = ['.']) - env.Program('prog.c') +env = Environment(CPPPATH = ['.']) +env.Program('prog.c') - #include "inc.h" - prog.c +#include "inc.h" +prog.c - #define STRING "one" +#define STRING "one" diff --git a/doc/user/variants.xml b/doc/user/variants.xml index 491074f..f14cf6e 100644 --- a/doc/user/variants.xml +++ b/doc/user/variants.xml @@ -159,9 +159,9 @@ is pretty smart about rebuilding things when you change options. - env = Environment(OS = ARGUMENTS.get('OS')) - for os in ['newell', 'post']: - SConscript('src/SConscript', variant_dir='build/' + os) +env = Environment(OS = ARGUMENTS.get('OS')) +for os in ['newell', 'post']: + SConscript('src/SConscript', variant_dir='build/' + os) -- cgit v0.12 From a177bfae9c77a166aba93a8c0c4ab4cfc9012e71 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sun, 6 Oct 2013 18:48:36 +0200 Subject: - additional corrections for left alignment --- doc/generated/variables.gen | 2 + doc/user/add-method.xml | 36 ++++++------ doc/user/builders-writing.xml | 44 +++++++-------- doc/user/caching.xml | 22 ++++---- doc/user/command-line.xml | 44 +++++++-------- doc/user/depends.xml | 96 ++++++++++++++++---------------- doc/user/environments.xml | 96 +++++++++++++++----------------- doc/user/less-simple.xml | 14 ++--- doc/user/misc.xml | 36 ++++++------ doc/user/nodes.xml | 8 +-- doc/user/output.xml | 124 +++++++++++++++++++++--------------------- doc/user/scanners.xml | 28 +++++----- doc/user/sconf.xml | 74 ++++++++++++------------- doc/user/variants.xml | 56 +++++++++---------- src/engine/SCons/Tool/zip.xml | 2 + 15 files changed, 339 insertions(+), 343 deletions(-) diff --git a/doc/generated/variables.gen b/doc/generated/variables.gen index b213916..784cd28 100644 --- a/doc/generated/variables.gen +++ b/doc/generated/variables.gen @@ -7355,11 +7355,13 @@ General options passed to the zip utility. ZIPROOT + An optional zip root directory (default empty). The filenames stored in the zip file will be relative to this directory, if given. Otherwise the filenames are relative to the current directory of the command. For instance: + env = Environment() env.Zip('foo.zip', 'subdir1/subdir2/file1', ZIPROOT='subdir1') diff --git a/doc/user/add-method.xml b/doc/user/add-method.xml index e94626b..c50786c 100644 --- a/doc/user/add-method.xml +++ b/doc/user/add-method.xml @@ -100,28 +100,28 @@ int main() { printf("Hello, world!\n"); } - def BuildTestProg(env, testfile, resourcefile, testdir="tests"): - """Build the test program; - prepends "test_" to src and target, - and puts target into testdir.""" - srcfile = "test_%s.c" % testfile - target = "%s/test_%s" % (testdir, testfile) - if env['PLATFORM'] == 'win32': - resfile = env.RES(resourcefile) - p = env.Program(target, [srcfile, resfile]) - else: - p = env.Program(target, srcfile) - return p - AddMethod(Environment, BuildTestProg) - - env = Environment() - env.BuildTestProg('stuff', resourcefile='res.rc') +def BuildTestProg(env, testfile, resourcefile, testdir="tests"): + """Build the test program; + prepends "test_" to src and target, + and puts target into testdir.""" + srcfile = "test_%s.c" % testfile + target = "%s/test_%s" % (testdir, testfile) + if env['PLATFORM'] == 'win32': + resfile = env.RES(resourcefile) + p = env.Program(target, [srcfile, resfile]) + else: + p = env.Program(target, srcfile) + return p +AddMethod(Environment, BuildTestProg) + +env = Environment() +env.BuildTestProg('stuff', resourcefile='res.rc') - int main() { printf("Hello, world!\n"); } +int main() { printf("Hello, world!\n"); } - res.rc +res.rc diff --git a/doc/user/builders-writing.xml b/doc/user/builders-writing.xml index 383823a..e6e2aaf 100644 --- a/doc/user/builders-writing.xml +++ b/doc/user/builders-writing.xml @@ -812,38 +812,38 @@ env.Foo('file') - bld = Builder(action = 'my_command $SOURCES > $TARGET', - suffix = '.foo', - src_suffix = '.input', - emitter = '$MY_EMITTER') - def modify1(target, source, env): - return target, source + ['modify1.in'] - def modify2(target, source, env): - return target, source + ['modify2.in'] - env1 = Environment(BUILDERS = {'Foo' : bld}, - MY_EMITTER = modify1) - env2 = Environment(BUILDERS = {'Foo' : bld}, - MY_EMITTER = modify2) - env1.Foo('file1') - env2.Foo('file2') - import os - env1['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd() - env2['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd() +bld = Builder(action = 'my_command $SOURCES > $TARGET', + suffix = '.foo', + src_suffix = '.input', + emitter = '$MY_EMITTER') +def modify1(target, source, env): + return target, source + ['modify1.in'] +def modify2(target, source, env): + return target, source + ['modify2.in'] +env1 = Environment(BUILDERS = {'Foo' : bld}, + MY_EMITTER = modify1) +env2 = Environment(BUILDERS = {'Foo' : bld}, + MY_EMITTER = modify2) +env1.Foo('file1') +env2.Foo('file2') +import os +env1['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd() +env2['ENV']['PATH'] = env2['ENV']['PATH'] + os.pathsep + os.getcwd() - file1.input +file1.input - file2.input +file2.input - modify1.input +modify1.input - modify2.input +modify2.input - cat +cat diff --git a/doc/user/caching.xml b/doc/user/caching.xml index f728653..9c66c31 100644 --- a/doc/user/caching.xml +++ b/doc/user/caching.xml @@ -424,20 +424,20 @@ Program('prog', scons -Q - -random - We captured it directly here to guarantee a "random" order, - guarding against the potential for - -random to happen - to return things in the original sorted order. +We captured it directly here to guarantee a "random" order, +guarding against the potential for - -random to happen +to return things in the original sorted order. - --> +--> - % scons -Q --random - cc -o f3.o -c f3.c - cc -o f1.o -c f1.c - cc -o f5.o -c f5.c - cc -o f2.o -c f2.c - cc -o f4.o -c f4.c - cc -o prog f1.o f2.o f3.o f4.o f5.o + % scons -Q --random + cc -o f3.o -c f3.c + cc -o f1.o -c f1.c + cc -o f5.o -c f5.c + cc -o f2.o -c f2.c + cc -o f4.o -c f4.c + cc -o prog f1.o f2.o f3.o f4.o f5.o diff --git a/doc/user/command-line.xml b/doc/user/command-line.xml index d2e4146..f410b3e 100644 --- a/doc/user/command-line.xml +++ b/doc/user/command-line.xml @@ -628,21 +628,21 @@ foo.in - AddOption('--prefix', - dest='prefix', - type='string', - nargs=1, - action='store', - metavar='DIR', - help='installation prefix') - - env = Environment(PREFIX = GetOption('prefix')) - - installed_foo = env.Install('$PREFIX/usr/bin', 'foo.in') - Default(installed_foo) +AddOption('--prefix', + dest='prefix', + type='string', + nargs=1, + action='store', + metavar='DIR', + help='installation prefix') + +env = Environment(PREFIX = GetOption('prefix')) + +installed_foo = env.Install('$PREFIX/usr/bin', 'foo.in') +Default(installed_foo) - foo.in +foo.in @@ -1092,21 +1092,21 @@ RELEASE = 1 - vars = Variables('custom.py') - vars.Add('RELEASE', 'Set to 1 to build for release', 0) - env = Environment(variables = vars, - CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) - env.Program(['foo.c', 'bar.c']) - Help(vars.GenerateHelpText(env)) + vars = Variables('custom.py') + vars.Add('RELEASE', 'Set to 1 to build for release', 0) + env = Environment(variables = vars, + CPPDEFINES={'RELEASE_BUILD' : '${RELEASE}'}) + env.Program(['foo.c', 'bar.c']) + Help(vars.GenerateHelpText(env)) - foo.c +foo.c - bar.c +bar.c - RELEASE = 0 +RELEASE = 0 diff --git a/doc/user/depends.xml b/doc/user/depends.xml index 2dd7ea6..3882af7 100644 --- a/doc/user/depends.xml +++ b/doc/user/depends.xml @@ -657,7 +657,7 @@ def update_file(): f = open("test.txt","a") f.write("some line\n") f.close() - + update_file() # Activate our own decider function @@ -1364,18 +1364,18 @@ cc -o hello hello.o - #define FOO_HEADER <foo.h> - #include FOO_HEADER +#define FOO_HEADER <foo.h> +#include FOO_HEADER - int main() { - return FOO; - } +int main() { + return FOO; +} - Program('hello', 'hello.c', CPPPATH='.') +Program('hello', 'hello.c', CPPPATH='.') - #define FOO 42 +#define FOO 42 @@ -1416,24 +1416,24 @@ cc -o hello hello.o - #define FOO_HEADER <foo.h> - #include FOO_HEADER +#define FOO_HEADER <foo.h> +#include FOO_HEADER - int main() { - return FOO; - } +int main() { + return FOO; +} - obj = Object('hello.c', CCFLAGS='-MD -MF hello.d', CPPPATH='.') - SideEffect('hello.d', obj) - ParseDepends('hello.d') - Program('hello', obj) +obj = Object('hello.c', CCFLAGS='-MD -MF hello.d', CPPPATH='.') +SideEffect('hello.d', obj) +ParseDepends('hello.d') +Program('hello', obj) - #define FOO 42 +#define FOO 42 - hello.o: hello.c foo.h +hello.o: hello.c foo.h @@ -1453,21 +1453,21 @@ cc -o hello hello.o - #define FOO_HEADER <foo.h> - #include FOO_HEADER +#define FOO_HEADER <foo.h> +#include FOO_HEADER - int main() { - return FOO; - } +int main() { + return FOO; +} - obj = Object('hello.c', CCFLAGS='-MD -MF hello.d', CPPPATH='.') - SideEffect('hello.d', obj) - ParseDepends('hello.d') - Program('hello', obj) +obj = Object('hello.c', CCFLAGS='-MD -MF hello.d', CPPPATH='.') +SideEffect('hello.d', obj) +ParseDepends('hello.d') +Program('hello', obj) - #define FOO 42 +#define FOO 42 @@ -1669,18 +1669,18 @@ int main() { printf("Hello!\n"); } - import time +import time - version_c_text = """ - char *date = "%s"; - """ % time.ctime(time.time()) - open('version.c', 'w').write(version_c_text) +version_c_text = """ +char *date = "%s"; +""" % time.ctime(time.time()) +open('version.c', 'w').write(version_c_text) - hello = Program(['hello.c', 'version.c']) +hello = Program(['hello.c', 'version.c']) - extern char *date; - int main() { printf("Hello, %s! I was built: %s\n", date); } +extern char *date; +int main() { printf("Hello, %s! I was built: %s\n", date); } @@ -1728,23 +1728,23 @@ int main() { printf("Hello!\n"); } - import time +import time - version_c_text = """ - char *date = "%s"; - """ % time.ctime(time.time()) - open('version.c', 'w').write(version_c_text) +version_c_text = """ +char *date = "%s"; +""" % time.ctime(time.time()) +open('version.c', 'w').write(version_c_text) - version_obj = Object('version.c') +version_obj = Object('version.c') - hello = Program('hello.c', - LINKFLAGS = str(version_obj[0])) +hello = Program('hello.c', + LINKFLAGS = str(version_obj[0])) - Requires(hello, version_obj) +Requires(hello, version_obj) - extern char *date; - int main() { printf("Hello, %s! I was built: %s\n", date); } +extern char *date; +int main() { printf("Hello, %s! I was built: %s\n", date); } diff --git a/doc/user/environments.xml b/doc/user/environments.xml index f11a95b..b9585cb 100644 --- a/doc/user/environments.xml +++ b/doc/user/environments.xml @@ -579,13 +579,13 @@ env = Environment() - env = Environment(CC = 'gcc', - CCFLAGS = '-O2') + env = Environment(CC = 'gcc', + CCFLAGS = '-O2') - env.Program('foo.c') + env.Program('foo.c') - int main() { } +int main() { } @@ -861,8 +861,6 @@ print "value is:", env.subst( '->${1 / 0}<-' ) scons -Q - - If &AllowSubstExceptions; is called multiple times, each call @@ -903,9 +901,7 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - - DefaultEnvironment(CC = '/usr/local/bin/gcc') - +DefaultEnvironment(CC = '/usr/local/bin/gcc') @@ -937,10 +933,8 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - - env = DefaultEnvironment() - env['CC'] = '/usr/local/bin/gcc' - +env = DefaultEnvironment() +env['CC'] = '/usr/local/bin/gcc' @@ -966,10 +960,8 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - - env = DefaultEnvironment(tools = ['gcc', 'gnulink'], - CC = '/usr/local/bin/gcc') - +env = DefaultEnvironment(tools = ['gcc', 'gnulink'], + CC = '/usr/local/bin/gcc') @@ -1005,18 +997,18 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - opt = Environment(CCFLAGS = '-O2') - dbg = Environment(CCFLAGS = '-g') +opt = Environment(CCFLAGS = '-O2') +dbg = Environment(CCFLAGS = '-g') - opt.Program('foo', 'foo.c') +opt.Program('foo', 'foo.c') - dbg.Program('bar', 'bar.c') +dbg.Program('bar', 'bar.c') - int main() { } +int main() { } - int main() { } +int main() { } @@ -1036,15 +1028,15 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - opt = Environment(CCFLAGS = '-O2') - dbg = Environment(CCFLAGS = '-g') +opt = Environment(CCFLAGS = '-O2') +dbg = Environment(CCFLAGS = '-g') - opt.Program('foo', 'foo.c') +opt.Program('foo', 'foo.c') - dbg.Program('foo', 'foo.c') +dbg.Program('foo', 'foo.c') - int main() { } +int main() { } @@ -1081,17 +1073,17 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - opt = Environment(CCFLAGS = '-O2') - dbg = Environment(CCFLAGS = '-g') +opt = Environment(CCFLAGS = '-O2') +dbg = Environment(CCFLAGS = '-g') - o = opt.Object('foo-opt', 'foo.c') - opt.Program(o) +o = opt.Object('foo-opt', 'foo.c') +opt.Program(o) - d = dbg.Object('foo-dbg', 'foo.c') - dbg.Program(d) +d = dbg.Object('foo-dbg', 'foo.c') +dbg.Program(d) - int main() { } +int main() { } @@ -1149,20 +1141,20 @@ print "value is:", env.subst( '->${1 / 0}<-' ) - env = Environment(CC = 'gcc') - opt = env.Clone(CCFLAGS = '-O2') - dbg = env.Clone(CCFLAGS = '-g') +env = Environment(CC = 'gcc') +opt = env.Clone(CCFLAGS = '-O2') +dbg = env.Clone(CCFLAGS = '-g') - env.Program('foo', 'foo.c') +env.Program('foo', 'foo.c') - o = opt.Object('foo-opt', 'foo.c') - opt.Program(o) +o = opt.Object('foo-opt', 'foo.c') +opt.Program(o) - d = dbg.Object('foo-dbg', 'foo.c') - dbg.Program(d) +d = dbg.Object('foo-dbg', 'foo.c') +dbg.Program(d) - int main() { } +int main() { } @@ -1258,19 +1250,19 @@ print "NEW_VARIABLE =", env['NEW_VARIABLE'] - env = Environment(CCFLAGS = '-DDEFINE1') - print "CCFLAGS =", env['CCFLAGS'] - env.Program('foo.c') +env = Environment(CCFLAGS = '-DDEFINE1') +print "CCFLAGS =", env['CCFLAGS'] +env.Program('foo.c') - env.Replace(CCFLAGS = '-DDEFINE2') - print "CCFLAGS =", env['CCFLAGS'] - env.Program('bar.c') +env.Replace(CCFLAGS = '-DDEFINE2') +print "CCFLAGS =", env['CCFLAGS'] +env.Program('bar.c') - int main() { } +int main() { } - int main() { } +int main() { } diff --git a/doc/user/less-simple.xml b/doc/user/less-simple.xml index 4c60cc7..41a1f3d 100644 --- a/doc/user/less-simple.xml +++ b/doc/user/less-simple.xml @@ -337,15 +337,15 @@ Program('program2', ['program2.c']) - common_sources = ['file1.c', 'file2.c'] +common_sources = ['file1.c', 'file2.c'] - # THE FOLLOWING IS INCORRECT AND GENERATES A PYTHON ERROR - # BECAUSE IT TRIES TO ADD A STRING TO A LIST: - Program('program1', common_sources + 'program1.c') +# THE FOLLOWING IS INCORRECT AND GENERATES A PYTHON ERROR +# BECAUSE IT TRIES TO ADD A STRING TO A LIST: +Program('program1', common_sources + 'program1.c') - # The following works correctly, because it's adding two - # lists together to make another list. - Program('program2', common_sources + ['program2.c']) +# The following works correctly, because it's adding two +# lists together to make another list. +Program('program2', common_sources + ['program2.c']) diff --git a/doc/user/misc.xml b/doc/user/misc.xml index 4145d49..d0aeb59 100644 --- a/doc/user/misc.xml +++ b/doc/user/misc.xml @@ -501,20 +501,20 @@ prog2.c - objects = [ - Object('prog1.c'), - Object('prog2.c', CCFLAGS='-DFOO'), - ] - Program(objects) +objects = [ + Object('prog1.c'), + Object('prog2.c', CCFLAGS='-DFOO'), +] +Program(objects) - for object_file in objects: - print object_file.abspath +for object_file in objects: + print object_file.abspath - prog1.c +prog1.c - prog2.c +prog2.c @@ -542,20 +542,20 @@ prog2.c - objects = [ - Object('prog1.c'), - Object('prog2.c', CCFLAGS='-DFOO'), - ] - Program(objects) +objects = [ + Object('prog1.c'), + Object('prog2.c', CCFLAGS='-DFOO'), +] +Program(objects) - for object_file in Flatten(objects): - print object_file.abspath +for object_file in Flatten(objects): + print object_file.abspath - prog1.c +prog1.c - prog2.c +prog2.c diff --git a/doc/user/nodes.xml b/doc/user/nodes.xml index 78f15e3..1c9b4fd 100644 --- a/doc/user/nodes.xml +++ b/doc/user/nodes.xml @@ -183,11 +183,11 @@ int main() { printf("Goodbye, world!\n"); } - hello_c = File('hello.c') - Program(hello_c) +hello_c = File('hello.c') +Program(hello_c) - classes = Dir('classes') - Java(classes, 'src') +classes = Dir('classes') +Java(classes, 'src') diff --git a/doc/user/output.xml b/doc/user/output.xml index de6b8d4..069d525 100644 --- a/doc/user/output.xml +++ b/doc/user/output.xml @@ -132,12 +132,12 @@ Type: 'scons program' to build the production program, - env = Environment() +env = Environment() - Help("\nType: 'scons program' to build the production program.\n") +Help("\nType: 'scons program' to build the production program.\n") - if env['PLATFORM'] == 'win32': - Help("\nType: 'scons windebug' to build the Windows debug version.\n") +if env['PLATFORM'] == 'win32': + Help("\nType: 'scons windebug' to build the Windows debug version.\n") @@ -522,13 +522,13 @@ Program('f2.c') - screen = open('/dev/tty', 'w') - count = 0 - def progress_function(node) - count += 1 - screen.write('Node %4d: %s\r' % (count, node)) +screen = open('/dev/tty', 'w') +count = 0 +def progress_function(node) + count += 1 + screen.write('Node %4d: %s\r' % (count, node)) - Progress(progress_function) +Progress(progress_function) @@ -595,13 +595,13 @@ Program('f2.c') - import atexit +import atexit - def print_build_failures(): - from SCons.Script import GetBuildFailures - for bf in GetBuildFailures(): - print "%s failed: %s" % (bf.node, bf.errstr) - atexit.register(print_build_failures) +def print_build_failures(): + from SCons.Script import GetBuildFailures + for bf in GetBuildFailures(): + print "%s failed: %s" % (bf.node, bf.errstr) +atexit.register(print_build_failures) @@ -639,52 +639,52 @@ Program('f2.c') - # Make the build fail if we pass fail=1 on the command line - if ARGUMENTS.get('fail', 0): - Command('target', 'source', ['/bin/false']) - - def bf_to_str(bf): - """Convert an element of GetBuildFailures() to a string - in a useful way.""" - import SCons.Errors - if bf is None: # unknown targets product None in list - return '(unknown tgt)' - elif isinstance(bf, SCons.Errors.StopError): - return str(bf) - elif bf.node: - return str(bf.node) + ': ' + bf.errstr - elif bf.filename: - return bf.filename + ': ' + bf.errstr - return 'unknown failure: ' + bf.errstr - import atexit - - def build_status(): - """Convert the build status to a 2-tuple, (status, msg).""" - from SCons.Script import GetBuildFailures - bf = GetBuildFailures() - if bf: - # bf is normally a list of build failures; if an element is None, - # it's because of a target that scons doesn't know anything about. - status = 'failed' - failures_message = "\n".join(["Failed building %s" % bf_to_str(x) - for x in bf if x is not None]) - else: - # if bf is None, the build completed successfully. - status = 'ok' - failures_message = '' - return (status, failures_message) - - def display_build_status(): - """Display the build status. Called by atexit. - Here you could do all kinds of complicated things.""" - status, failures_message = build_status() - if status == 'failed': - print "FAILED!!!!" # could display alert, ring bell, etc. - elif status == 'ok': - print "Build succeeded." - print failures_message - - atexit.register(display_build_status) +# Make the build fail if we pass fail=1 on the command line +if ARGUMENTS.get('fail', 0): + Command('target', 'source', ['/bin/false']) + +def bf_to_str(bf): + """Convert an element of GetBuildFailures() to a string + in a useful way.""" + import SCons.Errors + if bf is None: # unknown targets product None in list + return '(unknown tgt)' + elif isinstance(bf, SCons.Errors.StopError): + return str(bf) + elif bf.node: + return str(bf.node) + ': ' + bf.errstr + elif bf.filename: + return bf.filename + ': ' + bf.errstr + return 'unknown failure: ' + bf.errstr +import atexit + +def build_status(): + """Convert the build status to a 2-tuple, (status, msg).""" + from SCons.Script import GetBuildFailures + bf = GetBuildFailures() + if bf: + # bf is normally a list of build failures; if an element is None, + # it's because of a target that scons doesn't know anything about. + status = 'failed' + failures_message = "\n".join(["Failed building %s" % bf_to_str(x) + for x in bf if x is not None]) + else: + # if bf is None, the build completed successfully. + status = 'ok' + failures_message = '' + return (status, failures_message) + +def display_build_status(): + """Display the build status. Called by atexit. + Here you could do all kinds of complicated things.""" + status, failures_message = build_status() + if status == 'failed': + print "FAILED!!!!" # could display alert, ring bell, etc. + elif status == 'ok': + print "Build succeeded." + print failures_message + +atexit.register(display_build_status) diff --git a/doc/user/scanners.xml b/doc/user/scanners.xml index 5ed0d62..758a849 100644 --- a/doc/user/scanners.xml +++ b/doc/user/scanners.xml @@ -308,34 +308,34 @@ env.Append(SCANNERS = kscan) - import re + import re - include_re = re.compile(r'^include\s+(\S+)$', re.M) + include_re = re.compile(r'^include\s+(\S+)$', re.M) - def kfile_scan(node, env, path): - contents = node.get_text_contents() - includes = include_re.findall(contents) - return env.File(includes) + def kfile_scan(node, env, path): + contents = node.get_text_contents() + includes = include_re.findall(contents) + return env.File(includes) - kscan = Scanner(function = kfile_scan, - skeys = ['.k']) + kscan = Scanner(function = kfile_scan, + skeys = ['.k']) - env = Environment(ENV = {'PATH' : '__ROOT__/usr/local/bin'}) - env.Append(SCANNERS = kscan) + env = Environment(ENV = {'PATH' : '__ROOT__/usr/local/bin'}) + env.Append(SCANNERS = kscan) - env.Command('foo', 'foo.k', 'kprocess < $SOURCES > $TARGET') + env.Command('foo', 'foo.k', 'kprocess < $SOURCES > $TARGET') - include other_file +include other_file - other_file +other_file - cat +cat diff --git a/doc/user/sconf.xml b/doc/user/sconf.xml index e787db9..31bd45e 100644 --- a/doc/user/sconf.xml +++ b/doc/user/sconf.xml @@ -303,20 +303,20 @@ env = conf.Finish() - mylib_test_source_file = """ - #include &lt;mylib.h&gt; - int main(int argc, char **argv) - { - MyLibrary mylib(argc, argv); - return 0; - } - """ - - def CheckMyLibrary(context): - context.Message('Checking for MyLibrary...') - result = context.TryLink(mylib_test_source_file, '.c') - context.Result(result) - return result +mylib_test_source_file = """ +#include &lt;mylib.h&gt; +int main(int argc, char **argv) +{ + MyLibrary mylib(argc, argv); + return 0; +} +""" + +def CheckMyLibrary(context): + context.Message('Checking for MyLibrary...') + result = context.TryLink(mylib_test_source_file, '.c') + context.Result(result) + return result @@ -380,30 +380,30 @@ conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) - mylib_test_source_file = """ - #include &lt;mylib.h&gt; - int main(int argc, char **argv) - { - MyLibrary mylib(argc, argv); - return 0; - } - """ - - def CheckMyLibrary(context): - context.Message('Checking for MyLibrary... ') - result = context.TryLink(mylib_test_source_file, '.c') - context.Result(result) - return result - - env = Environment() - conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) - if not conf.CheckMyLibrary(): - print 'MyLibrary is not installed!' - Exit(1) - env = conf.Finish() +mylib_test_source_file = """ +#include &lt;mylib.h&gt; +int main(int argc, char **argv) +{ + MyLibrary mylib(argc, argv); + return 0; +} +""" + +def CheckMyLibrary(context): + context.Message('Checking for MyLibrary... ') + result = context.TryLink(mylib_test_source_file, '.c') + context.Result(result) + return result + +env = Environment() +conf = Configure(env, custom_tests = {'CheckMyLibrary' : CheckMyLibrary}) +if not conf.CheckMyLibrary(): + print 'MyLibrary is not installed!' + Exit(1) +env = conf.Finish() - # We would then add actual calls like Program() to build - # something using the "env" construction environment. +# We would then add actual calls like Program() to build +# something using the "env" construction environment. diff --git a/doc/user/variants.xml b/doc/user/variants.xml index f14cf6e..74a155b 100644 --- a/doc/user/variants.xml +++ b/doc/user/variants.xml @@ -84,53 +84,53 @@ is pretty smart about rebuilding things when you change options. - platform = ARGUMENTS.get('OS', Platform()) +platform = ARGUMENTS.get('OS', Platform()) - include = "#export/$PLATFORM/include" - lib = "#export/$PLATFORM/lib" - bin = "#export/$PLATFORM/bin" +include = "#export/$PLATFORM/include" +lib = "#export/$PLATFORM/lib" +bin = "#export/$PLATFORM/bin" - env = Environment(PLATFORM = platform, - BINDIR = bin, - INCDIR = include, - LIBDIR = lib, - CPPPATH = [include], - LIBPATH = [lib], - LIBS = 'world') +env = Environment(PLATFORM = platform, + BINDIR = bin, + INCDIR = include, + LIBDIR = lib, + CPPPATH = [include], + LIBPATH = [lib], + LIBS = 'world') - Export('env') +Export('env') - env.SConscript('src/SConscript', variant_dir='build/$PLATFORM') +env.SConscript('src/SConscript', variant_dir='build/$PLATFORM') - Import('env') - SConscript('hello/SConscript') - SConscript('world/SConscript') +Import('env') +SConscript('hello/SConscript') +SConscript('world/SConscript') - Import('env') - hello = env.Program('hello.c') - env.Install('$BINDIR', hello) +Import('env') +hello = env.Program('hello.c') +env.Install('$BINDIR', hello) - #include "world.h" - int main(int argc, char *argv[]) { printf "hello.c\n"; world(); } +#include "world.h" +int main(int argc, char *argv[]) { printf "hello.c\n"; world(); } - Import('env') - world = env.Library('world.c') - env.Install('$LIBDIR', world) - env.Install('$INCDIR', 'world.h') +Import('env') +world = env.Library('world.c') +env.Install('$LIBDIR', world) +env.Install('$INCDIR', 'world.h') - #define STRING "world.h" - extern int world(); +#define STRING "world.h" +extern int world(); - int world() { printf "world.c\n"; } +int world() { printf "world.c\n"; } diff --git a/src/engine/SCons/Tool/zip.xml b/src/engine/SCons/Tool/zip.xml index af68533..f43aa31 100644 --- a/src/engine/SCons/Tool/zip.xml +++ b/src/engine/SCons/Tool/zip.xml @@ -145,11 +145,13 @@ The suffix used for zip file names. + An optional zip root directory (default empty). The filenames stored in the zip file will be relative to this directory, if given. Otherwise the filenames are relative to the current directory of the command. For instance: + env = Environment() env.Zip('foo.zip', 'subdir1/subdir2/file1', ZIPROOT='subdir1') -- cgit v0.12 From 17832ddc1e166221b0cd20da3a6969a65deba247 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sun, 6 Oct 2013 20:04:55 +0200 Subject: - corrected dependency example --- doc/generated/examples/depends_ex1_5.xml | 2 +- doc/user/depends.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/generated/examples/depends_ex1_5.xml b/doc/generated/examples/depends_ex1_5.xml index 136def6..abbe64e 100644 --- a/doc/generated/examples/depends_ex1_5.xml +++ b/doc/generated/examples/depends_ex1_5.xml @@ -5,5 +5,5 @@ cc -o hello hello.o % [CHANGE A COMMENT IN hello.c] % scons -Q hello cc -o hello.o -c hello.c -cc -o hello hello.o +scons: `hello' is up to date. diff --git a/doc/user/depends.xml b/doc/user/depends.xml index 3882af7..a5639a1 100644 --- a/doc/user/depends.xml +++ b/doc/user/depends.xml @@ -64,7 +64,7 @@ Program('hello.c') int main() { printf("Hello, world!\n"); } - + -- cgit v0.12 From d5870b7149bcb4058c21288827a5c79f2f12ccdb Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 7 Oct 2013 10:00:12 +0100 Subject: Fix names in several places and refer to the .PHONY command in the documentation. --- src/engine/SCons/EnvironmentTests.py | 2 +- src/engine/SCons/Node/NodeTests.py | 2 +- src/engine/SCons/Script/Main.xml | 14 +++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index a4fbefb..7fa8af4 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -3126,7 +3126,7 @@ def generate(env): assert t[4].precious def test_Pseudo(self): - """Test the Precious() method""" + """Test the Pseudo() method""" env = self.TestEnvironment(FOO='ggg', BAR='hhh') env.Dir('p_hhhb') env.File('p_d') diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 620c09b..076ca65 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -694,7 +694,7 @@ class NodeTestCase(unittest.TestCase): assert node.precious == 7 def test_set_pseudo(self): - """Test setting a Node's phony value + """Test setting a Node's pseudo value """ node = SCons.Node.Node() node.set_pseudo() diff --git a/src/engine/SCons/Script/Main.xml b/src/engine/SCons/Script/Main.xml index 99e066e..147e778 100644 --- a/src/engine/SCons/Script/Main.xml +++ b/src/engine/SCons/Script/Main.xml @@ -685,18 +685,22 @@ Multiple targets can be passed in to a single call to - + (target, ...) -Marks each given +This indicates that each given target -as phony, indicating it should not be created by the build rule. If a -Phony target is created, this will cause an error. +should not be created by the build rule, and if the target is created, +an error will be generated. This is similar to the gnu make .PHONY +target. However, in the vast majority of cases, an +&f-Alias; +is more appropriate. + Multiple targets can be passed in to a single call to -&f-Phony;. +&f-Pseudo;. -- cgit v0.12 From 32676cbecfa28980b77426da56bfc1b8429ccb7d Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Tue, 8 Oct 2013 12:12:21 +0200 Subject: - minor change to the SCons Docbook XSD: stricter handling of para within the special tags "tool", "builder" and "cvar" - fixed current docs accordingly --- doc/editor_configs/serna/scons/xsd/dbpoolx.xsd | 3 --- doc/editor_configs/xmlmind/addon/config/scons/scons_xsd/dbpoolx.xsd | 3 --- doc/xsd/dbpoolx.xsd | 3 --- src/engine/SCons/Tool/msginit.xml | 4 +++- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/doc/editor_configs/serna/scons/xsd/dbpoolx.xsd b/doc/editor_configs/serna/scons/xsd/dbpoolx.xsd index f0a3f1c..0ce5cb7 100644 --- a/doc/editor_configs/serna/scons/xsd/dbpoolx.xsd +++ b/doc/editor_configs/serna/scons/xsd/dbpoolx.xsd @@ -2589,7 +2589,6 @@ - @@ -2616,7 +2615,6 @@ - @@ -2644,7 +2642,6 @@ - diff --git a/doc/editor_configs/xmlmind/addon/config/scons/scons_xsd/dbpoolx.xsd b/doc/editor_configs/xmlmind/addon/config/scons/scons_xsd/dbpoolx.xsd index f0a3f1c..0ce5cb7 100644 --- a/doc/editor_configs/xmlmind/addon/config/scons/scons_xsd/dbpoolx.xsd +++ b/doc/editor_configs/xmlmind/addon/config/scons/scons_xsd/dbpoolx.xsd @@ -2589,7 +2589,6 @@ - @@ -2616,7 +2615,6 @@ - @@ -2644,7 +2642,6 @@ - diff --git a/doc/xsd/dbpoolx.xsd b/doc/xsd/dbpoolx.xsd index f0a3f1c..0ce5cb7 100644 --- a/doc/xsd/dbpoolx.xsd +++ b/doc/xsd/dbpoolx.xsd @@ -2589,7 +2589,6 @@ - @@ -2616,7 +2615,6 @@ - @@ -2644,7 +2642,6 @@ - diff --git a/src/engine/SCons/Tool/msginit.xml b/src/engine/SCons/Tool/msginit.xml index 0f89020..7ce785c 100644 --- a/src/engine/SCons/Tool/msginit.xml +++ b/src/engine/SCons/Tool/msginit.xml @@ -216,8 +216,10 @@ See &t-link-msginit; tool and &b-link-POInit; builder. Internal ``macro''. Computes locale (language) name based on target filename (default: '${TARGET.filebase}' ). - + See &t-link-msginit; tool and &b-link-POInit; builder. + + \ No newline at end of file -- cgit v0.12 From 3bebac3d0e8f24065ecda4abb2a2dad7b1d57164 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Tue, 8 Oct 2013 12:54:45 +0200 Subject: - added an explicit Gs() Builder to the gs.py Tool - updated documentation accordingly and added a (very) simple test --- doc/generated/builders.gen | 21 +++++++++++++++++++++ doc/generated/builders.mod | 4 ++++ doc/generated/tools.gen | 7 ++++++- doc/generated/variables.gen | 18 +++++++++++------- src/engine/SCons/Tool/gs.py | 31 +++++++++++++++++++++---------- src/engine/SCons/Tool/gs.xml | 38 ++++++++++++++++++++++++++++++-------- test/Ghostscript/GS.py | 2 ++ 7 files changed, 95 insertions(+), 26 deletions(-) diff --git a/doc/generated/builders.gen b/doc/generated/builders.gen index 3fdafb6..5cd92f2 100644 --- a/doc/generated/builders.gen +++ b/doc/generated/builders.gen @@ -397,6 +397,27 @@ env.DVI(target = 'ccc.dvi', source = 'ccc.latex') + + + Gs() + + + env.Gs() + + + +A Builder for explicitly calling the gs executable. +Depending on the underlying OS, the different names gs, +gsos2 and gswin32c +are tried. + +env = Environment(tools=['gs']) +env.Gs('cover.jpg','scons-scons.pdf', + GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -q') + ) + + + Install() diff --git a/doc/generated/builders.mod b/doc/generated/builders.mod index 59900cc..b8c7d80 100644 --- a/doc/generated/builders.mod +++ b/doc/generated/builders.mod @@ -21,6 +21,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. DocbookXInclude"> DocbookXslt"> DVI"> +Gs"> Install"> InstallAs"> InstallVersionedLib"> @@ -74,6 +75,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.DocbookXInclude"> env.DocbookXslt"> env.DVI"> +env.Gs"> env.Install"> env.InstallAs"> env.InstallVersionedLib"> @@ -137,6 +139,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. DocbookXInclude"> DocbookXslt"> DVI"> +Gs"> Install"> InstallAs"> InstallVersionedLib"> @@ -190,6 +193,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.DocbookXInclude"> env.DocbookXslt"> env.DVI"> +env.Gs"> env.Install"> env.InstallAs"> env.InstallVersionedLib"> diff --git a/doc/generated/tools.gen b/doc/generated/tools.gen index 57bb0a2..7d75638 100644 --- a/doc/generated/tools.gen +++ b/doc/generated/tools.gen @@ -444,7 +444,12 @@ Set construction variables for GNU linker/loader. gs -Set construction variables for Ghostscript. +This Tool sets the required construction variables for working with +the Ghostscript command. It also registers an appropriate Action +with the PDF Builder (PDF), such that the conversion from +PS/EPS to PDF happens automatically for the TeX/LaTeX toolchain. +Finally, it adds an explicit Ghostscript Builder (Gs) to the +environment. Sets: &cv-link-GS;, &cv-link-GSCOM;, &cv-link-GSFLAGS;.Uses: &cv-link-GSCOMSTR;. diff --git a/doc/generated/variables.gen b/doc/generated/variables.gen index 784cd28..ee5a0dd 100644 --- a/doc/generated/variables.gen +++ b/doc/generated/variables.gen @@ -2324,7 +2324,7 @@ described above.) GS -The Ghostscript program used to convert PostScript to PDF files. +The Ghostscript program used, e.g. to convert PostScript to PDF files. @@ -2332,7 +2332,8 @@ The Ghostscript program used to convert PostScript to PDF files. GSCOM -The Ghostscript command line used to convert PostScript to PDF files. +The full Ghostscript command line used for the conversion process. Its default +value is $GS $GSFLAGS -sOutputFile=$TARGET $SOURCES. @@ -2341,9 +2342,8 @@ The Ghostscript command line used to convert PostScript to PDF files. The string displayed when -Ghostscript is used to convert -a PostScript file to a PDF file. -If this is not set, then $GSCOM (the command line) is displayed. +Ghostscript is called for the conversion process. +If this is not set (the default), then $GSCOM (the command line) is displayed. @@ -2351,8 +2351,9 @@ If this is not set, then -General options passed to the Ghostscript program -when converting PostScript to PDF files. +General options passed to the Ghostscript program, +when converting PostScript to PDF files for example. Its default value +is -dNOPAUSE -dBATCH -sDEVICE=pdfwrite @@ -3548,6 +3549,9 @@ See m Internal ``macro''. Computes locale (language) name based on target filename (default: '${TARGET.filebase}' ). + +See msginit tool and POInit builder. + diff --git a/src/engine/SCons/Tool/gs.py b/src/engine/SCons/Tool/gs.py index ada169a..a8fddde 100644 --- a/src/engine/SCons/Tool/gs.py +++ b/src/engine/SCons/Tool/gs.py @@ -34,6 +34,7 @@ selection method. __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import SCons.Action +import SCons.Builder import SCons.Platform import SCons.Util @@ -52,17 +53,27 @@ GhostscriptAction = None def generate(env): """Add Builders and construction variables for Ghostscript to an Environment.""" - global GhostscriptAction - if GhostscriptAction is None: - GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.ps', GhostscriptAction) - + # The following try-except block enables us to use the Tool + # in standalone mode (without the accompanying pdf.py), + # whenever we need an explicit call of gs via the Gs() + # Builder ... + try: + if GhostscriptAction is None: + GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') + + import pdf + pdf.generate(env) + + bld = env['BUILDERS']['PDF'] + bld.add_action('.ps', GhostscriptAction) + except ImportError, e: + pass + + gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'), + env = env) + env['BUILDERS']['Gs'] = gsbuilder + env['GS'] = gs env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite') env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES' diff --git a/src/engine/SCons/Tool/gs.xml b/src/engine/SCons/Tool/gs.xml index c34f004..3fe5165 100644 --- a/src/engine/SCons/Tool/gs.xml +++ b/src/engine/SCons/Tool/gs.xml @@ -26,7 +26,12 @@ See its __doc__ string for a discussion of the format. -Set construction variables for Ghostscript. +This Tool sets the required construction variables for working with +the Ghostscript command. It also registers an appropriate Action +with the PDF Builder (&b-link-PDF;), such that the conversion from +PS/EPS to PDF happens automatically for the TeX/LaTeX toolchain. +Finally, it adds an explicit Ghostscript Builder (&b-link-Gs;) to the +environment. @@ -42,7 +47,7 @@ Set construction variables for Ghostscript. -The Ghostscript program used to convert PostScript to PDF files. +The Ghostscript program used, e.g. to convert PostScript to PDF files. @@ -50,7 +55,8 @@ The Ghostscript program used to convert PostScript to PDF files. -The Ghostscript command line used to convert PostScript to PDF files. +The full Ghostscript command line used for the conversion process. Its default +value is $GS $GSFLAGS -sOutputFile=$TARGET $SOURCES. @@ -59,9 +65,8 @@ The Ghostscript command line used to convert PostScript to PDF files. The string displayed when -Ghostscript is used to convert -a PostScript file to a PDF file. -If this is not set, then &cv-link-GSCOM; (the command line) is displayed. +Ghostscript is called for the conversion process. +If this is not set (the default), then &cv-link-GSCOM; (the command line) is displayed. @@ -69,10 +74,27 @@ If this is not set, then &cv-link-GSCOM; (the command line) is displayed. -General options passed to the Ghostscript program -when converting PostScript to PDF files. +General options passed to the Ghostscript program, +when converting PostScript to PDF files for example. Its default value +is -dNOPAUSE -dBATCH -sDEVICE=pdfwrite + + + +A Builder for explicitly calling the gs executable. +Depending on the underlying OS, the different names gs, +gsos2 and gswin32c +are tried. + +env = Environment(tools=['gs']) +env.Gs('cover.jpg','scons-scons.pdf', + GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -q') + ) + + + + \ No newline at end of file diff --git a/test/Ghostscript/GS.py b/test/Ghostscript/GS.py index 2cae8b8..daeea09 100644 --- a/test/Ghostscript/GS.py +++ b/test/Ghostscript/GS.py @@ -51,6 +51,7 @@ env = Environment(GS = r'%(_python_)s mygs.py', GSCOM = r'$GS $TARGET $SOURCE', tools=['gs']) env.PDF(target = 'test1.pdf', source = 'test1.ps') +env.Gs(target = 'test2.pdf', source = 'test1.ps') """ % locals()) test.write('test1.ps', r"""This is a .ps test. @@ -60,6 +61,7 @@ test.write('test1.ps', r"""This is a .ps test. test.run(arguments = '.', stderr = None) test.fail_test(test.read('test1.pdf') != "This is a .ps test.\n") +test.fail_test(test.read('test2.pdf') != "This is a .ps test.\n") -- cgit v0.12 From 91020237d64f53b2fa6e2b5bf155a1d8bfbdb547 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Tue, 8 Oct 2013 12:54:25 +0100 Subject: Adding documentation and a couple of tests --- QMTest/TestSCons.py | 6 +- doc/man/scons.xml | 5 +- test/CacheDir/option--cr.py | 138 ++++++++++++++++++++++++++++++++++++++++++ test/option/debug-multiple.py | 86 ++++++++++++++++++++++++++ 4 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 test/CacheDir/option--cr.py create mode 100644 test/option/debug-multiple.py diff --git a/QMTest/TestSCons.py b/QMTest/TestSCons.py index 84cc60f..c45ef5e 100644 --- a/QMTest/TestSCons.py +++ b/QMTest/TestSCons.py @@ -1131,9 +1131,9 @@ SConscript( sconscript ) self.run(program = python, stdin = """\ import os, sys try: - py_ver = 'python%d.%d' % sys.version_info[:2] + py_ver = 'python%d.%d' % sys.version_info[:2] except AttributeError: - py_ver = 'python' + sys.version[:3] + py_ver = 'python' + sys.version[:3] print os.path.join(sys.prefix, 'include', py_ver) print os.path.join(sys.prefix, 'lib', py_ver, 'config') print py_ver @@ -1357,7 +1357,7 @@ class TimeSCons(TestSCons): options = kw.get('options', '') if additional is not None: options += additional - kw['options'] = options + ' --debug=memory --debug=time' + kw['options'] = options + ' --debug=memory,time' def startup(self, *args, **kw): """ diff --git a/doc/man/scons.xml b/doc/man/scons.xml index 947d86d..80bbd44 100644 --- a/doc/man/scons.xml +++ b/doc/man/scons.xml @@ -671,8 +671,9 @@ directory. --debug=type Debug the build process. -type -specifies what type of debugging: +type[,type...] +specifies what type of debugging. Multiple types may be specified, +separated by commas. The following types are valid: diff --git a/test/CacheDir/option--cr.py b/test/CacheDir/option--cr.py new file mode 100644 index 0000000..de6bbc8 --- /dev/null +++ b/test/CacheDir/option--cr.py @@ -0,0 +1,138 @@ +#!/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__" + +""" +Test the --cache-readonly option when retrieving derived files from a +CacheDir. It should retrieve as normal but not update files. +""" + +import os.path +import shutil + +import TestSCons + +test = TestSCons.TestSCons() + +test.subdir('cache', 'src') + +test.write(['src', 'SConstruct'], """ +def cat(env, source, target): + target = str(target[0]) + open('cat.out', 'ab').write(target + "\\n") + f = open(target, "wb") + for src in source: + f.write(open(str(src), "rb").read()) + f.close() +env = Environment(BUILDERS={'Cat':Builder(action=cat)}) +env.Cat('aaa.out', 'aaa.in') +env.Cat('bbb.out', 'bbb.in') +env.Cat('ccc.out', 'ccc.in') +env.Cat('all', ['aaa.out', 'bbb.out', 'ccc.out']) +CacheDir(r'%s') +""" % test.workpath('cache')) + +test.write(['src', 'aaa.in'], "aaa.in\n") +test.write(['src', 'bbb.in'], "bbb.in\n") +test.write(['src', 'ccc.in'], "ccc.in\n") + +# Verify that a normal build works correctly, and clean up. +# This should populate the cache with our derived files. +test.run(chdir = 'src', arguments = '.') + +test.must_match(['src', 'all'], "aaa.in\nbbb.in\nccc.in\n") +test.must_match(['src', 'cat.out'], "aaa.out\nbbb.out\nccc.out\nall\n") + +test.up_to_date(chdir = 'src', arguments = '.') + +test.run(chdir = 'src', arguments = '-c .') +test.unlink(['src', 'cat.out']) + +# Verify that we now retrieve the derived files from cache, +# not rebuild them. Then clean up. +test.run(chdir = 'src', arguments = '--cache-readonly .', + stdout = test.wrap_stdout("""\ +Retrieved `aaa.out' from cache +Retrieved `bbb.out' from cache +Retrieved `ccc.out' from cache +Retrieved `all' from cache +""")) + +test.must_match(['src', 'all'], "aaa.in\nbbb.in\nccc.in\n") +test.must_not_exist(test.workpath('src', 'cat.out')) + +test.up_to_date(chdir = 'src', arguments = '.') + +test.run(chdir = 'src', arguments = '-c .') + +# What we do now is to change one of the files and rebuild +test.write(['src', 'aaa.in'], "aaa.rebuild\n") + +# This should just rebuild aaa.out (and all) +test.run(chdir = 'src', + arguments = '--cache-readonly .', + stdout = test.wrap_stdout("""\ +cat(["aaa.out"], ["aaa.in"]) +Retrieved `bbb.out' from cache +Retrieved `ccc.out' from cache +cat(["all"], ["aaa.out", "bbb.out", "ccc.out"]) +""")) + +test.must_match(['src', 'all'], "aaa.rebuild\nbbb.in\nccc.in\n") +# cat.out contains only the things we built (not got from cache) +test.must_match(['src', 'cat.out'], "aaa.out\nall\n") + +test.up_to_date(chdir = 'src', arguments = '.') + +test.run(chdir = 'src', arguments = '-c .') +test.unlink(['src', 'cat.out']) + +# Verify that aaa.out contents weren't updated with the last build +# Then clean up. +test.run(chdir = 'src', + arguments = '--cache-readonly .', + stdout = test.wrap_stdout("""\ +cat(["aaa.out"], ["aaa.in"]) +Retrieved `bbb.out' from cache +Retrieved `ccc.out' from cache +cat(["all"], ["aaa.out", "bbb.out", "ccc.out"]) +""")) + +test.must_match(['src', 'all'], "aaa.rebuild\nbbb.in\nccc.in\n") +test.must_match(['src', 'cat.out'], "aaa.out\nall\n") + +test.up_to_date(chdir = 'src', arguments = '.') + +test.run(chdir = 'src', arguments = '-c .') +test.unlink(['src', 'cat.out']) + +# All done. +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/option/debug-multiple.py b/test/option/debug-multiple.py new file mode 100644 index 0000000..f5bbdf0 --- /dev/null +++ b/test/option/debug-multiple.py @@ -0,0 +1,86 @@ +#!/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__" + +""" +Test that --debug can take multiple options +""" + +import re + +import TestSCons + +test = TestSCons.TestSCons() + +test.write('SConstruct', """ +def cat(target, source, env): + open(str(target[0]), 'wb').write(open(str(source[0]), 'rb').read()) +env = Environment(BUILDERS={'Cat':Builder(action=Action(cat))}) +env.Cat('file.out', 'file.in') +""") + +test.write('file.in', "file.in\n") + +# Just check that object counts for some representative classes +# show up in the output. + +def find_object_count(s, stdout): + re_string = '\d+ +\d+ %s' % re.escape(s) + return re.search(re_string, stdout) + +objects = [ + 'Action.CommandAction', + 'Builder.BuilderBase', + 'Environment.Base', + 'Executor.Executor', + 'Node.FS', + 'Node.FS.Base', + 'Node.Node', +] + +for args in ['--debug=prepare,count', '--debug=count,prepare']: + test.run(arguments = args) + stdout = test.stdout() + missing = [o for o in objects if find_object_count(o, stdout) is None] + + if missing: + print "Missing the following object lines from '%s' output:" % args + print "\t", ' '.join(missing) + print "STDOUT ==========" + print stdout + test.fail_test(1) + + if 'Preparing target file.out...' not in stdout: + print "Missing 'Preparing' lines from '%s' output:" % args + print "STDOUT ==========" + print stdout + test.fail_test(1) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From ef9d8a0031b3ca6faabb0746eeb2a7da519fb805 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Tue, 8 Oct 2013 15:45:37 +0200 Subject: - added EPUB as output format for documentation ("user" and "man" targets) --- doc/SConscript | 30 ++++++++++++++++++++++++++++-- doc/man/MANIFEST | 3 ++- doc/man/SConstruct | 22 +++++++++++++++++++++- doc/man/cover.jpg | Bin 0 -> 306 bytes doc/man/epub.css | 33 +++++++++++++++++++++++++++++++++ doc/man/epub.xsl | 35 +++++++++++++++++++++++++++++++++++ doc/man/html.xsl | 4 ++++ doc/man/pdf.xsl | 5 ++++- doc/man/scons.xml | 3 +++ doc/user/MANIFEST | 2 +- doc/user/SConstruct | 22 +++++++++++++++++++++- doc/user/chtml.xsl | 4 ++++ doc/user/cover.jpg | Bin 0 -> 306 bytes doc/user/epub.css | 33 +++++++++++++++++++++++++++++++++ doc/user/epub.xsl | 36 ++++++++++++++++++++++++++++++++++++ doc/user/html.xsl | 4 ++++ doc/user/main.xml | 1 + doc/user/pdf.xsl | 4 ++++ 18 files changed, 234 insertions(+), 7 deletions(-) create mode 100644 doc/man/cover.jpg create mode 100644 doc/man/epub.css create mode 100644 doc/man/epub.xsl create mode 100644 doc/user/cover.jpg create mode 100644 doc/user/epub.css create mode 100644 doc/user/epub.xsl diff --git a/doc/SConscript b/doc/SConscript index 8dcf697..c731dab 100644 --- a/doc/SConscript +++ b/doc/SConscript @@ -41,6 +41,7 @@ build = os.path.join(build_dir, 'doc') fop = whereis('fop') xep = whereis('xep') epydoc_cli = whereis('epydoc') +gs = whereis('gs') # # @@ -158,6 +159,8 @@ else: env.Execute(Mkdir(os.path.join(build_dir, *(dbpath + ['html'])))) env.Execute(Mkdir(os.path.join(build_dir, *(dbpath + ['fo'])))) env.Execute(Mkdir(os.path.join(build_dir, *(dbpath + ['manpages'])))) + env.Execute(Mkdir(os.path.join(build_dir, *(dbpath + ['epub'])))) + env.Execute(Mkdir(os.path.join(build_dir, *(dbpath + ['xhtml-1_1'])))) env.Execute(Copy(os.path.join(build_dir, *dbpath), os.path.join('..', *(dbpath + ['VERSION'])))) for g in glob.glob(os.path.join('..', *(dbpath + ['common', '*.*']))): @@ -170,6 +173,20 @@ else: env.Execute(Copy(os.path.join(build_dir, *(dbpath + ['fo'])), g)) for g in glob.glob(os.path.join('..', *(dbpath + ['manpages', '*.*']))): env.Execute(Copy(os.path.join(build_dir, *(dbpath + ['manpages'])), g)) + for g in glob.glob(os.path.join('..', *(dbpath + ['epub', '*.xsl']))): + env.Execute(Copy(os.path.join(build_dir, *(dbpath + ['epub'])), g)) + for g in glob.glob(os.path.join('..', *(dbpath + ['xhtml-1_1', '*.*']))): + env.Execute(Copy(os.path.join(build_dir, *(dbpath + ['xhtml-1_1'])), g)) + + # + # Copy additional Tools (gs, zip) + # + toolpath = ['src', 'engine', 'SCons', 'Tool'] + env.Execute(Copy(os.path.join(build_dir, *toolpath), + os.path.join('..', *(toolpath + ['gs.py'])))) + env.Execute(Copy(os.path.join(build_dir, *toolpath), + os.path.join('..', *(toolpath + ['zip.py'])))) + # # Each document will live in its own subdirectory. List them here @@ -182,8 +199,8 @@ else: #'python10' : ['chtml','html','pdf'], 'reference' : ['chtml','html','pdf'], #'developer' : ['chtml','html','pdf'], - 'user' : ['chtml','html','pdf'], - 'man' : ['man'] + 'user' : ['chtml','html','pdf','epub'], + 'man' : ['man','epub'] } # The names of the target files for the MAN pages man_page_list = ['scons.1','scons-time.1','sconsign.1'] @@ -247,6 +264,7 @@ else: htmlindex = os.path.join(htmldir, 'index.html') html = os.path.join(build, 'HTML', 'scons-%s.html' % doc) pdf = os.path.join(build, 'PDF', 'scons-%s.pdf' % doc) + epub = os.path.join(build, 'EPUB', 'scons-%s.epub' % doc) if 'chtml' in docs[doc]: env.Install(htmldir, Glob(os.path.join(build, doc,'scons-%s' % doc, '*.html'))) tar_deps.extend([htmlindex]) @@ -268,6 +286,14 @@ else: tar_deps.append(pdf) tar_list.append(pdf) + + if 'epub' in docs[doc] and gs: + env.InstallAs(epub, os.path.join(build, doc,'scons-%s.epub' % doc)) + Local(epub) + env.Ignore(epub, version_xml) + + tar_deps.append(epub) + tar_list.append(epub) if 'man' in docs[doc]: # diff --git a/doc/man/MANIFEST b/doc/man/MANIFEST index 7f0ad45..4b3ce9f 100644 --- a/doc/man/MANIFEST +++ b/doc/man/MANIFEST @@ -5,8 +5,9 @@ scons.xml sconsign.xml scons-time.xml *.xsl -scons.css +*.css SConstruct +cover.jpg titlepage/bricks.jpg titlepage/mapnik_final_colors.svg titlepage/SCons_path.svg diff --git a/doc/man/SConstruct b/doc/man/SConstruct index cd94021..cfdbb2d 100644 --- a/doc/man/SConstruct +++ b/doc/man/SConstruct @@ -27,7 +27,7 @@ import os env = Environment(ENV={'PATH' : os.environ['PATH']}, - tools=['docbook'], + tools=['docbook','gs','zip'], toolpath=['../../src/engine/SCons/Tool'], DOCBOOK_DEFAULT_XSL_HTML='html.xsl', DOCBOOK_DEFAULT_XSL_PDF='pdf.xsl') @@ -53,3 +53,23 @@ def createManPages(env, target): createManPages(env, "scons") createManPages(env, "sconsign") createManPages(env, "scons-time") + +has_gs = False +if env.WhereIs('gs'): + has_gs = True + +# +# Create the EPUB format +# +if has_gs and has_pdf: + metainf = env.Command('META-INF','',[Mkdir('META-INF'), Mkdir('OEBPS')]) + css = env.Command('OEBPS/epub.css','epub.css',[Copy('OEBPS/epub.css','epub.css')]) + env.Depends(css, metainf) + jpg = env.Gs('OEBPS/cover.jpg','scons-scons.pdf', + GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -dJPEGQ=100 -r72x72 -q') + env.Depends(jpg, metainf) + oebps = env.DocbookXslt('OEBPS/toc.ncx', 'scons_db.xml', xsl='epub.xsl') + env.Depends(oebps, jpg) + env.Zip('scons-man.epub', 'OEBPS', ZIPFLAGS='-Xr9D') + env.Clean(oebps, Glob('OEBPS/*.*')) + env.Clean(oebps, Glob('META-INF/*.*')) diff --git a/doc/man/cover.jpg b/doc/man/cover.jpg new file mode 100644 index 0000000..e2c2cb3 Binary files /dev/null and b/doc/man/cover.jpg differ diff --git a/doc/man/epub.css b/doc/man/epub.css new file mode 100644 index 0000000..31cebe5 --- /dev/null +++ b/doc/man/epub.css @@ -0,0 +1,33 @@ +/* This defines styles and classes used in the book */ +body { } +code { font-family: monospace; } +h1, h2, h3, h4, h5, h6 { text-align: center; margin-bottom:2em;} +h1.title { } +h2.author { } +p{ + padding:0; + margin:0; + text-indent:2em; +} +blockquote{ + margin-left:3em; + margin-right:3em; +} +.caption{ + text-align:center; + font-style:italic; + margin-bottom:1em; + margin-top:.2em; + font-size:.8em; +} +blockquote > p{ + text-indent:0; + margin-bottom:1em; +} +img{ + display:block; + margin-left: auto; + margin-right: auto; + text-align:center; + margin-top:1em; +} diff --git a/doc/man/epub.xsl b/doc/man/epub.xsl new file mode 100644 index 0000000..bc1d4b3 --- /dev/null +++ b/doc/man/epub.xsl @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/doc/man/html.xsl b/doc/man/html.xsl index 71a847a..864af88 100644 --- a/doc/man/html.xsl +++ b/doc/man/html.xsl @@ -51,5 +51,9 @@ reference title set toc,title + + + + diff --git a/doc/man/pdf.xsl b/doc/man/pdf.xsl index 652975f..f314103 100644 --- a/doc/man/pdf.xsl +++ b/doc/man/pdf.xsl @@ -67,5 +67,8 @@ set toc,title - + + + + diff --git a/doc/man/scons.xml b/doc/man/scons.xml index 3f47b47..82c782d 100644 --- a/doc/man/scons.xml +++ b/doc/man/scons.xml @@ -60,6 +60,9 @@ version &buildversion; + + + SCons &buildversion; diff --git a/doc/user/MANIFEST b/doc/user/MANIFEST index e5f8988..62da288 100644 --- a/doc/user/MANIFEST +++ b/doc/user/MANIFEST @@ -51,7 +51,7 @@ variants.xml variables.xml *.jpg *.xsl -scons.css +*.css SConstruct titlepage/bricks.jpg titlepage/mapnik_final_colors.svg diff --git a/doc/user/SConstruct b/doc/user/SConstruct index 002aea4..5d36a5e 100644 --- a/doc/user/SConstruct +++ b/doc/user/SConstruct @@ -27,7 +27,7 @@ import os env = Environment(ENV={'PATH' : os.environ['PATH']}, - tools=['docbook'], + tools=['docbook','gs','zip'], toolpath=['../../src/engine/SCons/Tool'], DOCBOOK_DEFAULT_XSL_HTML='html.xsl', DOCBOOK_DEFAULT_XSL_HTMLCHUNKED='chtml.xsl', @@ -51,3 +51,23 @@ env.DocbookHtml('index.html','scons_db.xml') env.DocbookHtmlChunked('index.html', 'scons_db.xml', base_dir='scons-user/') if has_pdf: env.DocbookPdf('scons-user.pdf','scons_db.xml') + +has_gs = False +if env.WhereIs('gs'): + has_gs = True + +# +# Create the EPUB format +# +if has_gs and has_pdf: + metainf = env.Command('META-INF','',[Mkdir('META-INF'), Mkdir('OEBPS')]) + css = env.Command('OEBPS/epub.css','epub.css',[Copy('OEBPS/epub.css','epub.css')]) + env.Depends(css, metainf) + jpg = env.Gs('OEBPS/cover.jpg','scons-user.pdf', + GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -dJPEGQ=100 -r72x72 -q') + env.Depends(jpg, metainf) + oebps = env.DocbookXslt('OEBPS/toc.ncx', 'scons_db.xml', xsl='epub.xsl') + env.Depends(oebps, jpg) + env.Zip('scons-user.epub', 'OEBPS', ZIPFLAGS='-Xr9D') + env.Clean(oebps, Glob('OEBPS/*.*')) + env.Clean(oebps, Glob('META-INF/*.*')) diff --git a/doc/user/chtml.xsl b/doc/user/chtml.xsl index fa01b46..e292c88 100644 --- a/doc/user/chtml.xsl +++ b/doc/user/chtml.xsl @@ -52,5 +52,9 @@ reference toc,title set toc,title + + + + diff --git a/doc/user/cover.jpg b/doc/user/cover.jpg new file mode 100644 index 0000000..e2c2cb3 Binary files /dev/null and b/doc/user/cover.jpg differ diff --git a/doc/user/epub.css b/doc/user/epub.css new file mode 100644 index 0000000..31cebe5 --- /dev/null +++ b/doc/user/epub.css @@ -0,0 +1,33 @@ +/* This defines styles and classes used in the book */ +body { } +code { font-family: monospace; } +h1, h2, h3, h4, h5, h6 { text-align: center; margin-bottom:2em;} +h1.title { } +h2.author { } +p{ + padding:0; + margin:0; + text-indent:2em; +} +blockquote{ + margin-left:3em; + margin-right:3em; +} +.caption{ + text-align:center; + font-style:italic; + margin-bottom:1em; + margin-top:.2em; + font-size:.8em; +} +blockquote > p{ + text-indent:0; + margin-bottom:1em; +} +img{ + display:block; + margin-left: auto; + margin-right: auto; + text-align:center; + margin-top:1em; +} diff --git a/doc/user/epub.xsl b/doc/user/epub.xsl new file mode 100644 index 0000000..6ff435c --- /dev/null +++ b/doc/user/epub.xsl @@ -0,0 +1,36 @@ + + + + + + + + + + diff --git a/doc/user/html.xsl b/doc/user/html.xsl index 74ea529..c275c3d 100644 --- a/doc/user/html.xsl +++ b/doc/user/html.xsl @@ -51,5 +51,9 @@ reference toc,title set toc,title + + + + diff --git a/doc/user/main.xml b/doc/user/main.xml index cb516e1..60dd8c9 100644 --- a/doc/user/main.xml +++ b/doc/user/main.xml @@ -85,6 +85,7 @@ version &buildversion; + diff --git a/doc/user/pdf.xsl b/doc/user/pdf.xsl index 652975f..9c54592 100644 --- a/doc/user/pdf.xsl +++ b/doc/user/pdf.xsl @@ -67,5 +67,9 @@ set toc,title + + + + -- cgit v0.12 From e74b7580fb3999ad9021bc1aa4a2850739ca6151 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Fri, 11 Oct 2013 18:38:50 -0700 Subject: dummy change to debug buildbot scheduler issue --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 63e507a..a1025ca 100644 --- a/README.rst +++ b/README.rst @@ -752,3 +752,4 @@ With plenty of help from the SCons Development team: __COPYRIGHT__ + -- cgit v0.12 From d48a4a49d3ad33311dcefa86377b005b06c285a7 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Fri, 11 Oct 2013 18:41:35 -0700 Subject: dummy change to debug buildbot scheduler issue --- README.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/README.rst b/README.rst index a1025ca..63e507a 100644 --- a/README.rst +++ b/README.rst @@ -752,4 +752,3 @@ With plenty of help from the SCons Development team: __COPYRIGHT__ - -- cgit v0.12 From 2be0f31b80087974b5e6d53e12542637636a2253 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Fri, 25 Oct 2013 02:00:04 +0200 Subject: - now counting instances only when requested via --debug=count --- src/CHANGES.txt | 2 ++ src/engine/SCons/Action.py | 11 ++++++----- src/engine/SCons/Builder.py | 7 ++++--- src/engine/SCons/Debug.py | 4 ++++ src/engine/SCons/Environment.py | 9 +++++---- src/engine/SCons/Executor.py | 5 +++-- src/engine/SCons/Node/FS.py | 11 ++++++----- src/engine/SCons/Node/__init__.py | 3 ++- src/engine/SCons/Script/Main.py | 5 ++++- 9 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 50a27dc..b0d2d3c 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -30,6 +30,8 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE From Dirk Baechle: - Update bootstrap.py so it can be used from any dir, to run SCons from a source (non-installed) dir. + - Count statistics of instances are now collected only when + the --debug=count command-line option is used (#2922). From Gary Oberbrunner: - Test harness: fail_test() can now print a message to help debugging. diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index c1eef75..82b8fb9 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -109,6 +109,7 @@ import re import sys import subprocess +import SCons.Debug from SCons.Debug import logInstanceCreation import SCons.Errors import SCons.Executor @@ -698,7 +699,7 @@ class CommandAction(_ActionAction): # factory above does). cmd will be passed to # Environment.subst_list() for substituting environment # variables. - if __debug__: logInstanceCreation(self, 'Action.CommandAction') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandAction') _ActionAction.__init__(self, **kw) if is_List(cmd): @@ -855,7 +856,7 @@ class CommandAction(_ActionAction): class CommandGeneratorAction(ActionBase): """Class for command-generator actions.""" def __init__(self, generator, kw): - if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandGeneratorAction') self.generator = generator self.gen_kw = kw self.varlist = kw.get('varlist', ()) @@ -944,7 +945,7 @@ class CommandGeneratorAction(ActionBase): class LazyAction(CommandGeneratorAction, CommandAction): def __init__(self, var, kw): - if __debug__: logInstanceCreation(self, 'Action.LazyAction') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.LazyAction') #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw) CommandAction.__init__(self, '${'+var+'}', **kw) self.var = SCons.Util.to_String(var) @@ -986,7 +987,7 @@ class FunctionAction(_ActionAction): """Class for Python function actions.""" def __init__(self, execfunction, kw): - if __debug__: logInstanceCreation(self, 'Action.FunctionAction') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.FunctionAction') self.execfunction = execfunction try: @@ -1108,7 +1109,7 @@ class FunctionAction(_ActionAction): class ListAction(ActionBase): """Class for lists of other actions.""" def __init__(self, actionlist): - if __debug__: logInstanceCreation(self, 'Action.ListAction') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.ListAction') def list_of_actions(x): if isinstance(x, ActionBase): return x diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py index 6dc9e17..ed7650a 100644 --- a/src/engine/SCons/Builder.py +++ b/src/engine/SCons/Builder.py @@ -102,6 +102,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import collections import SCons.Action +import SCons.Debug from SCons.Debug import logInstanceCreation from SCons.Errors import InternalError, UserError import SCons.Executor @@ -225,7 +226,7 @@ class OverrideWarner(collections.UserDict): """ def __init__(self, dict): collections.UserDict.__init__(self, dict) - if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.OverrideWarner') self.already_warned = None def warn(self): if self.already_warned: @@ -376,7 +377,7 @@ class BuilderBase(object): src_builder = None, ensure_suffix = False, **overrides): - if __debug__: logInstanceCreation(self, 'Builder.BuilderBase') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.BuilderBase') self._memo = {} self.action = action self.multi = multi @@ -847,7 +848,7 @@ class CompositeBuilder(SCons.Util.Proxy): """ def __init__(self, builder, cmdgen): - if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.CompositeBuilder') SCons.Util.Proxy.__init__(self, builder) # cmdgen should always be an instance of DictCmdGenerator. diff --git a/src/engine/SCons/Debug.py b/src/engine/SCons/Debug.py index 1c0c638..9974039 100644 --- a/src/engine/SCons/Debug.py +++ b/src/engine/SCons/Debug.py @@ -35,6 +35,10 @@ import sys import time import weakref +# Global variable that gets set to 'True' by the Main script, +# when the creation of class instances should get tracked. +track_instances = False +# List of currently tracked classes tracked_classes = {} def logInstanceCreation(instance, name=None): diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index 55a8206..ca5df58 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -43,6 +43,7 @@ from collections import UserDict import SCons.Action import SCons.Builder +import SCons.Debug from SCons.Debug import logInstanceCreation import SCons.Defaults import SCons.Errors @@ -370,7 +371,7 @@ class SubstitutionEnvironment(object): def __init__(self, **kw): """Initialization of an underlying SubstitutionEnvironment class. """ - if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.SubstitutionEnvironment') self.fs = SCons.Node.FS.get_default_fs() self.ans = SCons.Node.Alias.default_ans self.lookup_list = SCons.Node.arg2nodes_lookups @@ -931,7 +932,7 @@ class Base(SubstitutionEnvironment): initialize things in a very specific order that doesn't work with the much simpler base class initialization. """ - if __debug__: logInstanceCreation(self, 'Environment.Base') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.Base') self._memo = {} self.fs = SCons.Node.FS.get_default_fs() self.ans = SCons.Node.Alias.default_ans @@ -1414,7 +1415,7 @@ class Base(SubstitutionEnvironment): # Finally, apply any flags to be merged in if parse_flags: clone.MergeFlags(parse_flags) - if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.EnvironmentClone') return clone def Copy(self, *args, **kw): @@ -2270,7 +2271,7 @@ class OverrideEnvironment(Base): """ def __init__(self, subject, overrides={}): - if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.OverrideEnvironment') self.__dict__['__subject'] = subject self.__dict__['overrides'] = overrides diff --git a/src/engine/SCons/Executor.py b/src/engine/SCons/Executor.py index 6f2489b..7875537 100644 --- a/src/engine/SCons/Executor.py +++ b/src/engine/SCons/Executor.py @@ -31,6 +31,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import collections +import SCons.Debug from SCons.Debug import logInstanceCreation import SCons.Errors import SCons.Memoize @@ -123,7 +124,7 @@ class Executor(object): def __init__(self, action, env=None, overridelist=[{}], targets=[], sources=[], builder_kw={}): - if __debug__: logInstanceCreation(self, 'Executor.Executor') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Executor') self.set_action_list(action) self.pre_actions = [] self.post_actions = [] @@ -575,7 +576,7 @@ class Null(object): going to worry about unit tests for this--at least for now. """ def __init__(self, *args, **kw): - if __debug__: logInstanceCreation(self, 'Executor.Null') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Null') self.batches = [Batch(kw['targets'][:], [])] def get_build_env(self): return get_NullEnvironment() diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 4381697..18400e8 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -44,6 +44,7 @@ import time import codecs import SCons.Action +import SCons.Debug from SCons.Debug import logInstanceCreation import SCons.Errors import SCons.Memoize @@ -581,7 +582,7 @@ class Base(SCons.Node.Node): our relative and absolute paths, identify our parent directory, and indicate that this node should use signatures.""" - if __debug__: logInstanceCreation(self, 'Node.FS.Base') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Base') SCons.Node.Node.__init__(self) # Filenames and paths are probably reused and are intern'ed to @@ -1111,7 +1112,7 @@ class FS(LocalFS): The path argument must be a valid absolute path. """ - if __debug__: logInstanceCreation(self, 'Node.FS') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS') self._memo = {} @@ -1445,7 +1446,7 @@ class Dir(Base): BuildInfo = DirBuildInfo def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.Dir') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Dir') Base.__init__(self, name, directory, fs) self._morph() @@ -2113,7 +2114,7 @@ class RootDir(Dir): this directory. """ def __init__(self, drive, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.RootDir') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.RootDir') # We're going to be our own parent directory (".." entry and .dir # attribute) so we have to set up some values so Base.__init__() # won't gag won't it calls some of our methods. @@ -2361,7 +2362,7 @@ class File(Base): "Directory %s found where file expected.") def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.File') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.File') Base.__init__(self, name, directory, fs) self._morph() diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 992284d..c114281 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -47,6 +47,7 @@ import collections import copy from itertools import chain +import SCons.Debug from SCons.Debug import logInstanceCreation import SCons.Executor import SCons.Memoize @@ -183,7 +184,7 @@ class Node(object): pass def __init__(self): - if __debug__: logInstanceCreation(self, 'Node.Node') + if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.Node') # Note that we no longer explicitly initialize a self.builder # attribute to None here. That's because the self.builder # attribute may be created on-the-fly later by a subclass (the diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 837c103..9083b8e 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -622,7 +622,7 @@ def _set_debug_values(options): debug_values = options.debug if "count" in debug_values: - # All of the object counts are within "if __debug__:" blocks, + # All of the object counts are within "if track_instances:" blocks, # which get stripped when running optimized (with python -O or # from compiled *.pyo files). Provide a warning if __debug__ is # stripped, so it doesn't just look like --debug=count is broken. @@ -630,6 +630,7 @@ def _set_debug_values(options): if __debug__: enable_count = True if enable_count: count_stats.enable(sys.stdout) + SCons.Debug.track_instances = True else: msg = "--debug=count is not supported when running SCons\n" + \ "\twith the python -O option or optimized (.pyo) modules." @@ -644,6 +645,8 @@ def _set_debug_values(options): if "memory" in debug_values: memory_stats.enable(sys.stdout) print_objects = ("objects" in debug_values) + if print_objects: + SCons.Debug.track_instances = True if "presub" in debug_values: SCons.Action.print_actions_presub = 1 if "stacktrace" in debug_values: -- cgit v0.12 From 9a37e257ab916bf83b1a9b23c7b2f5ba936c675c Mon Sep 17 00:00:00 2001 From: William Deegan Date: Thu, 24 Oct 2013 19:07:11 -0700 Subject: Fix broken python-version.py test. regex for deprecated version string wasn't updated with new version nor new verbiage --- QMTest/TestSCons.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QMTest/TestSCons.py b/QMTest/TestSCons.py index 84cc60f..bc2f82e 100644 --- a/QMTest/TestSCons.py +++ b/QMTest/TestSCons.py @@ -151,7 +151,7 @@ def deprecated_python_version(version=sys.version_info): if deprecated_python_version(): msg = r""" -scons: warning: Support for pre-2.4 Python (%s) is deprecated. +scons: warning: Support for pre-2.7.0 Python version (%s) is deprecated. If this will cause hardship, contact dev@scons.tigris.org. """ -- cgit v0.12 From 5c7cea447b7f3b7833fbf4db25d32afa255cf52e Mon Sep 17 00:00:00 2001 From: William Deegan Date: Fri, 25 Oct 2013 14:41:31 -0700 Subject: kick buildbot --- src/CHANGES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 50a27dc..5ea77ae 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -5710,5 +5710,6 @@ A brief overview of important functionality available in release 0.01: - Windows installer available. + __COPYRIGHT__ __FILE__ __REVISION__ __DATE__ __DEVELOPER__ -- cgit v0.12 From e7888b15628b09af093621825b78df5cbcead088 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sun, 27 Oct 2013 07:46:41 -0400 Subject: Correctly fix bug #2903, failure to rebuild when linker options change. The failure to rebuild when linker options change was introduced in abded0675444, "Add library version support to Shared Lib builder", between 2.2.0 and 2.3.0. Turning ShlinkAction into a FunctionAction instead of a CommandAction made it stop depending on $SHLINKCOM. Normally, a CommandAction calls get_presig (Action.py:815) which removes $( ... $) and uses the rest of that string (recursively fully substituted) as the contents to hash. FunctionActions only look at the body of the function, so that removed the dependency on $SHLINKCOM altogether. Adding it back in the varlist does this (Action.py:443): for v in vl: result.append(env.subst('${'+v+'}')) so it deep-substitutes the whole thing, including all the $( ... $) parts. (All varlist vars do this, not just in FunctionActions.) What we really want is to depend on the value of env['SHLINKCOM'] in the way CommandActions do, i.e. without the $( ... $) parts, definitely not the fully substituted version of it. I'm pretty sure the ignored $(...$) parts should not ever be included in the signature, so this change updates the varlist handling code to work the way CommandActions always have. This change also renames the test files to use the correct bug number and updates the test. --- src/engine/SCons/Action.py | 3 ++- src/engine/SCons/Tool/__init__.py | 8 ++++++-- test/Libs/SharedLibrary-update-deps.py | 17 +++++++++++++++-- test/Libs/bug2903/SConstruct | 13 +++++++++++++ test/Libs/bug2903/SConstruct-libs | 3 +++ test/Libs/bug2903/lib.c | 1 + test/Libs/bug2903/main.c | 3 +++ test/Libs/bug2909/SConstruct | 3 --- test/Libs/bug2909/SConstruct-libs | 3 --- test/Libs/bug2909/lib.c | 1 - test/Libs/bug2909/main.c | 3 --- 11 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 test/Libs/bug2903/SConstruct create mode 100644 test/Libs/bug2903/SConstruct-libs create mode 100644 test/Libs/bug2903/lib.c create mode 100644 test/Libs/bug2903/main.c delete mode 100644 test/Libs/bug2909/SConstruct delete mode 100644 test/Libs/bug2909/SConstruct-libs delete mode 100644 test/Libs/bug2909/lib.c delete mode 100644 test/Libs/bug2909/main.c diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index c1eef75..543c37c 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -439,7 +439,8 @@ class ActionBase(object): vl = self.get_varlist(target, source, env) if is_String(vl): vl = (vl,) for v in vl: - result.append(env.subst('${'+v+'}')) + # do the subst this way to ignore $(...$) parts: + result.append(env.subst_target_source('${'+v+'}', SCons.Subst.SUBST_SIG, target, source)) return ''.join(result) def __add__(self, other): diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index 7477f75..c09f8e4 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -364,8 +364,12 @@ symlinks for the platform we are on""" print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver) return result -# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 : -# varlist=['$SHLINKCOM']: ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM +# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 : +# Ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM. +# This was tricky because we don't want changing LIBPATH to cause a rebuild, but +# changing other link args should. LIBPATH has $( ... $) around it but until this +# fix, when the varlist was added to the build sig those ignored parts weren't getting +# ignored. ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None, varlist=['SHLINKCOM']) def createSharedLibBuilder(env): diff --git a/test/Libs/SharedLibrary-update-deps.py b/test/Libs/SharedLibrary-update-deps.py index 24c5262..e8ec2ab 100644 --- a/test/Libs/SharedLibrary-update-deps.py +++ b/test/Libs/SharedLibrary-update-deps.py @@ -26,18 +26,20 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" """ Test that SharedLibrary() updates when a different lib is linked, even if it has the same md5. -This is Tigris bug #2909. +This is Tigris bug #2903. """ +import sys import os.path import TestSCons test = TestSCons.TestSCons() -test.dir_fixture( "bug2909" ) +test.dir_fixture( "bug2903" ) # Build the sub-libs (don't care about details of this) test.run(arguments='-f SConstruct-libs') + # This should build the main lib, using libfoo.so test.run(arguments='libname=foo') # This should rebuild the main lib, using libbar.so; @@ -48,6 +50,17 @@ test.must_not_contain_any_line(test.stdout(), ["is up to date"]) test.run(arguments='libname=foo') test.must_not_contain_any_line(test.stdout(), ["is up to date"]) +# Now try changing the link command line (in an innocuous way); should rebuild. +if sys.platform == 'win32': + extraflags='shlinkflags=/DEBUG' +else: + extraflags='shlinkflags=-g' + +test.run(arguments=['libname=foo', extraflags]) +test.must_not_contain_any_line(test.stdout(), ["is up to date"]) +test.run(arguments=['libname=foo', extraflags]) +test.must_contain_all_lines(test.stdout(), ["is up to date"]) + test.pass_test() # Local Variables: diff --git a/test/Libs/bug2903/SConstruct b/test/Libs/bug2903/SConstruct new file mode 100644 index 0000000..f7b66a8 --- /dev/null +++ b/test/Libs/bug2903/SConstruct @@ -0,0 +1,13 @@ +# SConstruct for testing but #2903. +# The test changes the lib name to make sure it rebuilds +# when the name changes, even if the content of the lib is the same. +# Also, the test passes in extra shlinkflags to ensure things rebuild +# when other linker options change, and not when they don't. +# (This doesn't specifically test LIBPATH, but there's a test for +# that already.) +env=Environment() +libname=ARGUMENTS.get('libname', 'foo') +env['SHLINKCOM'] = env['SHLINKCOM'] + ' $EXTRA_SHLINKFLAGS' +shlinkflags=ARGUMENTS.get('shlinkflags', '') +env.SharedLibrary('myshared', ['main.c'], + LIBS=[libname], LIBPATH='.', EXTRA_SHLINKFLAGS=shlinkflags) diff --git a/test/Libs/bug2903/SConstruct-libs b/test/Libs/bug2903/SConstruct-libs new file mode 100644 index 0000000..3f59f9c --- /dev/null +++ b/test/Libs/bug2903/SConstruct-libs @@ -0,0 +1,3 @@ +env=Environment() +libfoo = env.SharedLibrary('foo', 'lib.c') +env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo) \ No newline at end of file diff --git a/test/Libs/bug2903/lib.c b/test/Libs/bug2903/lib.c new file mode 100644 index 0000000..048f715 --- /dev/null +++ b/test/Libs/bug2903/lib.c @@ -0,0 +1 @@ +int i; diff --git a/test/Libs/bug2903/main.c b/test/Libs/bug2903/main.c new file mode 100644 index 0000000..3fe7d49 --- /dev/null +++ b/test/Libs/bug2903/main.c @@ -0,0 +1,3 @@ +void func() +{ +} diff --git a/test/Libs/bug2909/SConstruct b/test/Libs/bug2909/SConstruct deleted file mode 100644 index 2c5440b..0000000 --- a/test/Libs/bug2909/SConstruct +++ /dev/null @@ -1,3 +0,0 @@ -env=Environment() -libname=ARGUMENTS.get('libname', 'foo') -env.SharedLibrary('myshared', ['main.c'], LIBS=[libname], LIBPATH='.') \ No newline at end of file diff --git a/test/Libs/bug2909/SConstruct-libs b/test/Libs/bug2909/SConstruct-libs deleted file mode 100644 index 3f59f9c..0000000 --- a/test/Libs/bug2909/SConstruct-libs +++ /dev/null @@ -1,3 +0,0 @@ -env=Environment() -libfoo = env.SharedLibrary('foo', 'lib.c') -env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo) \ No newline at end of file diff --git a/test/Libs/bug2909/lib.c b/test/Libs/bug2909/lib.c deleted file mode 100644 index 048f715..0000000 --- a/test/Libs/bug2909/lib.c +++ /dev/null @@ -1 +0,0 @@ -int i; diff --git a/test/Libs/bug2909/main.c b/test/Libs/bug2909/main.c deleted file mode 100644 index 3fe7d49..0000000 --- a/test/Libs/bug2909/main.c +++ /dev/null @@ -1,3 +0,0 @@ -void func() -{ -} -- cgit v0.12 From 7b7cded8d2946209e2802b34564cc4ec6428884b Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sat, 2 Nov 2013 08:41:02 -0400 Subject: Fix tests for previous commit (bug 2903) on Windows. --- test/Libs/SharedLibrary-update-deps.py | 2 +- test/Libs/bug2903/SConstruct | 2 +- test/Libs/bug2903/SConstruct-libs | 3 ++- test/Libs/bug2903/lib.c | 3 +++ test/Libs/bug2903/main.c | 3 +++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/test/Libs/SharedLibrary-update-deps.py b/test/Libs/SharedLibrary-update-deps.py index e8ec2ab..5394bc7 100644 --- a/test/Libs/SharedLibrary-update-deps.py +++ b/test/Libs/SharedLibrary-update-deps.py @@ -58,7 +58,7 @@ else: test.run(arguments=['libname=foo', extraflags]) test.must_not_contain_any_line(test.stdout(), ["is up to date"]) -test.run(arguments=['libname=foo', extraflags]) +test.run(arguments=['libname=foo', extraflags, '--debug=explain']) test.must_contain_all_lines(test.stdout(), ["is up to date"]) test.pass_test() diff --git a/test/Libs/bug2903/SConstruct b/test/Libs/bug2903/SConstruct index f7b66a8..12919ce 100644 --- a/test/Libs/bug2903/SConstruct +++ b/test/Libs/bug2903/SConstruct @@ -7,7 +7,7 @@ # that already.) env=Environment() libname=ARGUMENTS.get('libname', 'foo') -env['SHLINKCOM'] = env['SHLINKCOM'] + ' $EXTRA_SHLINKFLAGS' +env.Append(SHLINKFLAGS=' $EXTRA_SHLINKFLAGS') shlinkflags=ARGUMENTS.get('shlinkflags', '') env.SharedLibrary('myshared', ['main.c'], LIBS=[libname], LIBPATH='.', EXTRA_SHLINKFLAGS=shlinkflags) diff --git a/test/Libs/bug2903/SConstruct-libs b/test/Libs/bug2903/SConstruct-libs index 3f59f9c..f7cc35d 100644 --- a/test/Libs/bug2903/SConstruct-libs +++ b/test/Libs/bug2903/SConstruct-libs @@ -1,3 +1,4 @@ env=Environment() libfoo = env.SharedLibrary('foo', 'lib.c') -env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo) \ No newline at end of file +env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo[0]) +env.InstallAs('${LIBPREFIX}bar${LIBSUFFIX}', libfoo[1]) diff --git a/test/Libs/bug2903/lib.c b/test/Libs/bug2903/lib.c index 048f715..65f4cd2 100644 --- a/test/Libs/bug2903/lib.c +++ b/test/Libs/bug2903/lib.c @@ -1 +1,4 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif int i; diff --git a/test/Libs/bug2903/main.c b/test/Libs/bug2903/main.c index 3fe7d49..a4b1ecc 100644 --- a/test/Libs/bug2903/main.c +++ b/test/Libs/bug2903/main.c @@ -1,3 +1,6 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif void func() { } -- cgit v0.12 From e2376cfadf13cfaa685d4774aaa3986efa4cfdff Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sat, 2 Nov 2013 10:46:08 -0400 Subject: Added changelog entry for pull req #89 --- src/CHANGES.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 5bfc0c5..7529ae4 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,10 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Tom Tanner: + - Stop leaking file handles to subprocesses by switching to using subprocess + always. + From Bogdan Tenea: - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly. -- cgit v0.12 From 6660a1b75c021994ccf352bb5314935d533b7994 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sat, 2 Nov 2013 11:46:36 -0400 Subject: One more test fix for bug2903 (my Windows fix broke Linux) --- test/Libs/bug2903/SConstruct-libs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Libs/bug2903/SConstruct-libs b/test/Libs/bug2903/SConstruct-libs index f7cc35d..1590062 100644 --- a/test/Libs/bug2903/SConstruct-libs +++ b/test/Libs/bug2903/SConstruct-libs @@ -1,4 +1,5 @@ env=Environment() libfoo = env.SharedLibrary('foo', 'lib.c') env.InstallAs('${SHLIBPREFIX}bar${SHLIBSUFFIX}', libfoo[0]) -env.InstallAs('${LIBPREFIX}bar${LIBSUFFIX}', libfoo[1]) +if len(libfoo) > 1: # on Windows, there's an import lib (also a .exp, but we don't want that) + env.InstallAs('${LIBPREFIX}bar${LIBSUFFIX}', libfoo[1]) -- cgit v0.12 From 396cc5ff8cce251f405e3eba6163362239ce7d08 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Sat, 2 Nov 2013 17:37:13 -0400 Subject: Added CHANGES entries for Tom Tanner's recent changes. --- src/CHANGES.txt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 7529ae4..8b24696 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -9,6 +9,13 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE From Tom Tanner: - Stop leaking file handles to subprocesses by switching to using subprocess always. + - Allow multiple options to be specified with --debug=a,b,c + - Add support for a readonly cache (--cache-readonly) + - Always print stats if requested + - Generally try harder to print out a message on build errors + - Adds a switch to warn on missing targets + - Add Pseudo command to mark targets which should not exist after + they are built. From Bogdan Tenea: - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly. @@ -60,14 +67,14 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE approach, that also requires less external dependencies (programs and Python packages). Added a customized Docbook XSD for strict validation of all input XML files. - + From Luca Falavigna: - Fixed spelling errors in MAN pages (#2897). - + From Michael McDougall: - Fixed description of ignore_case for EnumVariable in the MAN page (#2774). - + RELEASE 2.3.0 - Mon, 02 Mar 2013 13:22:29 -0400 From Anatoly Techtonik: -- cgit v0.12 From 703ba43b17517810162d91b109b54fc76868eee6 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sun, 3 Nov 2013 19:17:58 +0100 Subject: - corrected LC_ALL setting for RPM packaging - now skipping several Docbook tests, when required stylesheets aren't installed --- src/engine/SCons/Tool/rpm.py | 4 ++-- test/Docbook/basedir/htmlchunked/htmlchunked.py | 6 ++++++ test/Docbook/basedir/htmlhelp/htmlhelp.py | 6 ++++++ test/Docbook/basedir/slideshtml/slideshtml.py | 7 +++++++ test/Docbook/basic/slideshtml/slideshtml.py | 7 +++++++ test/Docbook/rootname/htmlchunked/htmlchunked.py | 6 ++++++ test/Docbook/rootname/htmlhelp/htmlhelp.py | 6 ++++++ test/Docbook/rootname/slideshtml/slideshtml.py | 7 +++++++ 8 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/engine/SCons/Tool/rpm.py b/src/engine/SCons/Tool/rpm.py index 26d2109..1f6eafe 100644 --- a/src/engine/SCons/Tool/rpm.py +++ b/src/engine/SCons/Tool/rpm.py @@ -79,7 +79,7 @@ def build_rpm(target, source, env): errstr=output, filename=str(target[0]) ) else: - # XXX: assume that LC_ALL=c is set while running rpmbuild + # XXX: assume that LC_ALL=C is set while running rpmbuild output_files = re.compile( 'Wrote: (.*)' ).findall( output ) for output, input in zip( output_files, target ): @@ -117,7 +117,7 @@ def generate(env): bld = RpmBuilder env['BUILDERS']['Rpm'] = bld - env.SetDefault(RPM = 'LC_ALL=c rpmbuild') + env.SetDefault(RPM = 'LC_ALL=C rpmbuild') env.SetDefault(RPMFLAGS = SCons.Util.CLVar('-ta')) env.SetDefault(RPMCOM = rpmAction) env.SetDefault(RPMSUFFIX = '.rpm') diff --git a/test/Docbook/basedir/htmlchunked/htmlchunked.py b/test/Docbook/basedir/htmlchunked/htmlchunked.py index c581701..cf5f3d1 100644 --- a/test/Docbook/basedir/htmlchunked/htmlchunked.py +++ b/test/Docbook/basedir/htmlchunked/htmlchunked.py @@ -26,10 +26,16 @@ Test the base_dir argument for the chunked HTML builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('Wrong OS or no stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/basedir/htmlhelp/htmlhelp.py b/test/Docbook/basedir/htmlhelp/htmlhelp.py index 736f732..22bbd72 100644 --- a/test/Docbook/basedir/htmlhelp/htmlhelp.py +++ b/test/Docbook/basedir/htmlhelp/htmlhelp.py @@ -26,10 +26,16 @@ Test the base_dir argument for the HTMLHELP builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('Wrong OS or no stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/basedir/slideshtml/slideshtml.py b/test/Docbook/basedir/slideshtml/slideshtml.py index 505d36d..a2375e4 100644 --- a/test/Docbook/basedir/slideshtml/slideshtml.py +++ b/test/Docbook/basedir/slideshtml/slideshtml.py @@ -26,10 +26,17 @@ Test the base_dir argument for the Slides HTML builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl/slides') and + os.path.isdir('/usr/share/xml/docbook/custom/slides/3.3.1')): + test.skip_test('Wrong OS or no "slides" stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/basic/slideshtml/slideshtml.py b/test/Docbook/basic/slideshtml/slideshtml.py index d4636d4..37c2be0 100644 --- a/test/Docbook/basic/slideshtml/slideshtml.py +++ b/test/Docbook/basic/slideshtml/slideshtml.py @@ -26,10 +26,17 @@ Test the Slides HTML builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl/slides') and + os.path.isdir('/usr/share/xml/docbook/custom/slides/3.3.1')): + test.skip_test('Wrong OS or no "slides" stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/rootname/htmlchunked/htmlchunked.py b/test/Docbook/rootname/htmlchunked/htmlchunked.py index 2489019..8ab91d2 100644 --- a/test/Docbook/rootname/htmlchunked/htmlchunked.py +++ b/test/Docbook/rootname/htmlchunked/htmlchunked.py @@ -26,10 +26,16 @@ Test the root.name argument for the chunked HTML builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('Wrong OS or no stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/rootname/htmlhelp/htmlhelp.py b/test/Docbook/rootname/htmlhelp/htmlhelp.py index 84be5d9..ee37e1a 100644 --- a/test/Docbook/rootname/htmlhelp/htmlhelp.py +++ b/test/Docbook/rootname/htmlhelp/htmlhelp.py @@ -26,10 +26,16 @@ Test the root.name argument for the HTMLHELP builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('Wrong OS or no stylesheets installed, skipping test.\n') + try: import libxml2 except: diff --git a/test/Docbook/rootname/slideshtml/slideshtml.py b/test/Docbook/rootname/slideshtml/slideshtml.py index c316ada..4d55035 100644 --- a/test/Docbook/rootname/slideshtml/slideshtml.py +++ b/test/Docbook/rootname/slideshtml/slideshtml.py @@ -26,10 +26,17 @@ Test the root.name argument for the Slides HTML builder. """ +import os +import sys import TestSCons test = TestSCons.TestSCons() +if not (sys.platform.startswith('linux') and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl/slides') and + os.path.isdir('/usr/share/xml/docbook/custom/slides/3.3.1')): + test.skip_test('Wrong OS or no "slides" stylesheets installed, skipping test.\n') + try: import libxml2 except: -- cgit v0.12 From 36aa3bb0374fdedd29bd68aa849ab395acecd4c8 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 4 Nov 2013 10:15:12 +0000 Subject: Add some information about --warn=target-not-built to the troubleshooting page. --- doc/generated/examples/troubleshoot_explain1_3.xml | 7 +++++++ doc/user/troubleshoot.xml | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 doc/generated/examples/troubleshoot_explain1_3.xml diff --git a/doc/generated/examples/troubleshoot_explain1_3.xml b/doc/generated/examples/troubleshoot_explain1_3.xml new file mode 100644 index 0000000..b62be87 --- /dev/null +++ b/doc/generated/examples/troubleshoot_explain1_3.xml @@ -0,0 +1,7 @@ + +% scons -Q --warn=target-not-built +scons: building `file.out' because it doesn't exist +cp file.in file.oout + +scons: warning: Cannot find target file.out after building + diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml index 94af727..634c7a6 100644 --- a/doc/user/troubleshoot.xml +++ b/doc/user/troubleshoot.xml @@ -2,7 +2,7 @@ %scons; - + %builders-mod; @@ -157,6 +157,17 @@ file.in that something was wrong with the command that we invoked to build it. + + Note that you can also use --warn=target-not-built which checks + whether or not expected targets exist after a build rule is + executed. + + + + + scons -Q --warn=target-not-built + + -- cgit v0.12 From abec7c8c531817d20185f9c758f3ca7316b1207b Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 4 Nov 2013 10:21:47 +0000 Subject: Fix a missing which became didn't become apparent till I created the pull request. --- doc/user/troubleshoot.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml index 634c7a6..b609855 100644 --- a/doc/user/troubleshoot.xml +++ b/doc/user/troubleshoot.xml @@ -157,6 +157,8 @@ file.in that something was wrong with the command that we invoked to build it. + + Note that you can also use --warn=target-not-built which checks whether or not expected targets exist after a build rule is -- cgit v0.12 From 425a1f0df64d016128a98098b30f7d0e1ebd8de8 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Mon, 4 Nov 2013 10:24:31 +0000 Subject: Another problem with tags. --- doc/user/troubleshoot.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml index b609855..65c9199 100644 --- a/doc/user/troubleshoot.xml +++ b/doc/user/troubleshoot.xml @@ -165,13 +165,10 @@ file.in executed. - scons -Q --warn=target-not-built - - The &debug-explain; option also comes in handy -- cgit v0.12 From 49f23291e62a741a5f53a3e37f606588a2e0d2f0 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Tue, 12 Nov 2013 16:06:21 -0800 Subject: test change to buildbot config for link to checkins --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 63e507a..a1025ca 100644 --- a/README.rst +++ b/README.rst @@ -752,3 +752,4 @@ With plenty of help from the SCons Development team: __COPYRIGHT__ + -- cgit v0.12 From 855696a80d87b672930d336184356a72eff6c1cb Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Thu, 14 Nov 2013 19:51:12 +0100 Subject: - removed the "env" parameter from the Gs Builder constructor, this lets all environment tests run successfully again --- src/engine/SCons/Tool/gs.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/engine/SCons/Tool/gs.py b/src/engine/SCons/Tool/gs.py index a8fddde..6e31ee2 100644 --- a/src/engine/SCons/Tool/gs.py +++ b/src/engine/SCons/Tool/gs.py @@ -70,8 +70,7 @@ def generate(env): except ImportError, e: pass - gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'), - env = env) + gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR')) env['BUILDERS']['Gs'] = gsbuilder env['GS'] = gs -- cgit v0.12 From 4bbec153e3cb22fccb8c67212af1894f245bd8f8 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Thu, 19 Dec 2013 21:27:00 +0100 Subject: Added release_target_info() to File nodes, reduces memory consumption. --- src/CHANGES.txt | 3 + src/engine/SCons/Executor.py | 8 ++- src/engine/SCons/Node/FS.py | 139 +++++++++++++++++++++++++++++++++--- src/engine/SCons/Node/__init__.py | 76 ++++++++++++-------- src/engine/SCons/SConf.py | 3 + src/engine/SCons/SConfTests.py | 2 +- src/engine/SCons/Script/Main.py | 1 + src/engine/SCons/Taskmaster.py | 37 +++++++--- src/engine/SCons/TaskmasterTests.py | 5 +- 9 files changed, 221 insertions(+), 53 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 8b24696..5e3a05b 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -43,6 +43,9 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE SCons from a source (non-installed) dir. - Count statistics of instances are now collected only when the --debug=count command-line option is used (#2922). + - Added release_target_info() to File nodes, which helps to + reduce memory consumption in clean builds and update runs + of large projects. From Gary Oberbrunner: - Test harness: fail_test() can now print a message to help debugging. diff --git a/src/engine/SCons/Executor.py b/src/engine/SCons/Executor.py index 7875537..051d275 100644 --- a/src/engine/SCons/Executor.py +++ b/src/engine/SCons/Executor.py @@ -230,6 +230,8 @@ class Executor(object): self.action_list = action def get_action_list(self): + if self.action_list is None: + return [] return self.pre_actions + self.action_list + self.post_actions def get_all_targets(self): @@ -268,7 +270,8 @@ class Executor(object): """ result = SCons.Util.UniqueList([]) for target in self.get_all_targets(): - result.extend(target.prerequisites) + if target.prerequisites is not None: + result.extend(target.prerequisites) return result def get_action_side_effects(self): @@ -571,7 +574,7 @@ class Null(object): """A null Executor, with a null build Environment, that does nothing when the rest of the methods call it. - This might be able to disapper when we refactor things to + This might be able to disappear when we refactor things to disassociate Builders from Nodes entirely, so we're not going to worry about unit tests for this--at least for now. """ @@ -626,7 +629,6 @@ class Null(object): self._morph() self.set_action_list(action) - # Local Variables: # tab-width:4 # indent-tabs-mode:nil diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 18400e8..aaa5b47 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -2398,6 +2398,8 @@ class File(Base): self.scanner_paths = {} if not hasattr(self, '_local'): self._local = 0 + if not hasattr(self, 'released_target_info'): + self.released_target_info = False # If there was already a Builder set on this entry, then # we need to make sure we call the target-decider function, @@ -2725,7 +2727,7 @@ class File(Base): return self.get_build_env().get_CacheDir().retrieve(self) def visited(self): - if self.exists(): + if self.exists() and self.executor is not None: self.get_build_env().get_CacheDir().push_if_forced(self) ninfo = self.get_ninfo() @@ -2747,6 +2749,58 @@ class File(Base): self.store_info() + def release_target_info(self): + """Called just after this node has been marked + up-to-date or was built completely. + + This is where we try to release as many target node infos + as possible for clean builds and update runs, in order + to minimize the overall memory consumption. + + We'd like to remove a lot more attributes like self.sources + and self.sources_set, but they might get used + in a next build step. For example, during configuration + the source files for a built *.o file are used to figure out + which linker to use for the resulting Program (gcc vs. g++)! + That's why we check for the 'keep_targetinfo' attribute, + config Nodes and the Interactive mode just don't allow + an early release of most variables. + + In the same manner, we can't simply remove the self.attributes + here. The smart linking relies on the shared flag, and some + parts of the java Tool use it to transport information + about nodes... + + @see: built() and Node.release_target_info() + """ + if (self.released_target_info or SCons.Node.interactive): + return + + if not hasattr(self.attributes, 'keep_targetinfo'): + # Cache some required values, before releasing + # stuff like env, executor and builder... + self.changed() + self.get_contents_sig() + self.get_build_env() + # Now purge unneeded stuff to free memory... + self.executor = None + self._memo.pop('rfile', None) + self.prerequisites = None + # Cleanup lists, but only if they're empty + if not len(self.ignore_set): + self.ignore_set = None + if not len(self.implicit_set): + self.implicit_set = None + if not len(self.depends_set): + self.depends_set = None + if not len(self.ignore): + self.ignore = None + if not len(self.depends): + self.depends = None + # Mark this node as done, we only have to release + # the memory once... + self.released_target_info = True + def find_src_builder(self): if self.rexists(): return None @@ -2957,6 +3011,48 @@ class File(Base): SCons.Node.Node.builder_set(self, builder) self.changed_since_last_build = self.decide_target + def built(self): + """Called just after this File node is successfully built. + + Just like for 'release_target_info' we try to release + some more target node attributes in order to minimize the + overall memory consumption. + + @see: release_target_info + """ + + SCons.Node.Node.built(self) + + if not hasattr(self.attributes, 'keep_targetinfo'): + # Ensure that the build infos get computed and cached... + self.store_info() + # ... then release some more variables. + self._specific_sources = False + self.labspath = None + self._save_str() + self.cwd = None + + self.scanner_paths = None + + def changed(self, node=None): + """ + Returns if the node is up-to-date with respect to the BuildInfo + stored last time it was built. + + For File nodes this is basically a wrapper around Node.changed(), + but we allow the return value to get cached after the reference + to the Executor got released in release_target_info(). + """ + if node is None: + try: + return self._memo['changed'] + except KeyError: + pass + + has_changed = SCons.Node.Node.changed(self, node) + self._memo['changed'] = has_changed + return has_changed + def changed_content(self, target, prev_ni): cur_csig = self.get_csig() try: @@ -3090,25 +3186,50 @@ class File(Base): self.cachedir_csig = self.get_csig() return self.cachedir_csig + def get_contents_sig(self): + """ + A helper method for get_cachedir_bsig. + + It computes and returns the signature for this + node's contents. + """ + + try: + return self.contentsig + except AttributeError: + pass + + executor = self.get_executor() + + result = self.contentsig = SCons.Util.MD5signature(executor.get_contents()) + return result + def get_cachedir_bsig(self): + """ + Return the signature for a cached file, including + its children. + + It adds the path of the cached file to the cache signature, + because multiple targets built by the same action will all + have the same build signature, and we have to differentiate + them somehow. + """ try: return self.cachesig except AttributeError: pass - - # Add the path to the cache signature, because multiple - # targets built by the same action will all have the same - # build signature, and we have to differentiate them somehow. + + # Collect signatures for all children children = self.children() - executor = self.get_executor() - # sigs = [n.get_cachedir_csig() for n in children] sigs = [n.get_cachedir_csig() for n in children] - sigs.append(SCons.Util.MD5signature(executor.get_contents())) + # Append this node's signature... + sigs.append(self.get_contents_sig()) + # ...and it's path sigs.append(self.path) + # Merge this all into a single signature result = self.cachesig = SCons.Util.MD5collect(sigs) return result - default_fs = None def get_default_fs(): diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index d353245..d6dbf2e 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -100,6 +100,11 @@ def do_nothing(node): pass Annotate = do_nothing +# Gets set to 'True' if we're running in interactive mode. Is +# currently used to release parts of a target's info during +# clean builds and update runs (see release_target_info). +interactive = False + # Classes for signature info for Nodes. class NodeInfoBase(object): @@ -209,7 +214,7 @@ class Node(object): self.depends_set = set() self.ignore = [] # dependencies to ignore self.ignore_set = set() - self.prerequisites = SCons.Util.UniqueList() + self.prerequisites = None self.implicit = None # implicit (scanned) dependencies (None means not scanned yet) self.waiting_parents = set() self.waiting_s_e = set() @@ -292,7 +297,8 @@ class Node(object): except AttributeError: pass else: - executor.cleanup() + if executor is not None: + executor.cleanup() def reset_executor(self): "Remove cached executor; forces recompute when needed." @@ -352,10 +358,11 @@ class Node(object): methods should call this base class method to get the child check and the BuildInfo structure. """ - for d in self.depends: - if d.missing(): - msg = "Explicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError(msg % (d, self)) + if self.depends is not None: + for d in self.depends: + if d.missing(): + msg = "Explicit dependency `%s' not found, needed by target `%s'." + raise SCons.Errors.StopError(msg % (d, self)) if self.implicit is not None: for i in self.implicit: if i.missing(): @@ -413,6 +420,23 @@ class Node(object): self.ninfo.update(self) self.store_info() + def release_target_info(self): + """Called just after this node has been marked + up-to-date or was built completely. + + This is where we try to release as many target node infos + as possible for clean builds and update runs, in order + to minimize the overall memory consumption. + + By purging attributes that aren't needed any longer after + a Node (=File) got built, we don't have to care that much how + many KBytes a Node actually requires...as long as we free + the memory shortly afterwards. + + @see: built() and File.release_target_info() + """ + pass + # # # @@ -514,7 +538,7 @@ class Node(object): def is_derived(self): """ - Returns true iff this node is derived (i.e. built). + Returns true if this node is derived (i.e. built). This should return true only for nodes whose path should be in the variant directory when duplicate=0 and should contribute their build @@ -854,6 +878,8 @@ class Node(object): def add_prerequisite(self, prerequisite): """Adds prerequisites""" + if self.prerequisites is None: + self.prerequisites = SCons.Util.UniqueList() self.prerequisites.extend(prerequisite) self._children_reset() @@ -941,20 +967,14 @@ class Node(object): # dictionary patterns I found all ended up using "not in" # internally anyway...) if self.ignore_set: - if self.implicit is None: - iter = chain(self.sources,self.depends) - else: - iter = chain(self.sources, self.depends, self.implicit) + iter = chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit])) children = [] for i in iter: if i not in self.ignore_set: children.append(i) else: - if self.implicit is None: - children = self.sources + self.depends - else: - children = self.sources + self.depends + self.implicit + children = self.all_children(scan=0) self._memo['children_get'] = children return children @@ -981,10 +1001,7 @@ class Node(object): # using dictionary keys, lose the order, and the only ordered # dictionary patterns I found all ended up using "not in" # internally anyway...) - if self.implicit is None: - return self.sources + self.depends - else: - return self.sources + self.depends + self.implicit + return list(chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit]))) def children(self, scan=1): """Return a list of the node's direct children, minus those @@ -1120,17 +1137,18 @@ class Node(object): Return a text representation, suitable for displaying to the user, of the include tree for the sources of this node. """ - if self.is_derived() and self.env: + if self.is_derived(): env = self.get_build_env() - for s in self.sources: - scanner = self.get_source_scanner(s) - if scanner: - path = self.get_build_scanner_path(scanner) - else: - path = None - def f(node, env=env, scanner=scanner, path=path): - return node.get_found_includes(env, scanner, path) - return SCons.Util.render_tree(s, f, 1) + if env: + for s in self.sources: + scanner = self.get_source_scanner(s) + if scanner: + path = self.get_build_scanner_path(scanner) + else: + path = None + def f(node, env=env, scanner=scanner, path=path): + return node.get_found_includes(env, scanner, path) + return SCons.Util.render_tree(s, f, 1) else: return None diff --git a/src/engine/SCons/SConf.py b/src/engine/SCons/SConf.py index f3a3545..7a8a0c2 100644 --- a/src/engine/SCons/SConf.py +++ b/src/engine/SCons/SConf.py @@ -483,6 +483,9 @@ class SConfBase(object): # so we really control how it gets written. for n in nodes: n.store_info = n.do_not_store_info + if not hasattr(n, 'attributes'): + n.attributes = SCons.Node.Node.Attrs() + n.attributes.keep_targetinfo = 1 ret = 1 diff --git a/src/engine/SCons/SConfTests.py b/src/engine/SCons/SConfTests.py index e604886..1cfb05b 100644 --- a/src/engine/SCons/SConfTests.py +++ b/src/engine/SCons/SConfTests.py @@ -182,7 +182,7 @@ class SConfTestCase(unittest.TestCase): self.waiting_parents = set() self.side_effects = [] self.builder = None - self.prerequisites = [] + self.prerequisites = None def disambiguate(self): return self def has_builder(self): diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 7c21519..93380fb 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -1074,6 +1074,7 @@ def _main(parser): platform = SCons.Platform.platform_module() if options.interactive: + SCons.Node.interactive = True SCons.Script.Interactive.interact(fs, OptionsParser, options, targets, target_top) diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py index 64ab84d..5de1cda 100644 --- a/src/engine/SCons/Taskmaster.py +++ b/src/engine/SCons/Taskmaster.py @@ -186,6 +186,8 @@ class Task(object): # or implicit dependencies exists, and also initialize the # .sconsign info. executor = self.targets[0].get_executor() + if executor is None: + return executor.prepare() for t in executor.get_action_targets(): if print_prepare: @@ -289,6 +291,7 @@ class Task(object): post-visit actions that must take place regardless of whether or not the target was an actual built target or a source Node. """ + global print_prepare T = self.tm.trace if T: T.write(self.trace_message('Task.executed_with_callbacks()', self.node)) @@ -301,7 +304,12 @@ class Task(object): if not t.cached: t.push_to_cache() t.built() - t.visited() + t.visited() + if (not print_prepare and + (not hasattr(self, 'options') or not self.options.debug_includes)): + t.release_target_info() + else: + t.visited() executed = executed_with_callbacks @@ -382,6 +390,7 @@ class Task(object): This is the default behavior for building only what's necessary. """ + global print_prepare T = self.tm.trace if T: T.write(self.trace_message(u'Task.make_ready_current()', self.node)) @@ -414,6 +423,9 @@ class Task(object): # parallel build...) t.visited() t.set_state(NODE_UP_TO_DATE) + if (not print_prepare and + (not hasattr(self, 'options') or not self.options.debug_includes)): + t.release_target_info() make_ready = make_ready_current @@ -453,14 +465,15 @@ class Task(object): parents[p] = parents.get(p, 0) + 1 for t in targets: - for s in t.side_effects: - if s.get_state() == NODE_EXECUTING: - s.set_state(NODE_NO_STATE) - for p in s.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - for p in s.waiting_s_e: - if p.ref_count == 0: - self.tm.candidates.append(p) + if t.side_effects is not None: + for s in t.side_effects: + if s.get_state() == NODE_EXECUTING: + s.set_state(NODE_NO_STATE) + for p in s.waiting_parents: + parents[p] = parents.get(p, 0) + 1 + for p in s.waiting_s_e: + if p.ref_count == 0: + self.tm.candidates.append(p) for p, subtract in parents.items(): p.ref_count = p.ref_count - subtract @@ -927,7 +940,11 @@ class Taskmaster(object): if node is None: return None - tlist = node.get_executor().get_all_targets() + executor = node.get_executor() + if executor is None: + return None + + tlist = executor.get_all_targets() task = self.tasker(self, tlist, node in self.original_top, node) try: diff --git a/src/engine/SCons/TaskmasterTests.py b/src/engine/SCons/TaskmasterTests.py index 85ade8d..e875158 100644 --- a/src/engine/SCons/TaskmasterTests.py +++ b/src/engine/SCons/TaskmasterTests.py @@ -49,7 +49,7 @@ class Node(object): self.scanned = 0 self.scanner = None self.targets = [self] - self.prerequisites = [] + self.prerequisites = None class Builder(object): def targets(self, node): return node.targets @@ -141,6 +141,9 @@ class Node(object): self.clear() + def release_target_info(self): + pass + def has_builder(self): return not self.builder is None -- cgit v0.12 From 2d4664140f8eb4b2c28c7f7ea72b904093c3ac16 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Fri, 20 Dec 2013 22:21:12 +0100 Subject: - added xsltproc tests and improved handling of the base_dir parameter --- src/engine/SCons/Tool/docbook/__init__.py | 54 ++++++++++++++---- .../Docbook/basedir/htmlchunked/htmlchunked_cmd.py | 57 +++++++++++++++++++ .../basedir/htmlchunked/image/SConstruct.cmd | 2 + test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py | 61 +++++++++++++++++++++ test/Docbook/basedir/htmlhelp/image/SConstruct.cmd | 3 + .../basedir/slideshtml/image/SConstruct.cmd | 3 + test/Docbook/basedir/slideshtml/slideshtml_cmd.py | 64 ++++++++++++++++++++++ test/Docbook/basic/html/html_cmd.py | 54 ++++++++++++++++++ test/Docbook/basic/html/image/SConstruct.cmd | 3 + test/Docbook/basic/htmlchunked/htmlchunked_cmd.py | 55 +++++++++++++++++++ .../Docbook/basic/htmlchunked/image/SConstruct.cmd | 3 + test/Docbook/basic/htmlhelp/htmlhelp_cmd.py | 58 ++++++++++++++++++++ test/Docbook/basic/htmlhelp/image/SConstruct.cmd | 3 + test/Docbook/basic/man/image/SConstruct.cmd | 3 + test/Docbook/basic/man/man_cmd.py | 56 +++++++++++++++++++ test/Docbook/basic/slideshtml/image/SConstruct.cmd | 3 + test/Docbook/basic/slideshtml/slideshtml_cmd.py | 64 ++++++++++++++++++++++ 17 files changed, 535 insertions(+), 11 deletions(-) create mode 100644 test/Docbook/basedir/htmlchunked/htmlchunked_cmd.py create mode 100644 test/Docbook/basedir/htmlchunked/image/SConstruct.cmd create mode 100644 test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py create mode 100644 test/Docbook/basedir/htmlhelp/image/SConstruct.cmd create mode 100644 test/Docbook/basedir/slideshtml/image/SConstruct.cmd create mode 100644 test/Docbook/basedir/slideshtml/slideshtml_cmd.py create mode 100644 test/Docbook/basic/html/html_cmd.py create mode 100644 test/Docbook/basic/html/image/SConstruct.cmd create mode 100644 test/Docbook/basic/htmlchunked/htmlchunked_cmd.py create mode 100644 test/Docbook/basic/htmlchunked/image/SConstruct.cmd create mode 100644 test/Docbook/basic/htmlhelp/htmlhelp_cmd.py create mode 100644 test/Docbook/basic/htmlhelp/image/SConstruct.cmd create mode 100644 test/Docbook/basic/man/image/SConstruct.cmd create mode 100644 test/Docbook/basic/man/man_cmd.py create mode 100644 test/Docbook/basic/slideshtml/image/SConstruct.cmd create mode 100644 test/Docbook/basic/slideshtml/slideshtml_cmd.py diff --git a/src/engine/SCons/Tool/docbook/__init__.py b/src/engine/SCons/Tool/docbook/__init__.py index d6713c6..1e88cfe 100644 --- a/src/engine/SCons/Tool/docbook/__init__.py +++ b/src/engine/SCons/Tool/docbook/__init__.py @@ -260,6 +260,34 @@ def __xml_scan(node, env, path, arg): docbook_xml_scanner = SCons.Script.Scanner(function = __xml_scan, argument = None) + +# +# Action generators +# +def __generate_xsltproc_action(source, target, env, for_signature): + cmd = env['DOCBOOK_XSLTPROCCOM'] + # Does the environment have a base_dir defined? + base_dir = env.subst('$base_dir') + if base_dir: + # Yes, so replace target path by its filename + return cmd.replace('$TARGET','${TARGET.file}') + return cmd + + +# +# Emitters +# +def __emit_xsl_basedir(target, source, env): + # Does the environment have a base_dir defined? + base_dir = env.subst('$base_dir') + if base_dir: + # Yes, so prepend it to each target + return [os.path.join(base_dir, str(t)) for t in target], source + + # No, so simply pass target and source names through + return target, source + + # # Builders # @@ -340,11 +368,13 @@ def __xinclude_lxml(target, source, env): __libxml2_builder = SCons.Builder.Builder( action = __build_libxml2, src_suffix = '.xml', - source_scanner = docbook_xml_scanner) + source_scanner = docbook_xml_scanner, + emitter = __emit_xsl_basedir) __lxml_builder = SCons.Builder.Builder( action = __build_lxml, src_suffix = '.xml', - source_scanner = docbook_xml_scanner) + source_scanner = docbook_xml_scanner, + emitter = __emit_xsl_basedir) __xinclude_libxml2_builder = SCons.Builder.Builder( action = __xinclude_libxml2, @@ -358,9 +388,11 @@ __xinclude_lxml_builder = SCons.Builder.Builder( source_scanner = docbook_xml_scanner) __xsltproc_builder = SCons.Builder.Builder( - action = SCons.Action.Action('$DOCBOOK_XSLTPROCCOM','$DOCBOOK_XSLTPROCCOMSTR'), + action = SCons.Action.CommandGeneratorAction(__generate_xsltproc_action, + {'cmdstr' : '$DOCBOOK_XSLTPROCCOMSTR'}), src_suffix = '.xml', - source_scanner = docbook_xml_scanner) + source_scanner = docbook_xml_scanner, + emitter = __emit_xsl_basedir) __xmllint_builder = SCons.Builder.Builder( action = SCons.Action.Action('$DOCBOOK_XMLLINTCOM','$DOCBOOK_XMLLINTCOMSTR'), suffix = '.xml', @@ -420,11 +452,11 @@ def DocbookHtmlChunked(env, target, source=None, *args, **kw): # Create targets result = [] - r = __builder.__call__(env, base_dir+__ensure_suffix(str(target[0]), '.html'), source[0], **kw) + r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw) env.Depends(r, kw['DOCBOOK_XSL']) result.extend(r) # Add supporting files for cleanup - env.Clean(r, glob.glob(base_dir+'*.html')) + env.Clean(r, glob.glob(os.path.join(base_dir, '*.html'))) return result @@ -455,12 +487,12 @@ def DocbookHtmlhelp(env, target, source=None, *args, **kw): # Create targets result = [] - r = __builder.__call__(env, base_dir+__ensure_suffix(str(target[0]), '.html'), source[0], **kw) + r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw) env.Depends(r, kw['DOCBOOK_XSL']) result.extend(r) # Add supporting files for cleanup env.Clean(r, ['toc.hhc', 'htmlhelp.hhp', 'index.hhk'] + - glob.glob(base_dir+'[ar|bk|ch]*.html')) + glob.glob(os.path.join(base_dir, '[ar|bk|ch]*.html'))) return result @@ -605,12 +637,12 @@ def DocbookSlidesHtml(env, target, source=None, *args, **kw): # Create targets result = [] - r = __builder.__call__(env, base_dir+__ensure_suffix(str(target[0]), '.html'), source[0], **kw) + r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw) env.Depends(r, kw['DOCBOOK_XSL']) result.extend(r) # Add supporting files for cleanup - env.Clean(r, [base_dir+'toc.html'] + - glob.glob(base_dir+'foil*.html')) + env.Clean(r, [os.path.join(base_dir, 'toc.html')] + + glob.glob(os.path.join(base_dir, 'foil*.html'))) return result diff --git a/test/Docbook/basedir/htmlchunked/htmlchunked_cmd.py b/test/Docbook/basedir/htmlchunked/htmlchunked_cmd.py new file mode 100644 index 0000000..b507eb1 --- /dev/null +++ b/test/Docbook/basedir/htmlchunked/htmlchunked_cmd.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the base_dir argument for the chunked HTML builder while using +the xsltproc executable, if it exists. +""" + +import os +import sys +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not (xsltproc and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('No xsltproc or no stylesheets installed, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('output/index.html')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('output/index.html')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basedir/htmlchunked/image/SConstruct.cmd b/test/Docbook/basedir/htmlchunked/image/SConstruct.cmd new file mode 100644 index 0000000..d981b28 --- /dev/null +++ b/test/Docbook/basedir/htmlchunked/image/SConstruct.cmd @@ -0,0 +1,2 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookHtmlChunked('manual', xsl='html.xsl', base_dir='output/') diff --git a/test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py b/test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py new file mode 100644 index 0000000..a0f5e8a --- /dev/null +++ b/test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the base_dir argument for the HTMLHELP builder while using +the xsltproc executable, if it exists. +""" + +import os +import sys +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not (xsltproc and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl')): + test.skip_test('No xsltproc or no stylesheets installed, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('output/index.html')) +test.must_exist(test.workpath('htmlhelp.hhp')) +test.must_exist(test.workpath('toc.hhc')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('output/index.html')) +test.must_not_exist(test.workpath('htmlhelp.hhp')) +test.must_not_exist(test.workpath('toc.hhc')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basedir/htmlhelp/image/SConstruct.cmd b/test/Docbook/basedir/htmlhelp/image/SConstruct.cmd new file mode 100644 index 0000000..8c7c9ca --- /dev/null +++ b/test/Docbook/basedir/htmlhelp/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookHtmlhelp('manual', xsl='htmlhelp.xsl', base_dir='output/') + diff --git a/test/Docbook/basedir/slideshtml/image/SConstruct.cmd b/test/Docbook/basedir/slideshtml/image/SConstruct.cmd new file mode 100644 index 0000000..297aeb5 --- /dev/null +++ b/test/Docbook/basedir/slideshtml/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookSlidesHtml('virt', xsl='slides.xsl', base_dir='output/') + diff --git a/test/Docbook/basedir/slideshtml/slideshtml_cmd.py b/test/Docbook/basedir/slideshtml/slideshtml_cmd.py new file mode 100644 index 0000000..51ed6e4 --- /dev/null +++ b/test/Docbook/basedir/slideshtml/slideshtml_cmd.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the base_dir argument for the Slides HTML builder while using +the xsltproc executable, if it exists. +""" + +import os +import sys +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not (xsltproc and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl/slides') and + os.path.isdir('/usr/share/xml/docbook/custom/slides/3.3.1')): + test.skip_test('No xsltproc or no "slides" stylesheets installed, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('output/index.html')) +test.must_exist(test.workpath('output/toc.html')) +test.must_exist(test.workpath('output/foil01.html')) +test.must_exist(test.workpath('output/foilgroup01.html')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('output/index.html')) +test.must_not_exist(test.workpath('output/toc.html')) +test.must_not_exist(test.workpath('output/foil01.html')) +test.must_not_exist(test.workpath('output/foilgroup01.html')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/html/html_cmd.py b/test/Docbook/basic/html/html_cmd.py new file mode 100644 index 0000000..acb4dad --- /dev/null +++ b/test/Docbook/basic/html/html_cmd.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the HTML builder while using +the xsltproc executable, if it exists. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not xsltproc: + test.skip_test('No xsltproc executable found, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd']) +test.must_exist(test.workpath('manual.html')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('manual.html')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/html/image/SConstruct.cmd b/test/Docbook/basic/html/image/SConstruct.cmd new file mode 100644 index 0000000..20b4aa2 --- /dev/null +++ b/test/Docbook/basic/html/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookHtml('manual') + diff --git a/test/Docbook/basic/htmlchunked/htmlchunked_cmd.py b/test/Docbook/basic/htmlchunked/htmlchunked_cmd.py new file mode 100644 index 0000000..e1ad49a --- /dev/null +++ b/test/Docbook/basic/htmlchunked/htmlchunked_cmd.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the chunked HTML builder while using +the xsltproc executable, if it exists. +""" + +import os +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not xsltproc: + test.skip_test('No xsltproc executable found, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('index.html')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('index.html')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/htmlchunked/image/SConstruct.cmd b/test/Docbook/basic/htmlchunked/image/SConstruct.cmd new file mode 100644 index 0000000..e2406f2 --- /dev/null +++ b/test/Docbook/basic/htmlchunked/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookHtmlChunked('manual') + diff --git a/test/Docbook/basic/htmlhelp/htmlhelp_cmd.py b/test/Docbook/basic/htmlhelp/htmlhelp_cmd.py new file mode 100644 index 0000000..8e1c1b6 --- /dev/null +++ b/test/Docbook/basic/htmlhelp/htmlhelp_cmd.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the HTMLHELP builder while using +the xsltproc executable, if it exists. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not xsltproc: + test.skip_test('No xsltproc executable found, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('index.html')) +test.must_exist(test.workpath('htmlhelp.hhp')) +test.must_exist(test.workpath('toc.hhc')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('index.html')) +test.must_not_exist(test.workpath('htmlhelp.hhp')) +test.must_not_exist(test.workpath('toc.hhc')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/htmlhelp/image/SConstruct.cmd b/test/Docbook/basic/htmlhelp/image/SConstruct.cmd new file mode 100644 index 0000000..29fb4fa --- /dev/null +++ b/test/Docbook/basic/htmlhelp/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookHtmlhelp('manual') + diff --git a/test/Docbook/basic/man/image/SConstruct.cmd b/test/Docbook/basic/man/image/SConstruct.cmd new file mode 100644 index 0000000..8b1406b --- /dev/null +++ b/test/Docbook/basic/man/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookMan('refdb') + diff --git a/test/Docbook/basic/man/man_cmd.py b/test/Docbook/basic/man/man_cmd.py new file mode 100644 index 0000000..f5127e3 --- /dev/null +++ b/test/Docbook/basic/man/man_cmd.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the Man builder while using +the xsltproc executable, if it exists. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not xsltproc: + test.skip_test('No xsltproc executable found, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('refdb.8')) +test.must_exist(test.workpath('refdb.sh.8')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('refdb.8')) +test.must_not_exist(test.workpath('refdb.sh.8')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/slideshtml/image/SConstruct.cmd b/test/Docbook/basic/slideshtml/image/SConstruct.cmd new file mode 100644 index 0000000..133cb11 --- /dev/null +++ b/test/Docbook/basic/slideshtml/image/SConstruct.cmd @@ -0,0 +1,3 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookSlidesHtml('virt') + diff --git a/test/Docbook/basic/slideshtml/slideshtml_cmd.py b/test/Docbook/basic/slideshtml/slideshtml_cmd.py new file mode 100644 index 0000000..ce5c30b --- /dev/null +++ b/test/Docbook/basic/slideshtml/slideshtml_cmd.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the Slides HTML builder while using +the xsltproc executable, if it exists. +""" + +import os +import sys +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not (xsltproc and + os.path.isdir('/usr/share/xml/docbook/stylesheet/docbook-xsl/slides') and + os.path.isdir('/usr/share/xml/docbook/custom/slides/3.3.1')): + test.skip_test('No xsltproc executable or no "slides" stylesheets installed, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('index.html')) +test.must_exist(test.workpath('toc.html')) +test.must_exist(test.workpath('foil01.html')) +test.must_exist(test.workpath('foilgroup01.html')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('index.html')) +test.must_not_exist(test.workpath('toc.html')) +test.must_not_exist(test.workpath('foil01.html')) +test.must_not_exist(test.workpath('foilgroup01.html')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From a9edc15a5ac66ba8794e66e8e9c0a1f926009220 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sat, 21 Dec 2013 01:24:25 +0100 Subject: - added EPUB Builder to the DocBook Tool, based on the work of Andrew Featherstone --- doc/generated/builders.gen | 26 ++ doc/generated/builders.mod | 4 + doc/generated/functions.gen | 22 ++ doc/generated/functions.mod | 4 + doc/generated/tools.gen | 5 +- doc/generated/variables.gen | 9 + doc/generated/variables.mod | 2 + doc/man/SConstruct | 11 +- doc/user/SConstruct | 11 +- src/CHANGES.txt | 3 + src/engine/SCons/Tool/docbook/__init__.py | 135 +++++++++- src/engine/SCons/Tool/docbook/__init__.xml | 34 ++- test/Docbook/basic/epub/epub.py | 62 +++++ test/Docbook/basic/epub/image/SConstruct | 2 + test/Docbook/basic/epub/image/manual.xml | 388 +++++++++++++++++++++++++++++ 15 files changed, 688 insertions(+), 30 deletions(-) create mode 100644 test/Docbook/basic/epub/epub.py create mode 100644 test/Docbook/basic/epub/image/SConstruct create mode 100644 test/Docbook/basic/epub/image/manual.xml diff --git a/doc/generated/builders.gen b/doc/generated/builders.gen index 5cd92f2..41239d4 100644 --- a/doc/generated/builders.gen +++ b/doc/generated/builders.gen @@ -84,6 +84,32 @@ env.CXXFile(target = 'bar', source = 'bar.yy') + + + DocbookEpub() + + + env.DocbookEpub() + + + +A pseudo-Builder, providing a Docbook toolchain for EPUB output. + + +env = Environment(tools=['docbook']) +env.DocbookEpub('manual.epub', 'manual.xml') + + + +or simply + + +env = Environment(tools=['docbook']) +env.DocbookEpub('manual') + + + + DocbookHtml() diff --git a/doc/generated/builders.mod b/doc/generated/builders.mod index b8c7d80..50591b4 100644 --- a/doc/generated/builders.mod +++ b/doc/generated/builders.mod @@ -11,6 +11,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. CFile"> Command"> CXXFile"> +DocbookEpub"> DocbookHtml"> DocbookHtmlChunked"> DocbookHtmlhelp"> @@ -65,6 +66,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.CFile"> env.Command"> env.CXXFile"> +env.DocbookEpub"> env.DocbookHtml"> env.DocbookHtmlChunked"> env.DocbookHtmlhelp"> @@ -129,6 +131,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. CFile"> Command"> CXXFile"> +DocbookEpub"> DocbookHtml"> DocbookHtmlChunked"> DocbookHtmlhelp"> @@ -183,6 +186,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.CFile"> env.Command"> env.CXXFile"> +env.DocbookEpub"> env.DocbookHtml"> env.DocbookHtmlChunked"> env.DocbookHtmlhelp"> diff --git a/doc/generated/functions.gen b/doc/generated/functions.gen index 4849ac6..072b91c 100644 --- a/doc/generated/functions.gen +++ b/doc/generated/functions.gen @@ -3419,6 +3419,28 @@ Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5) + + + Pseudo(target, ...) + + + env.Pseudo(target, ...) + + + +This indicates that each given +target +should not be created by the build rule, and if the target is created, +an error will be generated. This is similar to the gnu make .PHONY +target. However, in the vast majority of cases, an +Alias +is more appropriate. + +Multiple targets can be passed in to a single call to +Pseudo. + + + env.RCS() diff --git a/doc/generated/functions.mod b/doc/generated/functions.mod index 0f5dd21..99aaa48 100644 --- a/doc/generated/functions.mod +++ b/doc/generated/functions.mod @@ -71,6 +71,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. PrependENVPath"> PrependUnique"> Progress"> +Pseudo"> RCS"> Replace"> Repository"> @@ -158,6 +159,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.PrependENVPath"> env.PrependUnique"> env.Progress"> +env.Pseudo"> env.RCS"> env.Replace"> env.Repository"> @@ -255,6 +257,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. PrependENVPath"> PrependUnique"> Progress"> +Pseudo"> RCS"> Replace"> Repository"> @@ -342,6 +345,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. env.PrependENVPath"> env.PrependUnique"> env.Progress"> +env.Pseudo"> env.RCS"> env.Replace"> env.Repository"> diff --git a/doc/generated/tools.gen b/doc/generated/tools.gen index 7d75638..a0a709e 100644 --- a/doc/generated/tools.gen +++ b/doc/generated/tools.gen @@ -222,7 +222,7 @@ accordingly. The rules given above are valid for the Builders DocbookHtml, -DocbookPdf, DocbookSlidesPdf and DocbookXInclude. For the +DocbookPdf, DocbookEpub, DocbookSlidesPdf and DocbookXInclude. For the DocbookMan transformation you can specify a target name, but the actual output names are automatically set from the refname entries in your XML source. @@ -261,6 +261,7 @@ variables for setting the default XSL name is provided. These are: DOCBOOK_DEFAULT_XSL_HTMLCHUNKED DOCBOOK_DEFAULT_XSL_HTMLHELP DOCBOOK_DEFAULT_XSL_PDF +DOCBOOK_DEFAULT_XSL_EPUB DOCBOOK_DEFAULT_XSL_MAN DOCBOOK_DEFAULT_XSL_SLIDESPDF DOCBOOK_DEFAULT_XSL_SLIDESHTML @@ -272,7 +273,7 @@ DOCBOOK_DEFAULT_XSL_SLIDESHTML DOCBOOK_DEFAULT_XSL_PDF='pdf.xsl') env.DocbookHtml('manual') # now uses html.xsl -Sets: &cv-link-DOCBOOK_DEFAULT_XSL_HTML;, &cv-link-DOCBOOK_DEFAULT_XSL_HTMLCHUNKED;, &cv-link-DOCBOOK_DEFAULT_XSL_HTMLHELP;, &cv-link-DOCBOOK_DEFAULT_XSL_MAN;, &cv-link-DOCBOOK_DEFAULT_XSL_PDF;, &cv-link-DOCBOOK_DEFAULT_XSL_SLIDESHTML;, &cv-link-DOCBOOK_DEFAULT_XSL_SLIDESPDF;, &cv-link-DOCBOOK_FOP;, &cv-link-DOCBOOK_FOPCOM;, &cv-link-DOCBOOK_FOPFLAGS;, &cv-link-DOCBOOK_XMLLINT;, &cv-link-DOCBOOK_XMLLINTCOM;, &cv-link-DOCBOOK_XMLLINTFLAGS;, &cv-link-DOCBOOK_XSLTPROC;, &cv-link-DOCBOOK_XSLTPROCCOM;, &cv-link-DOCBOOK_XSLTPROCFLAGS;, &cv-link-DOCBOOK_XSLTPROCPARAMS;.Uses: &cv-link-DOCBOOK_FOPCOMSTR;, &cv-link-DOCBOOK_XMLLINTCOMSTR;, &cv-link-DOCBOOK_XSLTPROCCOMSTR;. +Sets: &cv-link-DOCBOOK_DEFAULT_XSL_EPUB;, &cv-link-DOCBOOK_DEFAULT_XSL_HTML;, &cv-link-DOCBOOK_DEFAULT_XSL_HTMLCHUNKED;, &cv-link-DOCBOOK_DEFAULT_XSL_HTMLHELP;, &cv-link-DOCBOOK_DEFAULT_XSL_MAN;, &cv-link-DOCBOOK_DEFAULT_XSL_PDF;, &cv-link-DOCBOOK_DEFAULT_XSL_SLIDESHTML;, &cv-link-DOCBOOK_DEFAULT_XSL_SLIDESPDF;, &cv-link-DOCBOOK_FOP;, &cv-link-DOCBOOK_FOPCOM;, &cv-link-DOCBOOK_FOPFLAGS;, &cv-link-DOCBOOK_XMLLINT;, &cv-link-DOCBOOK_XMLLINTCOM;, &cv-link-DOCBOOK_XMLLINTFLAGS;, &cv-link-DOCBOOK_XSLTPROC;, &cv-link-DOCBOOK_XSLTPROCCOM;, &cv-link-DOCBOOK_XSLTPROCFLAGS;, &cv-link-DOCBOOK_XSLTPROCPARAMS;.Uses: &cv-link-DOCBOOK_FOPCOMSTR;, &cv-link-DOCBOOK_XMLLINTCOMSTR;, &cv-link-DOCBOOK_XSLTPROCCOMSTR;. dvi diff --git a/doc/generated/variables.gen b/doc/generated/variables.gen index ee5a0dd..efdac8e 100644 --- a/doc/generated/variables.gen +++ b/doc/generated/variables.gen @@ -909,6 +909,15 @@ into a list of Dir instances relative to the target being built. + + DOCBOOK_DEFAULT_XSL_EPUB + + +The default XSLT file for the DocbookEpub builder within the +current environment, if no other XSLT gets specified via keyword. + + + DOCBOOK_DEFAULT_XSL_HTML diff --git a/doc/generated/variables.mod b/doc/generated/variables.mod index 8a898ec..b55b218 100644 --- a/doc/generated/variables.mod +++ b/doc/generated/variables.mod @@ -70,6 +70,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. $DESCRIPTION_lang"> $Dir"> $Dirs"> +$DOCBOOK_DEFAULT_XSL_EPUB"> $DOCBOOK_DEFAULT_XSL_HTML"> $DOCBOOK_DEFAULT_XSL_HTMLCHUNKED"> $DOCBOOK_DEFAULT_XSL_HTMLHELP"> @@ -651,6 +652,7 @@ THIS IS AN AUTOMATICALLY-GENERATED FILE. DO NOT EDIT. $DESCRIPTION_lang"> $Dir"> $Dirs"> +$DOCBOOK_DEFAULT_XSL_EPUB"> $DOCBOOK_DEFAULT_XSL_HTML"> $DOCBOOK_DEFAULT_XSL_HTMLCHUNKED"> $DOCBOOK_DEFAULT_XSL_HTMLHELP"> diff --git a/doc/man/SConstruct b/doc/man/SConstruct index cfdbb2d..927bfa2 100644 --- a/doc/man/SConstruct +++ b/doc/man/SConstruct @@ -62,14 +62,7 @@ if env.WhereIs('gs'): # Create the EPUB format # if has_gs and has_pdf: - metainf = env.Command('META-INF','',[Mkdir('META-INF'), Mkdir('OEBPS')]) - css = env.Command('OEBPS/epub.css','epub.css',[Copy('OEBPS/epub.css','epub.css')]) - env.Depends(css, metainf) jpg = env.Gs('OEBPS/cover.jpg','scons-scons.pdf', GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -dJPEGQ=100 -r72x72 -q') - env.Depends(jpg, metainf) - oebps = env.DocbookXslt('OEBPS/toc.ncx', 'scons_db.xml', xsl='epub.xsl') - env.Depends(oebps, jpg) - env.Zip('scons-man.epub', 'OEBPS', ZIPFLAGS='-Xr9D') - env.Clean(oebps, Glob('OEBPS/*.*')) - env.Clean(oebps, Glob('META-INF/*.*')) + epub = env.DocbookEpub('scons-man.epub', 'scons_db.xml', xsl='epub.xsl') + env.Depends(epub, jpg) diff --git a/doc/user/SConstruct b/doc/user/SConstruct index 5d36a5e..701fb7b 100644 --- a/doc/user/SConstruct +++ b/doc/user/SConstruct @@ -60,14 +60,7 @@ if env.WhereIs('gs'): # Create the EPUB format # if has_gs and has_pdf: - metainf = env.Command('META-INF','',[Mkdir('META-INF'), Mkdir('OEBPS')]) - css = env.Command('OEBPS/epub.css','epub.css',[Copy('OEBPS/epub.css','epub.css')]) - env.Depends(css, metainf) jpg = env.Gs('OEBPS/cover.jpg','scons-user.pdf', GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -dJPEGQ=100 -r72x72 -q') - env.Depends(jpg, metainf) - oebps = env.DocbookXslt('OEBPS/toc.ncx', 'scons_db.xml', xsl='epub.xsl') - env.Depends(oebps, jpg) - env.Zip('scons-user.epub', 'OEBPS', ZIPFLAGS='-Xr9D') - env.Clean(oebps, Glob('OEBPS/*.*')) - env.Clean(oebps, Glob('META-INF/*.*')) + epub = env.DocbookEpub('scons-user.epub', 'scons_db.xml', xsl='epub.xsl') + env.Depends(epub, jpg) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 8b24696..10f940a 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,9 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Andrew Featherstone: + - Added support for EPUB output format to the DocBook tool. + From Tom Tanner: - Stop leaking file handles to subprocesses by switching to using subprocess always. diff --git a/src/engine/SCons/Tool/docbook/__init__.py b/src/engine/SCons/Tool/docbook/__init__.py index 1e88cfe..a336992 100644 --- a/src/engine/SCons/Tool/docbook/__init__.py +++ b/src/engine/SCons/Tool/docbook/__init__.py @@ -318,9 +318,14 @@ def __build_lxml(target, source, env): """ from lxml import etree + xslt_ac = etree.XSLTAccessControl(read_file=True, + write_file=True, + create_dir=True, + read_network=False, + write_network=False) xsl_style = env.subst('$DOCBOOK_XSL') xsl_tree = etree.parse(xsl_style) - transform = etree.XSLT(xsl_tree) + transform = etree.XSLT(xsl_tree, access_control=xslt_ac) doc = etree.parse(str(source[0])) # Support for additional parameters parampass = {} @@ -404,6 +409,116 @@ __fop_builder = SCons.Builder.Builder( src_suffix = '.fo', ensure_suffix=1) +def DocbookEpub(env, target, source=None, *args, **kw): + """ + A pseudo-Builder, providing a Docbook toolchain for ePub output. + """ + import zipfile + import shutil + from lxml import etree + + def build_open_container(target, source, env): + """Generate the *.epub file from intermediate outputs + + Constructs the epub file according to the Open Container Format. This + function could be replaced by a call to the SCons Zip builder if support + was added for different compression formats for separate source nodes. + """ + zf = zipfile.ZipFile(str(target[0]), 'w') + mime_file = open('mimetype', 'w') + mime_file.write('application/epub+zip') + mime_file.close() + zf.write(mime_file.name, compress_type = zipfile.ZIP_STORED) + for s in source: + for dirpath, dirnames, filenames in os.walk(str(s)): + for fname in filenames: + path = os.path.join(dirpath, fname) + if os.path.isfile(path): + zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))), + zipfile.ZIP_DEFLATED) + zf.close() + + def add_resources(target, source, env): + """Add missing resources to the OEBPS directory + + Ensure all the resources in the manifest are present in the OEBPS directory. + """ + hrefs = [] + content_file = os.path.join(source[0].abspath, 'content.opf') + if not os.path.isfile(content_file): + return + + hrefs = [] + if has_libxml2: + nsmap = {'opf' : 'http://www.idpf.org/2007/opf'} + # Read file and resolve entities + doc = libxml2.readFile(content_file, None, 0) + opf = doc.getRootElement() + # Create xpath context + xpath_context = doc.xpathNewContext() + # Register namespaces + for key, val in nsmap.iteritems(): + xpath_context.xpathRegisterNs(key, val) + + if hasattr(opf, 'xpathEval') and xpath_context: + # Use the xpath context + xpath_context.setContextNode(opf) + items = xpath_context.xpathEval(".//opf:item") + else: + items = opf.findall(".//{'http://www.idpf.org/2007/opf'}item") + + for item in items: + if hasattr(item, 'prop'): + hrefs.append(item.prop('href')) + else: + hrefs.append(item.attrib['href']) + + doc.freeDoc() + xpath_context.xpathFreeContext() + elif has_lxml: + from lxml import etree + + opf = etree.parse(content_file) + # All the opf:item elements are resources + for item in opf.xpath('//opf:item', + namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }): + hrefs.append(item.attrib['href']) + + for href in hrefs: + # If the resource was not already created by DocBook XSL itself, + # copy it into the OEBPS folder + referenced_file = os.path.join(source[0].abspath, href) + if not os.path.exists(referenced_file): + shutil.copy(href, os.path.join(source[0].abspath, href)) + + # Init list of targets/sources + target, source = __extend_targets_sources(target, source) + + # Init XSL stylesheet + __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_EPUB', ['epub','docbook.xsl']) + + # Setup builder + __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder) + + # Create targets + result = [] + tlist = ['OEBPS/toc.ncx', 'META-INF/container.xml'] + dirs = [SCons.Script.Dir('OEBPS'), SCons.Script.Dir('META-INF')] + r = __builder.__call__(env, tlist, source[0], **kw) + + env.Depends(r, kw['DOCBOOK_XSL']) + result.extend(r) + + container = env.Command(__ensure_suffix(str(target[0]), '.epub'), + tlist, [add_resources, build_open_container]) + + env.Depends(container, r) + result.extend(container) + # Add supporting files for cleanup + env.Clean(r, dirs + [SCons.Script.File('mimetype')]) + + return result + def DocbookHtml(env, target, source=None, *args, **kw): """ A pseudo-Builder, providing a Docbook toolchain for HTML output. @@ -686,19 +801,19 @@ def DocbookXslt(env, target, source=None, *args, **kw): return result - def generate(env): """Add Builders and construction variables for docbook to an Environment.""" env.SetDefault( # Default names for customized XSL stylesheets - DOCBOOK_DEFAULT_XSL_HTML = '', - DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '', - DOCBOOK_DEFAULT_XSL_HTMLHELP = '', - DOCBOOK_DEFAULT_XSL_PDF = '', - DOCBOOK_DEFAULT_XSL_MAN = '', - DOCBOOK_DEFAULT_XSL_SLIDESPDF = '', - DOCBOOK_DEFAULT_XSL_SLIDESHTML = '', + DOCBOOK_DEFAULT_XSL_EPUB = '', + DOCBOOK_DEFAULT_XSL_HTML = '', + DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '', + DOCBOOK_DEFAULT_XSL_HTMLHELP = '', + DOCBOOK_DEFAULT_XSL_PDF = '', + DOCBOOK_DEFAULT_XSL_MAN = '', + DOCBOOK_DEFAULT_XSL_SLIDESPDF = '', + DOCBOOK_DEFAULT_XSL_SLIDESHTML = '', # Paths to the detected executables DOCBOOK_XSLTPROC = '', @@ -725,6 +840,7 @@ def generate(env): _detect(env) try: + env.AddMethod(DocbookEpub, "DocbookEpub") env.AddMethod(DocbookHtml, "DocbookHtml") env.AddMethod(DocbookHtmlChunked, "DocbookHtmlChunked") env.AddMethod(DocbookHtmlhelp, "DocbookHtmlhelp") @@ -737,6 +853,7 @@ def generate(env): except AttributeError: # Looks like we use a pre-0.98 version of SCons... from SCons.Script.SConscript import SConsEnvironment + SConsEnvironment.DocbookEpub = DocbookEpub SConsEnvironment.DocbookHtml = DocbookHtml SConsEnvironment.DocbookHtmlChunked = DocbookHtmlChunked SConsEnvironment.DocbookHtmlhelp = DocbookHtmlhelp diff --git a/src/engine/SCons/Tool/docbook/__init__.xml b/src/engine/SCons/Tool/docbook/__init__.xml index be2f2ca..0748738 100644 --- a/src/engine/SCons/Tool/docbook/__init__.xml +++ b/src/engine/SCons/Tool/docbook/__init__.xml @@ -97,7 +97,7 @@ accordingly. The rules given above are valid for the Builders &b-link-DocbookHtml;, -&b-link-DocbookPdf;, &b-link-DocbookSlidesPdf; and &b-link-DocbookXInclude;. For the +&b-link-DocbookPdf;, &b-link-DocbookEpub;, &b-link-DocbookSlidesPdf; and &b-link-DocbookXInclude;. For the &b-link-DocbookMan; transformation you can specify a target name, but the actual output names are automatically set from the refname entries in your XML source. @@ -136,6 +136,7 @@ variables for setting the default XSL name is provided. These are: DOCBOOK_DEFAULT_XSL_HTMLCHUNKED DOCBOOK_DEFAULT_XSL_HTMLHELP DOCBOOK_DEFAULT_XSL_PDF +DOCBOOK_DEFAULT_XSL_EPUB DOCBOOK_DEFAULT_XSL_MAN DOCBOOK_DEFAULT_XSL_SLIDESPDF DOCBOOK_DEFAULT_XSL_SLIDESHTML @@ -153,6 +154,7 @@ env.DocbookHtml('manual') # now uses html.xsl DOCBOOK_DEFAULT_XSL_HTMLCHUNKED DOCBOOK_DEFAULT_XSL_HTMLHELP DOCBOOK_DEFAULT_XSL_PDF +DOCBOOK_DEFAULT_XSL_EPUB DOCBOOK_DEFAULT_XSL_MAN DOCBOOK_DEFAULT_XSL_SLIDESPDF DOCBOOK_DEFAULT_XSL_SLIDESHTML @@ -212,6 +214,15 @@ current environment, if no other XSLT gets specified via keyword. + + + +The default XSLT file for the &b-link-DocbookEpub; builder within the +current environment, if no other XSLT gets specified via keyword. + + + + @@ -473,6 +484,27 @@ env.DocbookPdf('manual') + + + +A pseudo-Builder, providing a Docbook toolchain for EPUB output. + + +env = Environment(tools=['docbook']) +env.DocbookEpub('manual.epub', 'manual.xml') + + + +or simply + + +env = Environment(tools=['docbook']) +env.DocbookEpub('manual') + + + + + diff --git a/test/Docbook/basic/epub/epub.py b/test/Docbook/basic/epub/epub.py new file mode 100644 index 0000000..c819dd7 --- /dev/null +++ b/test/Docbook/basic/epub/epub.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the EPUB builder. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +try: + import libxml2 +except: + try: + import lxml + except: + test.skip_test('Cannot find installed Python binding for libxml2 or lxml, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run() +test.must_exist(test.workpath('manual.epub')) +test.must_exist(test.workpath('OEBPS','toc.ncx')) +test.must_exist(test.workpath('OEBPS','content.opf')) +test.must_exist(test.workpath('META-INF','container.xml')) + +# Cleanup +test.run(arguments='-c') +test.must_not_exist(test.workpath('manual.epub')) +test.must_not_exist(test.workpath('OEBPS')) +test.must_not_exist(test.workpath('META-INF')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/epub/image/SConstruct b/test/Docbook/basic/epub/image/SConstruct new file mode 100644 index 0000000..16a0699 --- /dev/null +++ b/test/Docbook/basic/epub/image/SConstruct @@ -0,0 +1,2 @@ +env = Environment(tools=['docbook']) +env.DocbookEpub('manual') diff --git a/test/Docbook/basic/epub/image/manual.xml b/test/Docbook/basic/epub/image/manual.xml new file mode 100644 index 0000000..ca12e0e --- /dev/null +++ b/test/Docbook/basic/epub/image/manual.xml @@ -0,0 +1,388 @@ + + + +
+ The SCons qt4 tool + + + + Dirk Baechle + + + 2010-12-06 + + +
+ Basics + + This tool can be used to compile Qt projects, designed for versions + 4.x.y and higher. It is not usable for Qt3 and older versions, since some + of the helper tools (moc, uic) + behave different. + +
+ Install + + Installing it, requires you to copy (or, even better: checkout) + the contents of the package's qt4 folder to + + + + /path_to_your_project/site_scons/site_tools/qt4, + if you need the Qt4 Tool in one project only, or + + + + ~/.scons/site_scons/site_tools/qt4, + for a system-wide installation under your current login. + + + + For more infos about this, please refer to + + + + the SCons User's Guide, chap. 17.7 "Where to put your custom + Builders and Tools" and + + + + the SCons Tools Wiki page at http://scons.org/wiki/ToolsIndex. + + +
+ +
+ How to activate + + For activating the tool "qt4", you have to add its name to the + Environment constructor, like this + + env = Environment(tools=['default','qt4']) + + + On its startup, the Qt4 tool tries to read the variable + QT4DIR from the current Environment and + os.environ. If it is not set, the value of + QTDIR (in Environment/os.environ) + is used as a fallback. + + So, you either have to explicitly give the path of your Qt4 + installation to the Environment with + + env['QT4DIR'] = '/usr/local/Trolltech/Qt-4.2.3' + + + or set the QT4DIR as environment variable in + your shell. +
+ +
+ Requirements + + Under Linux, "qt4" uses the system tool + pkg-config for automatically setting the required + compile and link flags of the single Qt4 modules (like QtCore, + QtGui,...). This means that + + + + you should have pkg-config installed, + and + + + + you additionally have to set + PKG_CONFIG_PATH in your shell environment, such + that it points to $QT4DIR/lib/pkgconfig (or + $QT4DIR/lib for some older versions). + + + + Based on these two environment variables + (QT4DIR and PKG_CONFIG_PATH), the + "qt4" tool initializes all QT4_* construction + variables listed in the Reference manual. This happens when the tool is + "detected" during Environment construction. As a consequence, the setup + of the tool gets a two-stage process, if you want to override the values + provided by your current shell settings: + + # Stage 1: create plain environment +qtEnv = Environment() +# Set new vars +qtEnv['QT4DIR'] = '/usr/local/Trolltech/Qt-4.2.3 +qtEnv['ENV']['PKG_CONFIG_PATH'] = '/usr/local/Trolltech/Qt-4.2.3/lib/pkgconfig' +# Stage 2: add qt4 tool +qtEnv.Tool('qt4') + +
+
+ +
+ Suggested boilerplate + + Based on the requirements above, we suggest a simple ready-to-go + setup as follows: + + SConstruct + + # Detect Qt version +qtdir = detectLatestQtDir() + +# Create base environment +baseEnv = Environment() +#...further customization of base env + +# Clone Qt environment +qtEnv = baseEnv.Clone() +# Set QT4DIR and PKG_CONFIG_PATH +qtEnv['ENV']['PKG_CONFIG_PATH'] = os.path.join(qtdir, 'lib/pkgconfig') +qtEnv['QT4DIR'] = qtdir +# Add qt4 tool +qtEnv.Tool('qt4') +#...further customization of qt env + +# Export environments +Export('baseEnv qtEnv') + +# Your other stuff... +# ...including the call to your SConscripts + + + In a SConscript + + # Get the Qt4 environment +Import('qtEnv') +# Clone it +env = qtEnv.clone() +# Patch it +env.Append(CCFLAGS=['-m32']) # or whatever +# Use it +env.StaticLibrary('foo', Glob('*.cpp')) + + + The detection of the Qt directory could be as simple as directly + assigning a fixed path + + def detectLatestQtDir(): + return "/usr/local/qt4.3.2" + + + or a little more sophisticated + + # Tries to detect the path to the installation of Qt with +# the highest version number +def detectLatestQtDir(): + if sys.platform.startswith("linux"): + # Simple check: inspect only '/usr/local/Trolltech' + paths = glob.glob('/usr/local/Trolltech/*') + if len(paths): + paths.sort() + return paths[-1] + else: + return "" + else: + # Simple check: inspect only 'C:\Qt' + paths = glob.glob('C:\\Qt\\*') + if len(paths): + paths.sort() + return paths[-1] + else: + return os.environ.get("QTDIR","") + +
+ +
+ A first project + + The following SConscript is for a simple project with some cxx + files, using the QtCore, QtGui and QtNetwork modules: + + Import('qtEnv') +env = qtEnv.Clone() +env.EnableQt4Modules([ + 'QtGui', + 'QtCore', + 'QtNetwork' + ]) +# Add your CCFLAGS and CPPPATHs to env here... + +env.Program('foo', Glob('*.cpp')) + +
+ +
+ MOC it up + + For the basic support of automocing, nothing needs to be done by the + user. The tool usually detects the Q_OBJECT macro and + calls the moc executable + accordingly. + + If you don't want this, you can switch off the automocing by + a + + env['QT4_AUTOSCAN'] = 0 + + + in your SConscript file. Then, you have to moc your files + explicitly, using the Moc4 builder. + + You can also switch to an extended automoc strategy with + + env['QT4_AUTOSCAN_STRATEGY'] = 1 + + + Please read the description of the + QT4_AUTOSCAN_STRATEGY variable in the Reference manual + for details. + + For debugging purposes, you can set the variable + QT4_DEBUG with + + env['QT4_DEBUG'] = 1 + + + which outputs a lot of messages during automocing. +
+ +
+ Forms (.ui) + + The header files with setup code for your GUI classes, are not + compiled automatically from your .ui files. You always + have to call the Uic4 builder explicitly like + + env.Uic4(Glob('*.ui')) +env.Program('foo', Glob('*.cpp')) + +
+ +
+ Resource files (.qrc) + + Resource files are not built automatically, you always have to add + the names of the .qrc files to the source list for your + program or library: + + env.Program('foo', Glob('*.cpp')+Glob('*.qrc')) + + + For each of the Resource input files, its prefix defines the name of + the resulting resource. An appropriate + -name option is added to the call of the + rcc executable by default. + + You can also call the Qrc4 builder explicitly as + + qrccc = env.Qrc4('foo') # ['foo.qrc'] -> ['qrc_foo.cc'] + + + or (overriding the default suffix) + + qrccc = env.Qrc4('myprefix_foo.cxx','foo.qrc') # -> ['qrc_myprefix_foo.cxx'] + + + and then add the resulting cxx file to the sources of your + Program/Library: + + env.Program('foo', Glob('*.cpp') + qrccc) + +
+ +
+ Translation files + + The update of the .ts files and the conversion to + binary .qm files is not done automatically. You have to + call the corresponding builders on your own. + + Example for updating a translation file: + + env.Ts4('foo.ts','.') # -> ['foo.ts'] + + + By default, the .ts files are treated as + precious targets. This means that they are not + removed prior to a rebuild, but simply get updated. Additionally, they do + not get cleaned on a scons -c. If you + want to delete the translation files on the + -c SCons command, you can set the + variable QT4_CLEAN_TS like this + + env['QT4_CLEAN_TS']=1 + + + Example for releasing a translation file, i.e. compiling it to a + .qm binary file: + + env.Qm4('foo') # ['foo.ts'] -> ['foo.qm'] + + + or (overriding the output prefix) + + env.Qm4('myprefix','foo') # ['foo.ts'] -> ['myprefix.qm'] + + + As an extension both, the Ts4() and Qm4 builder, support the + definition of multiple targets. So, calling + + env.Ts4(['app_en','app_de'], Glob('*.cpp')) + + + and + + env.Qm4(['app','copy'], Glob('*.ts')) + + + should work fine. + + Finally, two short notes about the support of directories for the + Ts4() builder. You can pass an arbitrary mix of cxx files and subdirs to + it, as in + + env.Ts4('app_en',['sub1','appwindow.cpp','main.cpp'])) + + + where sub1 is a folder that gets scanned + recursively for cxx files by lupdate. But like this, + you lose all dependency information for the subdir, i.e. if a file inside + the folder changes, the .ts file is not updated automatically! In this + case you should tell SCons to always update the target: + + ts = env.Ts4('app_en',['sub1','appwindow.cpp','main.cpp']) +env.AlwaysBuild(ts) + + + Last note: specifying the current folder + . as input to Ts4() and storing the + resulting .ts file in the same directory, leads to a dependency cycle! You + then have to store the .ts and .qm files outside of the current folder, or + use Glob('*.cpp')) instead. +
+
-- cgit v0.12 From ea7ee956f90e6a48aeb88a7952ac19e6fd0a6606 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sat, 21 Dec 2013 01:30:25 +0100 Subject: - removed superfluous import and corrected basic test --- src/engine/SCons/Tool/docbook/__init__.py | 1 - test/Docbook/basic/epub/epub.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/engine/SCons/Tool/docbook/__init__.py b/src/engine/SCons/Tool/docbook/__init__.py index a336992..d14d60b 100644 --- a/src/engine/SCons/Tool/docbook/__init__.py +++ b/src/engine/SCons/Tool/docbook/__init__.py @@ -415,7 +415,6 @@ def DocbookEpub(env, target, source=None, *args, **kw): """ import zipfile import shutil - from lxml import etree def build_open_container(target, source, env): """Generate the *.epub file from intermediate outputs diff --git a/test/Docbook/basic/epub/epub.py b/test/Docbook/basic/epub/epub.py index c819dd7..19e08a0 100644 --- a/test/Docbook/basic/epub/epub.py +++ b/test/Docbook/basic/epub/epub.py @@ -41,7 +41,7 @@ except: test.dir_fixture('image') # Normal invocation -test.run() +test.run(stderr=None) test.must_exist(test.workpath('manual.epub')) test.must_exist(test.workpath('OEBPS','toc.ncx')) test.must_exist(test.workpath('OEBPS','content.opf')) -- cgit v0.12 From f2b2382afc1109ee192a6d8eb310b3dc2a41807e Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Fri, 27 Dec 2013 11:32:44 -0500 Subject: update-release-info: fixed date updating for doc/user/main.xml. Also added note that doc/user/main.in is no longer needed/used and prevent that from stopping the doc gen process. --- bin/update-release-info.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/bin/update-release-info.py b/bin/update-release-info.py index 338bba9..14894a4 100644 --- a/bin/update-release-info.py +++ b/bin/update-release-info.py @@ -333,17 +333,18 @@ t.replace_assign('deprecated_python_version', str(deprecated_version)) # Update doc/user/main.{in,xml} docyears = ', '.join(map(str, iter(range(2004, release_date[0] + 1)))) -t = UpdateFile(os.path.join('doc', 'user', 'main.in')) -if DEBUG: t.file = '/tmp/main.in' -## TODO debug these -#t.sub('[^<]*', '' + docyears + '') -#t.sub('[^<]*', '' + docyears + '') +if os.path.exists(os.path.join('doc', 'user', 'main.in')): + # this is no longer used as of Dec 2013 + t = UpdateFile(os.path.join('doc', 'user', 'main.in')) + if DEBUG: t.file = '/tmp/main.in' + ## TODO debug these + #t.sub('[^<]*', '' + docyears + '') + #t.sub('[^<]*', '' + docyears + '') t = UpdateFile(os.path.join('doc', 'user', 'main.xml')) if DEBUG: t.file = '/tmp/main.xml' -## TODO debug these -#t.sub('[^<]*', '' + docyears + '') -#t.sub('[^<]*', '' + docyears + '') +t.sub('[^<]*', '' + docyears + '') +t.sub('[^<]*', '' + docyears + '') # Write out the last update -- cgit v0.12 From 06767e6e374c88a1e840459845bd30db48e95376 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Fri, 27 Dec 2013 11:35:52 -0500 Subject: release process: Fix deb filename to agree with what's actually generated. --- SConstruct | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index f289947..3f4d703 100644 --- a/SConstruct +++ b/SConstruct @@ -1039,7 +1039,10 @@ for p in [ scons ]: if dh_builddeb and fakeroot: # Our Debian packaging builds directly into build/dist, # so we don't need to Install() the .debs. - deb = os.path.join(build_dir, 'dist', "%s_%s_all.deb" % (pkg, version)) + # The built deb is called just x.y.z, not x.y.z.final.0 so strip those off: + deb_version = '.'.join(version.split('.')[0:3]) + deb = os.path.join(build_dir, 'dist', "%s_%s_all.deb" % (pkg, deb_version)) + # print "Building deb into %s (version=%s)"%(deb, deb_version) for d in p['debian_deps']: b = env.SCons_revision(os.path.join(build, d), d) env.Depends(deb, b) -- cgit v0.12 From 8a2bb84c2c11449ec5a9e49fc4e9777655978854 Mon Sep 17 00:00:00 2001 From: Gary Oberbrunner Date: Fri, 3 Jan 2014 14:42:07 -0500 Subject: Fix Intel compiler setup on Windows (it still needs VS1x0COMNTOOLS) --- src/engine/SCons/Tool/MSCommon/common.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/engine/SCons/Tool/MSCommon/common.py b/src/engine/SCons/Tool/MSCommon/common.py index caf2b37..ccfe739 100644 --- a/src/engine/SCons/Tool/MSCommon/common.py +++ b/src/engine/SCons/Tool/MSCommon/common.py @@ -146,9 +146,11 @@ def get_output(vcbat, args = None, env = None): # settings in vs.py. vars = [ 'COMSPEC', -# Still set, but setup script will discard these if registry has values. -# 'VS110COMNTOOLS', -# 'VS100COMNTOOLS', +# VS100 and VS110: Still set, but modern MSVC setup scripts will +# discard these if registry has values. However Intel compiler setup +# script still requires these as of 2013/2014. + 'VS110COMNTOOLS', + 'VS100COMNTOOLS', 'VS90COMNTOOLS', 'VS80COMNTOOLS', 'VS71COMNTOOLS', -- cgit v0.12 From cb44210566c28d16c1e2c91d898306ad539fa9f5 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Sun, 5 Jan 2014 13:27:10 +0100 Subject: - corrected dependencies for EPUB builder (docbook) - added a proper test for EPUB with xsltproc --- src/engine/SCons/Tool/docbook/__init__.py | 27 ++++++++----- test/Docbook/basic/epub/epub_cmd.py | 59 ++++++++++++++++++++++++++++ test/Docbook/basic/epub/image/SConstruct.cmd | 2 + 3 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 test/Docbook/basic/epub/epub_cmd.py create mode 100644 test/Docbook/basic/epub/image/SConstruct.cmd diff --git a/src/engine/SCons/Tool/docbook/__init__.py b/src/engine/SCons/Tool/docbook/__init__.py index d14d60b..72ea175 100644 --- a/src/engine/SCons/Tool/docbook/__init__.py +++ b/src/engine/SCons/Tool/docbook/__init__.py @@ -501,20 +501,29 @@ def DocbookEpub(env, target, source=None, *args, **kw): # Create targets result = [] - tlist = ['OEBPS/toc.ncx', 'META-INF/container.xml'] - dirs = [SCons.Script.Dir('OEBPS'), SCons.Script.Dir('META-INF')] - r = __builder.__call__(env, tlist, source[0], **kw) + if not env.GetOption('clean'): + # Ensure that the folders OEBPS and META-INF exist + __create_output_dir('OEBPS/') + __create_output_dir('META-INF/') + dirs = env.Dir(['OEBPS', 'META-INF']) - env.Depends(r, kw['DOCBOOK_XSL']) - result.extend(r) + # Set the fixed base_dir + kw['base_dir'] = 'OEBPS/' + tocncx = __builder.__call__(env, 'toc.ncx', source[0], **kw) + cxml = env.File('META-INF/container.xml') + env.SideEffect(cxml, tocncx) + + env.Depends(tocncx, kw['DOCBOOK_XSL']) + result.extend(tocncx+[cxml]) container = env.Command(__ensure_suffix(str(target[0]), '.epub'), - tlist, [add_resources, build_open_container]) - - env.Depends(container, r) + tocncx+[cxml], [add_resources, build_open_container]) + mimetype = env.File('mimetype') + env.SideEffect(mimetype, container) + result.extend(container) # Add supporting files for cleanup - env.Clean(r, dirs + [SCons.Script.File('mimetype')]) + env.Clean(tocncx, dirs) return result diff --git a/test/Docbook/basic/epub/epub_cmd.py b/test/Docbook/basic/epub/epub_cmd.py new file mode 100644 index 0000000..b79d185 --- /dev/null +++ b/test/Docbook/basic/epub/epub_cmd.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (c) 2001-2010 The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +""" +Test the EPUB builder while using +the xsltproc executable, if it exists. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +xsltproc = test.where_is('xsltproc') +if not xsltproc: + test.skip_test('No xsltproc executable found, skipping test.\n') + +test.dir_fixture('image') + +# Normal invocation +test.run(arguments=['-f','SConstruct.cmd'], stderr=None) +test.must_exist(test.workpath('manual.epub')) +test.must_exist(test.workpath('OEBPS','toc.ncx')) +test.must_exist(test.workpath('OEBPS','content.opf')) +test.must_exist(test.workpath('META-INF','container.xml')) + +# Cleanup +test.run(arguments=['-f','SConstruct.cmd','-c']) +test.must_not_exist(test.workpath('manual.epub')) +test.must_not_exist(test.workpath('OEBPS')) +test.must_not_exist(test.workpath('META-INF')) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/Docbook/basic/epub/image/SConstruct.cmd b/test/Docbook/basic/epub/image/SConstruct.cmd new file mode 100644 index 0000000..27cf2c8 --- /dev/null +++ b/test/Docbook/basic/epub/image/SConstruct.cmd @@ -0,0 +1,2 @@ +env = Environment(DOCBOOK_PREFER_XSLTPROC=1, tools=['docbook']) +env.DocbookEpub('manual') -- cgit v0.12