summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-12-12 16:36:41 (GMT)
committerSteven Knight <knight@baldmt.com>2003-12-12 16:36:41 (GMT)
commit972e1b6321b522d1290f04d6ad15f4f4beff8bf4 (patch)
tree21c67581310fd3f05e2e2f987939597461ca429d /src
parent62405828e80767a721d22ee39e900cd164cdb7a5 (diff)
downloadSCons-972e1b6321b522d1290f04d6ad15f4f4beff8bf4.zip
SCons-972e1b6321b522d1290f04d6ad15f4f4beff8bf4.tar.gz
SCons-972e1b6321b522d1290f04d6ad15f4f4beff8bf4.tar.bz2
Fix stripping the library prefix.
Diffstat (limited to 'src')
-rw-r--r--src/CHANGES.txt3
-rw-r--r--src/engine/SCons/Builder.py21
-rw-r--r--src/engine/SCons/Scanner/Prog.py14
-rw-r--r--src/engine/SCons/Scanner/ProgTests.py25
-rw-r--r--src/engine/SCons/Util.py10
-rw-r--r--src/engine/SCons/UtilTests.py15
6 files changed, 62 insertions, 26 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 52dbafc..bbeac15 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -89,6 +89,9 @@ RELEASE 0.95 - XXX
- Correct error message spellings of "non-existant" to "non-existent."
+ - When scanning for libraries to link with, don't append $LIBPREFIXES
+ or $LIBSUFFIXES values to the $LIBS values if they're already present.
+
From Vincent Risi:
- Add support for the bcc32, ilink32 and tlib Borland tools.
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
index 8372292..339a376 100644
--- a/src/engine/SCons/Builder.py
+++ b/src/engine/SCons/Builder.py
@@ -313,31 +313,24 @@ class BuilderBase:
def _create_nodes(self, env, overrides, target = None, source = None):
"""Create and return lists of target and source nodes.
"""
- def adjustixes(files, pre, suf, self=self):
+ def _adjustixes(files, pre, suf):
if not files:
return []
- ret = []
+ result = []
if not SCons.Util.is_List(files):
files = [files]
for f in files:
if SCons.Util.is_String(f):
- if pre:
- path, fn = os.path.split(os.path.normpath(f))
- if fn[:len(pre)] != pre:
- f = os.path.join(path, pre + fn)
- # Only append a suffix if the file does not have one.
- if suf and not self.splitext(f)[1]:
- if f[-len(suf):] != suf:
- f = f + suf
- ret.append(f)
- return ret
+ f = SCons.Util.adjustixes(f, pre, suf)
+ result.append(f)
+ return result
env = env.Override(overrides)
src_suf = self.get_src_suffix(env)
- source = adjustixes(source, None, src_suf)
+ source = _adjustixes(source, None, src_suf)
slist = env.arg2nodes(source, self.source_factory)
pre = self.get_prefix(env, slist)
@@ -350,7 +343,7 @@ class BuilderBase:
raise UserError("Do not know how to create a target from source `%s'" % slist[0])
tlist = [ t_from_s(pre, suf, self.splitext) ]
else:
- target = adjustixes(target, pre, suf)
+ target = _adjustixes(target, pre, suf)
tlist = env.arg2nodes(target, self.target_factory)
if self.emitter:
diff --git a/src/engine/SCons/Scanner/Prog.py b/src/engine/SCons/Scanner/Prog.py
index 650d26a..5b3c935 100644
--- a/src/engine/SCons/Scanner/Prog.py
+++ b/src/engine/SCons/Scanner/Prog.py
@@ -78,14 +78,16 @@ def scan(node, env, libpath = (), fs = SCons.Node.FS.default_fs):
suffix = [ '' ]
find_file = SCons.Node.FS.find_file
- ret = []
+ adjustixes = SCons.Util.adjustixes
+ result = []
for suf in map(env.subst, suffix):
for pref in map(env.subst, prefix):
for lib in libs:
if SCons.Util.is_String(lib):
- f = find_file(pref + lib + suf, libpath, fs.File)
- if f:
- ret.append(f)
+ lib = adjustixes(lib, pref, suf)
+ lib = find_file(lib, libpath, fs.File)
+ if lib:
+ result.append(lib)
else:
- ret.append(lib)
- return ret
+ result.append(lib)
+ return result
diff --git a/src/engine/SCons/Scanner/ProgTests.py b/src/engine/SCons/Scanner/ProgTests.py
index 9162b8e..9f178f8 100644
--- a/src/engine/SCons/Scanner/ProgTests.py
+++ b/src/engine/SCons/Scanner/ProgTests.py
@@ -35,20 +35,21 @@ import SCons.Scanner.Prog
test = TestCmd.TestCmd(workdir = '')
-test.subdir('d1', ['d1', 'd2'])
+test.subdir('d1', ['d1', 'd2'], 'dir', ['dir', 'sub'])
-libs = [ 'l1.lib', 'd1/l2.lib', 'd1/d2/l3.lib' ]
+libs = [ 'l1.lib', 'd1/l2.lib', 'd1/d2/l3.lib',
+ 'dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']
for h in libs:
- test.write(h, " ")
+ test.write(h, "\n")
# define some helpers:
class DummyEnvironment:
def __init__(self, **kw):
- self._dict = kw
- self._dict['LIBSUFFIXES'] = '.lib'
-
+ self._dict = {'LIBSUFFIXES' : '.lib'}
+ self._dict.update(kw)
+
def Dictionary(self, *args):
if not args:
return self._dict
@@ -150,12 +151,24 @@ class ProgScanTestCase5(unittest.TestCase):
deps = s('dummy', env, path)
assert deps_match(deps, [ 'd1/l2.lib' ]), map(str, deps)
+class ProgScanTestCase6(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=['foo', 'sub/libbar', 'xyz.other'],
+ LIBPREFIXES=['lib'],
+ LIBSUFFIXES=['.a'])
+ s = SCons.Scanner.Prog.ProgScan()
+ path = s.path(env)
+ deps = s('dummy', env, path)
+ assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), map(str, deps)
+
def suite():
suite = unittest.TestSuite()
suite.addTest(ProgScanTestCase1())
suite.addTest(ProgScanTestCase2())
suite.addTest(ProgScanTestCase3())
suite.addTest(ProgScanTestCase5())
+ suite.addTest(ProgScanTestCase6())
if hasattr(types, 'UnicodeType'):
code = """if 1:
class ProgScanTestCase4(unittest.TestCase):
diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py
index a558c2a..34822a6 100644
--- a/src/engine/SCons/Util.py
+++ b/src/engine/SCons/Util.py
@@ -982,3 +982,13 @@ if sys.platform == 'cygwin':
else:
def case_sensitive_suffixes(s1, s2):
return (os.path.normcase(s1) != os.path.normcase(s2))
+
+def adjustixes(file, pre, suf):
+ if pre:
+ path, fn = os.path.split(os.path.normpath(file))
+ if fn[:len(pre)] != pre:
+ file = os.path.join(path, pre + fn)
+ # Only append a suffix if the file does not have one.
+ if suf and not splitext(file)[1] and file[-len(suf):] != suf:
+ file = file + suf
+ return file
diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py
index 2732f93..d677708 100644
--- a/src/engine/SCons/UtilTests.py
+++ b/src/engine/SCons/UtilTests.py
@@ -1044,6 +1044,21 @@ class UtilTestCase(unittest.TestCase):
ret = s(env, ['bar.g'])
assert ret == 'GGG', ret
+ def test_adjustixes(self):
+ """Test the adjustixes() function"""
+ r = adjustixes('file', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('file-suf', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file-suf', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file.xxx', 'pre-', '-suf')
+ assert r == 'pre-file.xxx', r
+ r = adjustixes('dir/file', 'pre-', '-suf')
+ assert r == 'dir/pre-file-suf', r
+
if __name__ == "__main__":
suite = unittest.makeSuite(UtilTestCase, 'test_')
if not unittest.TextTestRunner().run(suite).wasSuccessful():