if not self.in_strip or self.mode != SUBST_SIG:
try:
- y = self[-1][-1] + x
+ current_word = self[-1][-1]
except IndexError:
self.add_new_word(x)
else:
- literal1 = self.literal(self[-1][-1])
- literal2 = self.literal(x)
- y = self.conv(y)
- if is_String(y):
- y = CmdStringHolder(y, literal1 or literal2)
- self[-1][-1] = y
+ # All right, this is a hack and it should probably
+ # be refactored out of existence in the future.
+ # The issue is that we want to smoosh words together
+ # and make one file name that gets escaped if
+ # we're expanding something like foo$EXTENSION,
+ # but we don't want to smoosh them together if
+ # it's something like >$TARGET, because then we'll
+ # treat the '>' like it's part of the file name.
+ # So for now, just hard-code looking for the special
+ # command-line redirection characters...
+ try:
+ last_char = str(current_word)[-1]
+ except IndexError:
+ last_char = '\0'
+ if last_char in '<>|':
+ self.add_new_word(x)
+ else:
+ y = current_word + x
+ literal1 = self.literal(self[-1][-1])
+ literal2 = self.literal(x)
+ y = self.conv(y)
+ if is_String(y):
+ y = CmdStringHolder(y, literal1 or literal2)
+ self[-1][-1] = y
def add_new_word(self, x):
if not self.in_strip or self.mode != SUBST_SIG:
# Bug reported by Christoph Wiedemann.
cvt('$xxx/bin'), [['/bin']],
+
+ # Test variables smooshed together with different prefixes.
+ 'foo$AAA', [['fooa']],
+ '<$AAA', [['<', 'a']],
+ '>$AAA', [['>', 'a']],
+ '|$AAA', [['|', 'a']],
]
kwargs = {'target' : target, 'source' : source}
Test that the Flatten() function is available and works.
"""
+import string
+
import TestSCons
test = TestSCons.TestSCons()
test.write('file2a.in', "file2a.in\n")
test.write('file2b.in', "file2b.in\n")
+def double_backslash(f):
+ p = test.workpath(f)
+ return string.replace(p, '\\', '\\\\')
+
expect = """\
['begin', '%s', 'middle', '%s', 'end']
['%s', 'a', 'b', 'c', '%s']
[1, 2, 3, 4]
[1, 2, 3, 4]
-""" % (test.workpath('file1.out'), test.workpath('file2.out'),
- test.workpath('file1.out'), test.workpath('file2.out'))
+""" % (double_backslash('file1.out'), double_backslash('file2.out'),
+ double_backslash('file1.out'), double_backslash('file2.out'))
test.run(chdir = "work",
arguments = ".",
action= '%s cat.py < $SOURCES > $TARGET')
env.Command(target='foo3', source='bar3',
action='%s cat.py $SOURCES | %s cat.py > $TARGET')
-""" % (python, python, python, python))
+env.Command(target='foo4', source='bar4',
+ action='%s cat.py <$SOURCES |%s cat.py >$TARGET')
+""" % (python, python, python, python, python, python))
test.write('bar1', 'bar1\r\n')
test.write('bar2', 'bar2\r\n')
test.write('bar3', 'bar3\r\n')
+test.write('bar4', 'bar4\r\n')
test.run(arguments='.')
+
test.fail_test(test.read('foo1') != 'bar1\r\n')
test.fail_test(test.read('foo2') != 'bar2\r\n')
test.fail_test(test.read('foo3') != 'bar3\r\n')
+test.fail_test(test.read('foo4') != 'bar4\r\n')
test.pass_test()