From 3bd4a30ca14e0cea712e01efa4df761e6c7bc608 Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Sat, 5 Nov 2005 05:56:44 +0000 Subject: Add support for a $INSTALLSTR string. (Christoph Schulz) --- doc/man/scons.1 | 8 +++ src/CHANGES.txt | 2 + src/engine/SCons/Defaults.py | 1 + src/engine/SCons/Environment.py | 2 +- test/Install.py | 138 ---------------------------------------- test/Install/INSTALLSTR.py | 52 +++++++++++++++ test/Install/Install.py | 138 ++++++++++++++++++++++++++++++++++++++++ test/Install/InstallAs.py | 68 ++++++++++++++++++++ test/InstallAs.py | 68 -------------------- 9 files changed, 270 insertions(+), 207 deletions(-) delete mode 100644 test/Install.py create mode 100644 test/Install/INSTALLSTR.py create mode 100644 test/Install/Install.py create mode 100644 test/Install/InstallAs.py delete mode 100644 test/InstallAs.py diff --git a/doc/man/scons.1 b/doc/man/scons.1 index 47a89ce..aed9e05 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -6072,6 +6072,14 @@ is the construction environment (a dictionary of construction values) in force for this file installation. +.IP INSTALLSTR +The string displayed when a file is +installed into a destination file name. +The default is: +.ES +Install file: "$SOURCE" as "$TARGET" +.EE + .IP INTEL_C_COMPILER_VERSION Set by the "intelc" Tool to the major version number of the Intel C compiler diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 677b09b..38a0476 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -665,6 +665,8 @@ RELEASE 0.97 - XXX - Add support for $CONFIGUREDIR and $CONFIGURELOG variables to control the directory and logs for configuration tests. + - Add support for a $INSTALLSTR variable. + From Craig Scott: - Have the Fortran module emitter look for Fortan modules to be created diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py index 4fe8987..b7453d6 100644 --- a/src/engine/SCons/Defaults.py +++ b/src/engine/SCons/Defaults.py @@ -347,6 +347,7 @@ ConstructionEnvironment = { 'SCANNERS' : [], 'CONFIGUREDIR' : '#/.sconf_temp', 'CONFIGURELOG' : '#/config.log', + 'INSTALLSTR' : 'Install file: "$SOURCE" as "$TARGET"', 'CPPSUFFIXES' : SCons.Tool.CSuffixes, 'DSUFFIXES' : SCons.Tool.DSuffixes, 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes, diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index b4e8aac..ce8e374 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -83,7 +83,7 @@ def installFunc(target, source, env): return install(target[0].path, source[0].path, env) def installString(target, source, env): - return 'Install file: "%s" as "%s"' % (source[0], target[0]) + return env.subst(env['INSTALLSTR'], 0, target, source) installAction = SCons.Action.Action(installFunc, installString) diff --git a/test/Install.py b/test/Install.py deleted file mode 100644 index 50f3820..0000000 --- a/test/Install.py +++ /dev/null @@ -1,138 +0,0 @@ -#!/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 the Install() Builder works -""" - -import os.path -import string -import sys -import time -import TestSCons - -test = TestSCons.TestSCons() - -test.subdir('outside', 'work', ['work', 'sub']) - -f1_out = test.workpath('work', 'export', 'f1.out') -f2_out = test.workpath('work', 'export', 'f2.out') -f3_out = test.workpath('work', 'export', 'f3.out') -f4_out = test.workpath('work', 'export', 'f4.out') -f5_txt = test.workpath('outside', 'f5.txt') -f6_txt = test.workpath('outside', 'f6.txt') -f6_sep = string.replace(f6_txt, os.sep, '/') - -test.write(['work', 'SConstruct'], """\ -def cat(env, source, target): - target = str(target[0]) - source = map(str, source) - f = open(target, "wb") - for src in source: - f.write(open(src, "rb").read()) - f.close() - -def my_install(dest, source, env): - import shutil - shutil.copy2(source, dest) - open('my_install.out', 'ab').write(dest) - -env1 = Environment() -env1.Append(BUILDERS={'Cat':Builder(action=cat)}) -env3 = env1.Copy(INSTALL = my_install) - -t = env1.Cat(target='f1.out', source='f1.in') -env1.Install(dir='export', source=t) -t = env1.Cat(target='f2.out', source='f2.in') -Install(dir='export', source=t) - -t = env3.Cat(target='f3.out', source='f3.in') -env3.Install(dir='export', source=t) - -env4 = env1.Copy(EXPORT='export', SUBDIR='sub') -t = env4.Cat(target='sub/f4.out', source='sub/f4.in') -env4.Install(dir='$EXPORT', source=r'%s') - -env1.Install('.', r'%s') -env1.Install('export', r'%s') -env1.Install('.', r'%s') -env1.Install('export', r'%s') -""" % (os.path.join('$SUBDIR', 'f4.out'), - f5_txt, f5_txt, - f6_sep, f6_sep)) - -test.write(['work', 'f1.in'], "f1.in\n") -test.write(['work', 'f2.in'], "f2.in\n") -test.write(['work', 'f3.in'], "f3.in\n") -test.write(['work', 'sub', 'f4.in'], "sub/f4.in\n") -test.write(f5_txt, "f5.txt\n") -test.write(f6_txt, "f6.txt\n") - -test.run(chdir = 'work', arguments = '.') - -test.fail_test(test.read(f1_out) != "f1.in\n") -test.fail_test(test.read(f2_out) != "f2.in\n") -test.fail_test(test.read(f3_out) != "f3.in\n") -test.fail_test(test.read(f4_out) != "sub/f4.in\n") -test.fail_test(test.read(['work', 'f5.txt']) != "f5.txt\n") -test.fail_test(test.read(['work', 'export', 'f5.txt']) != "f5.txt\n") -test.fail_test(test.read(['work', 'f6.txt']) != "f6.txt\n") -test.fail_test(test.read(['work', 'export', 'f6.txt']) != "f6.txt\n") - -test.fail_test(test.read(['work', 'my_install.out']) != os.path.join('export', 'f3.out')) - -# make sure the programs didn't get rebuilt, because nothing changed: -oldtime1 = os.path.getmtime(f1_out) -oldtime2 = os.path.getmtime(f2_out) - -test.write(['work', 'f1.in'], "f1.in again\n") - -time.sleep(2) # introduce a small delay, to make the test valid - -test.run(chdir = 'work', arguments = '.') - -test.fail_test(oldtime1 == os.path.getmtime(f1_out)) -test.fail_test(oldtime2 != os.path.getmtime(f2_out)) - -# Verify that we didn't link to the Installed file. -open(f2_out, 'wb').write("xyzzy\n") -test.fail_test(test.read(['work', 'f2.out']) != "f2.in\n") - -# Verify that scons prints an error message -# if a target can not be unlinked before building it: -test.write(['work', 'f1.in'], "f1.in again again\n") - -os.chmod(test.workpath('work', 'export'), 0555) -f = open(f1_out, 'rb') - -test.run(chdir = 'work', - arguments = f1_out, - stderr="scons: *** [%s] Permission denied\n" % os.path.join('export', 'f1.out'), - status=2) - -f.close() - -test.pass_test() diff --git a/test/Install/INSTALLSTR.py b/test/Install/INSTALLSTR.py new file mode 100644 index 0000000..d809b2c --- /dev/null +++ b/test/Install/INSTALLSTR.py @@ -0,0 +1,52 @@ +#!/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 the $INSTALLSTR variable is displayed when we install a file. +""" + +import os.path + +import TestSCons + +test = TestSCons.TestSCons() + +test.subdir('install') + +test.write('SConstruct', """\ +env = Environment(INSTALLSTR = 'INSTALL $SOURCE => $TARGET!\\n') +env.Install('install', 'file') +""") + +test.write('file', "file\n") + +test.run(stdout=test.wrap_stdout("""\ +INSTALL file => %s! +""") % os.path.join('install', 'file')) + +test.must_match(['install', 'file'], "file\n") + +test.pass_test() diff --git a/test/Install/Install.py b/test/Install/Install.py new file mode 100644 index 0000000..50f3820 --- /dev/null +++ b/test/Install/Install.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__" + +""" +Verify that the Install() Builder works +""" + +import os.path +import string +import sys +import time +import TestSCons + +test = TestSCons.TestSCons() + +test.subdir('outside', 'work', ['work', 'sub']) + +f1_out = test.workpath('work', 'export', 'f1.out') +f2_out = test.workpath('work', 'export', 'f2.out') +f3_out = test.workpath('work', 'export', 'f3.out') +f4_out = test.workpath('work', 'export', 'f4.out') +f5_txt = test.workpath('outside', 'f5.txt') +f6_txt = test.workpath('outside', 'f6.txt') +f6_sep = string.replace(f6_txt, os.sep, '/') + +test.write(['work', 'SConstruct'], """\ +def cat(env, source, target): + target = str(target[0]) + source = map(str, source) + f = open(target, "wb") + for src in source: + f.write(open(src, "rb").read()) + f.close() + +def my_install(dest, source, env): + import shutil + shutil.copy2(source, dest) + open('my_install.out', 'ab').write(dest) + +env1 = Environment() +env1.Append(BUILDERS={'Cat':Builder(action=cat)}) +env3 = env1.Copy(INSTALL = my_install) + +t = env1.Cat(target='f1.out', source='f1.in') +env1.Install(dir='export', source=t) +t = env1.Cat(target='f2.out', source='f2.in') +Install(dir='export', source=t) + +t = env3.Cat(target='f3.out', source='f3.in') +env3.Install(dir='export', source=t) + +env4 = env1.Copy(EXPORT='export', SUBDIR='sub') +t = env4.Cat(target='sub/f4.out', source='sub/f4.in') +env4.Install(dir='$EXPORT', source=r'%s') + +env1.Install('.', r'%s') +env1.Install('export', r'%s') +env1.Install('.', r'%s') +env1.Install('export', r'%s') +""" % (os.path.join('$SUBDIR', 'f4.out'), + f5_txt, f5_txt, + f6_sep, f6_sep)) + +test.write(['work', 'f1.in'], "f1.in\n") +test.write(['work', 'f2.in'], "f2.in\n") +test.write(['work', 'f3.in'], "f3.in\n") +test.write(['work', 'sub', 'f4.in'], "sub/f4.in\n") +test.write(f5_txt, "f5.txt\n") +test.write(f6_txt, "f6.txt\n") + +test.run(chdir = 'work', arguments = '.') + +test.fail_test(test.read(f1_out) != "f1.in\n") +test.fail_test(test.read(f2_out) != "f2.in\n") +test.fail_test(test.read(f3_out) != "f3.in\n") +test.fail_test(test.read(f4_out) != "sub/f4.in\n") +test.fail_test(test.read(['work', 'f5.txt']) != "f5.txt\n") +test.fail_test(test.read(['work', 'export', 'f5.txt']) != "f5.txt\n") +test.fail_test(test.read(['work', 'f6.txt']) != "f6.txt\n") +test.fail_test(test.read(['work', 'export', 'f6.txt']) != "f6.txt\n") + +test.fail_test(test.read(['work', 'my_install.out']) != os.path.join('export', 'f3.out')) + +# make sure the programs didn't get rebuilt, because nothing changed: +oldtime1 = os.path.getmtime(f1_out) +oldtime2 = os.path.getmtime(f2_out) + +test.write(['work', 'f1.in'], "f1.in again\n") + +time.sleep(2) # introduce a small delay, to make the test valid + +test.run(chdir = 'work', arguments = '.') + +test.fail_test(oldtime1 == os.path.getmtime(f1_out)) +test.fail_test(oldtime2 != os.path.getmtime(f2_out)) + +# Verify that we didn't link to the Installed file. +open(f2_out, 'wb').write("xyzzy\n") +test.fail_test(test.read(['work', 'f2.out']) != "f2.in\n") + +# Verify that scons prints an error message +# if a target can not be unlinked before building it: +test.write(['work', 'f1.in'], "f1.in again again\n") + +os.chmod(test.workpath('work', 'export'), 0555) +f = open(f1_out, 'rb') + +test.run(chdir = 'work', + arguments = f1_out, + stderr="scons: *** [%s] Permission denied\n" % os.path.join('export', 'f1.out'), + status=2) + +f.close() + +test.pass_test() diff --git a/test/Install/InstallAs.py b/test/Install/InstallAs.py new file mode 100644 index 0000000..c4e88f6 --- /dev/null +++ b/test/Install/InstallAs.py @@ -0,0 +1,68 @@ +#!/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 InstallAs() Environment method. +""" + +import os.path +import sys +import TestSCons + +test = TestSCons.TestSCons() + +test.subdir('install', 'subdir') + +install = test.workpath('install') +install_file1_out = test.workpath('install', 'file1.out') +install_file2_out = test.workpath('install', 'file2.out') +install_file3_out = test.workpath('install', 'file3.out') + +# +test.write('SConstruct', r""" +env = Environment(INSTALLDIR=r'%s', SUBDIR='subdir') +InstallAs(r'%s', 'file1.in') +env.InstallAs([r'%s', r'%s'], ['file2.in', r'%s']) +""" % (install, + install_file1_out, + os.path.join('$INSTALLDIR', 'file2.out'), + install_file3_out, + os.path.join('$SUBDIR', 'file3.in'))) + +test.write('file1.in', "file1.in\n") +test.write('file2.in', "file2.in\n") +test.write(['subdir', 'file3.in'], "subdir/file3.in\n") + +test.run(arguments = '.') + +test.fail_test(test.read(install_file1_out) != "file1.in\n") +test.fail_test(test.read(install_file2_out) != "file2.in\n") +test.fail_test(test.read(install_file3_out) != "subdir/file3.in\n") + +test.up_to_date(arguments = '.') + +# +test.pass_test() diff --git a/test/InstallAs.py b/test/InstallAs.py deleted file mode 100644 index c4e88f6..0000000 --- a/test/InstallAs.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/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 InstallAs() Environment method. -""" - -import os.path -import sys -import TestSCons - -test = TestSCons.TestSCons() - -test.subdir('install', 'subdir') - -install = test.workpath('install') -install_file1_out = test.workpath('install', 'file1.out') -install_file2_out = test.workpath('install', 'file2.out') -install_file3_out = test.workpath('install', 'file3.out') - -# -test.write('SConstruct', r""" -env = Environment(INSTALLDIR=r'%s', SUBDIR='subdir') -InstallAs(r'%s', 'file1.in') -env.InstallAs([r'%s', r'%s'], ['file2.in', r'%s']) -""" % (install, - install_file1_out, - os.path.join('$INSTALLDIR', 'file2.out'), - install_file3_out, - os.path.join('$SUBDIR', 'file3.in'))) - -test.write('file1.in', "file1.in\n") -test.write('file2.in', "file2.in\n") -test.write(['subdir', 'file3.in'], "subdir/file3.in\n") - -test.run(arguments = '.') - -test.fail_test(test.read(install_file1_out) != "file1.in\n") -test.fail_test(test.read(install_file2_out) != "file2.in\n") -test.fail_test(test.read(install_file3_out) != "subdir/file3.in\n") - -test.up_to_date(arguments = '.') - -# -test.pass_test() -- cgit v0.12