diff options
-rw-r--r-- | test/Linker/targettriple.ll | 1 | ||||
-rw-r--r-- | test/Object/archive-delete.test | 2 | ||||
-rw-r--r-- | test/Object/archive-extract-dir.test | 4 | ||||
-rw-r--r-- | test/Object/archive-format.test | 2 | ||||
-rw-r--r-- | test/Object/archive-move.test | 2 | ||||
-rw-r--r-- | test/Object/archive-update.test | 2 | ||||
-rw-r--r-- | test/Object/extract.ll | 2 | ||||
-rw-r--r-- | test/Object/nm-trivial-object.test | 1 | ||||
-rw-r--r-- | test/tools/llvm-cov/llvm-cov.test | 3 | ||||
-rw-r--r-- | utils/lit/lit/TestRunner.py | 52 |
10 files changed, 42 insertions, 29 deletions
diff --git a/test/Linker/targettriple.ll b/test/Linker/targettriple.ll index 87787067006..a159797856c 100644 --- a/test/Linker/targettriple.ll +++ b/test/Linker/targettriple.ll @@ -1,4 +1,3 @@ -; REQUIRES: shell ; RUN: llvm-link %s %S/Inputs/targettriple-a.ll -S -o - 2>%t.a.err | FileCheck %s ; RUN: cat %t.a.err | FileCheck --check-prefix=WARN-A %s --allow-empty diff --git a/test/Object/archive-delete.test b/test/Object/archive-delete.test index 552b0e709f6..c8530beafce 100644 --- a/test/Object/archive-delete.test +++ b/test/Object/archive-delete.test @@ -1,7 +1,5 @@ Test the 'd' operation in llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/archive-extract-dir.test b/test/Object/archive-extract-dir.test index c718f90275b..5182a2f9141 100644 --- a/test/Object/archive-extract-dir.test +++ b/test/Object/archive-extract-dir.test @@ -1,5 +1,3 @@ -REQUIRES: shell - RUN: mkdir -p %t RUN: cd %t RUN: rm -rf foo @@ -10,4 +8,4 @@ RUN: rm foo RUN: mkdir foo RUN: not llvm-ar x test.a foo 2>&1 | FileCheck %s -CHECK: foo: Is a directory +CHECK: foo: {{[Ii]}}s a directory diff --git a/test/Object/archive-format.test b/test/Object/archive-format.test index 20ac1a0d78f..236a181139a 100644 --- a/test/Object/archive-format.test +++ b/test/Object/archive-format.test @@ -1,8 +1,6 @@ Test the exact archive format. In particular, test which file names use the string table or not. -REQUIRES: shell - RUN: mkdir -p %t RUN: cd %t diff --git a/test/Object/archive-move.test b/test/Object/archive-move.test index 0378e9111a9..adc114994d2 100644 --- a/test/Object/archive-move.test +++ b/test/Object/archive-move.test @@ -1,7 +1,5 @@ Test the 'm' operation in llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/archive-update.test b/test/Object/archive-update.test index 20286d2669a..91ca8102c7e 100644 --- a/test/Object/archive-update.test +++ b/test/Object/archive-update.test @@ -1,7 +1,5 @@ Test the 'u' option of llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/extract.ll b/test/Object/extract.ll index a4e76499ca6..8d77f09fe88 100644 --- a/test/Object/extract.ll +++ b/test/Object/extract.ll @@ -3,8 +3,6 @@ ; This test just makes sure that llvm-ar can extract bytecode members ; from various style archives. -; REQUIRES: shell - ; RUN: cd %T ; RUN: rm -f very_long_bytecode_file_name.bc diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index 0135f2df3cb..c576c236fc0 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -46,7 +46,6 @@ RUN: mkdir -p %t RUN: cd %t RUN: cp %p/Inputs/trivial-object-test.macho-i386 a.out RUN: llvm-nm | FileCheck %s -check-prefix A-OUT -REQUIRES: shell COFF: 00000000 {{.*}} d .data diff --git a/test/tools/llvm-cov/llvm-cov.test b/test/tools/llvm-cov/llvm-cov.test index 0d3eb6b8f81..6a71120c882 100644 --- a/test/tools/llvm-cov/llvm-cov.test +++ b/test/tools/llvm-cov/llvm-cov.test @@ -1,7 +1,8 @@ # Tests for compatibility between llvm-cov and gcov. These work by # comparing llvm-cov against reference outputs generated by gcov 4.2. -# "cd" and globbing are unsupported in lit internal runner. +# Test fails on Windows where internal shell is used due to path separator +# mismatches. REQUIRES: shell RUN: rm -rf %t diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 268e46c38f7..f1734eca372 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -22,33 +22,56 @@ kUseCloseFDs = not kIsWindows # Use temporary files to replace /dev/null on Windows. kAvoidDevNull = kIsWindows -def executeShCmd(cmd, cfg, cwd, results): +class ShellEnvironment(object): + + """Mutable shell environment containing things like CWD and env vars. + + Environment variables are not implemented, but cwd tracking is. + """ + + def __init__(self, cwd, env): + self.cwd = cwd + self.env = env + +def executeShCmd(cmd, shenv, results): if isinstance(cmd, ShUtil.Seq): if cmd.op == ';': - res = executeShCmd(cmd.lhs, cfg, cwd, results) - return executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) + return executeShCmd(cmd.rhs, shenv, results) if cmd.op == '&': raise InternalShellError(cmd,"unsupported shell operator: '&'") if cmd.op == '||': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res != 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res if cmd.op == '&&': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res is None: return res if res == 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res raise ValueError('Unknown shell command: %r' % cmd.op) - assert isinstance(cmd, ShUtil.Pipeline) + + # Handle shell builtins first. + if cmd.commands[0].args[0] == 'cd': + # Update the cwd in the environment. + if len(cmd.commands[0].args) != 2: + raise ValueError('cd supports only one argument') + newdir = cmd.commands[0].args[1] + if os.path.isabs(newdir): + shenv.cwd = newdir + else: + shenv.cwd = os.path.join(shenv.cwd, newdir) + return 0 + procs = [] input = subprocess.PIPE stderrTempFiles = [] @@ -102,7 +125,9 @@ def executeShCmd(cmd, cfg, cwd, results): if kAvoidDevNull and r[0] == '/dev/null': r[2] = tempfile.TemporaryFile(mode=r[1]) else: - r[2] = open(r[0], r[1]) + # Make sure relative paths are relative to the cwd. + redir_filename = os.path.join(shenv.cwd, r[0]) + r[2] = open(redir_filename, r[1]) # Workaround a Win32 and/or subprocess bug when appending. # # FIXME: Actually, this is probably an instance of PR6753. @@ -132,7 +157,7 @@ def executeShCmd(cmd, cfg, cwd, results): # Resolve the executable path ourselves. args = list(j.args) - executable = lit.util.which(args[0], cfg.environment['PATH']) + executable = lit.util.which(args[0], shenv.env['PATH']) if not executable: raise InternalShellError(j, '%r: command not found' % j.args[0]) @@ -146,12 +171,12 @@ def executeShCmd(cmd, cfg, cwd, results): args[i] = f.name try: - procs.append(subprocess.Popen(args, cwd=cwd, + procs.append(subprocess.Popen(args, cwd=shenv.cwd, executable = executable, stdin = stdin, stdout = stdout, stderr = stderr, - env = cfg.environment, + env = shenv.env, close_fds = kUseCloseFDs)) except OSError as e: raise InternalShellError(j, 'Could not create process due to {}'.format(e)) @@ -257,7 +282,8 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd): results = [] try: - exitCode = executeShCmd(cmd, test.config, cwd, results) + shenv = ShellEnvironment(cwd, test.config.environment) + exitCode = executeShCmd(cmd, shenv, results) except InternalShellError: e = sys.exc_info()[1] exitCode = 127 |