From: Louis Dionne Date: Wed, 10 Jun 2020 18:41:47 +0000 (-0400) Subject: [libc++] Consider everything inside %T to be a dependency of each test X-Git-Tag: llvmorg-12-init~3414 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1fc5010d6b70bb5c2330595230ca5c5fe07bcad0;p=platform%2Fupstream%2Fllvm.git [libc++] Consider everything inside %T to be a dependency of each test Instead of passing file dependencies individually, assume that the whole content of the unique test directory is a dependency. This simplifies the test harness significantly, by making %T the directory that contains everything required to run a test. This also removes the need for the %{file_dependencies} substitution, which is removed by this patch. Furthermore, this patch also changes the harness to execute tests locally inside %T, so as to avoid creating a separate directory for no purpose. --- diff --git a/libcxx/test/libcxx/double_include.sh.cpp b/libcxx/test/libcxx/double_include.sh.cpp index f56e2ec..37fa0e5 100644 --- a/libcxx/test/libcxx/double_include.sh.cpp +++ b/libcxx/test/libcxx/double_include.sh.cpp @@ -9,7 +9,6 @@ // Test that we can include each header in two TU's and link them together. -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} -c %s -o %t.first.o %{flags} %{compile_flags} // RUN: %{cxx} -c %s -o %t.second.o -DWITH_MAIN %{flags} %{compile_flags} // RUN: %{cxx} -o %t.exe %t.first.o %t.second.o %{flags} %{link_flags} diff --git a/libcxx/test/libcxx/language.support/support.dynamic/libcpp_deallocate.sh.cpp b/libcxx/test/libcxx/language.support/support.dynamic/libcpp_deallocate.sh.cpp index 39af4dd..6ed7e75 100644 --- a/libcxx/test/libcxx/language.support/support.dynamic/libcpp_deallocate.sh.cpp +++ b/libcxx/test/libcxx/language.support/support.dynamic/libcpp_deallocate.sh.cpp @@ -35,7 +35,6 @@ // GCC doesn't support the aligned-allocation flags. // XFAIL: gcc -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} -faligned-allocation -fsized-deallocation // RUN: %{run} // RUN: %{build} -faligned-allocation -fno-sized-deallocation -DNO_SIZE diff --git a/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.merged.sh.cpp b/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.merged.sh.cpp index 08e3eb6..ae6efea 100644 --- a/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.merged.sh.cpp +++ b/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.merged.sh.cpp @@ -8,7 +8,6 @@ // UNSUPPORTED: -fno-rtti -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.tu1.o -DTU1 -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=1 // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.tu2.o -DTU2 -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=1 // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.main.o -DMAIN -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=1 diff --git a/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.unmerged.sh.cpp b/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.unmerged.sh.cpp index e81a1b0..1fb9bc3 100644 --- a/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.unmerged.sh.cpp +++ b/libcxx/test/libcxx/language.support/support.rtti/type.info/type_info.comparison.unmerged.sh.cpp @@ -8,7 +8,6 @@ // UNSUPPORTED: -fno-rtti -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.tu1.o -DTU1 -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=2 // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.tu2.o -DTU2 -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=2 // RUN: %{cxx} %s %{flags} %{compile_flags} -c -o %t.main.o -DMAIN -D_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION=2 diff --git a/libcxx/test/libcxx/selftest/dsl/lit.local.cfg b/libcxx/test/libcxx/selftest/dsl/lit.local.cfg index 8cf3543..6613900 100644 --- a/libcxx/test/libcxx/selftest/dsl/lit.local.cfg +++ b/libcxx/test/libcxx/selftest/dsl/lit.local.cfg @@ -1,10 +1,9 @@ # Since we try to pass substitutions as-is to some tests, we must "escape" # them in case they contain other substitutions. Otherwise, the substitutions # will be fully expanded when passed to the tests. For example, we want an -# %{exec} substitution that contains `--dependencies %{file_dependencies}` -# to be passed as-is, without substituting the file dependencies. This way, -# the test itself can use populate %{file_dependencies} as it sees fit, and -# %{exec} will respect it. +# %{exec} substitution that contains `--execdir %T` to be passed as-is, without +# substituting the directory. This way, the test itself can populate %T as it +# sees fit, and %{exec} will respect it. # # To solve this problem, we add base64 encoded versions of substitutions just # in this directory. We then base64-decode them from the tests when we need to. diff --git a/libcxx/test/libcxx/selftest/exec.sh.cpp b/libcxx/test/libcxx/selftest/exec.sh.cpp index de42de3..19c3d59 100644 --- a/libcxx/test/libcxx/selftest/exec.sh.cpp +++ b/libcxx/test/libcxx/selftest/exec.sh.cpp @@ -7,8 +7,6 @@ // //===----------------------------------------------------------------------===// -// FILE_DEPENDENCIES: %t.exe - // RUN: %{build} // RUN: %{exec} %t.exe "HELLO" diff --git a/libcxx/test/libcxx/selftest/newformat/convenience_substitutions/build_run.sh.cpp b/libcxx/test/libcxx/selftest/newformat/convenience_substitutions/build_run.sh.cpp index e050f88..4698167 100644 --- a/libcxx/test/libcxx/selftest/newformat/convenience_substitutions/build_run.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/convenience_substitutions/build_run.sh.cpp @@ -8,7 +8,6 @@ // Make sure that we provide the %{build} and %{run} convenience substitutions. -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{run} "HELLO" diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/a.txt b/libcxx/test/libcxx/selftest/newformat/file_dependencies/a.txt new file mode 100644 index 0000000..e69de29 diff --git a/libcxx/test/libcxx/selftest/test.file_dependencies.sh.cpp b/libcxx/test/libcxx/selftest/newformat/file_dependencies/absolute-and-relative-paths.sh.cpp similarity index 66% rename from libcxx/test/libcxx/selftest/test.file_dependencies.sh.cpp rename to libcxx/test/libcxx/selftest/newformat/file_dependencies/absolute-and-relative-paths.sh.cpp index 5974393..ac52f67 100644 --- a/libcxx/test/libcxx/selftest/test.file_dependencies.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/file_dependencies/absolute-and-relative-paths.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -// FILE_DEPENDENCIES: test.pass.cpp -// FILE_DEPENDENCIES: %s +// Make sure that FILE_DEPENDENCIES work with relative AND absolute paths. -// RUN: echo %{file_dependencies} | grep 'test.pass.cpp' -// RUN: echo %{file_dependencies} | grep '%s' +// FILE_DEPENDENCIES: %S/a.txt +// RUN: test -e %T/a.txt + +// FILE_DEPENDENCIES: dir/b.txt +// RUN: test -e %T/b.txt diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/dir/b.txt b/libcxx/test/libcxx/selftest/newformat/file_dependencies/dir/b.txt new file mode 100644 index 0000000..e69de29 diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp b/libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp deleted file mode 100644 index adfb15a..0000000 --- a/libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp +++ /dev/null @@ -1,13 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Make sure that %{file_dependencies} is empty when no FILE_DEPENDENCIES -// line appears. Amongst other things, this makes sure that we don't share -// file dependencies across unrelated Lit tests. - -// RUN: test -z "%{file_dependencies}" diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp index 291afcb..c63684c 100644 --- a/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp @@ -9,4 +9,4 @@ // Make sure that lit substitutions are expanded inside FILE_DEPENDENCIES lines. // FILE_DEPENDENCIES: %s -// RUN: echo %{file_dependencies} | grep 'substitute-in-dependencies.sh.cpp' +// RUN: test -e %T/substitute-in-dependencies.sh.cpp diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp deleted file mode 100644 index 5bd0e33..0000000 --- a/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp +++ /dev/null @@ -1,17 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Make sure %{file_dependencies} are substituted properly into RUN commands. - -// FILE_DEPENDENCIES: a.txt -// FILE_DEPENDENCIES: b.txt, c.txt -// FILE_DEPENDENCIES: /absolute/d.txt -// RUN: echo %{file_dependencies} | grep 'a.txt' -// RUN: echo %{file_dependencies} | grep 'b.txt' -// RUN: echo %{file_dependencies} | grep 'c.txt' -// RUN: echo %{file_dependencies} | grep '/absolute/d.txt' diff --git a/libcxx/test/libcxx/selftest/newformat/remote-substitutions.sh.cpp b/libcxx/test/libcxx/selftest/newformat/remote-substitutions.sh.cpp index 97c30a6..644086f 100644 --- a/libcxx/test/libcxx/selftest/newformat/remote-substitutions.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/remote-substitutions.sh.cpp @@ -15,7 +15,6 @@ // We also check that the path of test-executables is replaced whether they // appear first in the command-line or not. -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe // RUN: %{exec} %t.exe 0 // RUN: %{exec} ! %t.exe 1 diff --git a/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp b/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp index e83d9ba..da69663 100644 --- a/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp @@ -13,7 +13,6 @@ // - %{link_flags} // - %{exec} -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe // RUN: %{exec} %t.exe "HELLO" diff --git a/libcxx/test/libcxx/selftest/newformat/sh.cpp/werror.sh.cpp b/libcxx/test/libcxx/selftest/newformat/sh.cpp/werror.sh.cpp index 5b84275..b661798 100644 --- a/libcxx/test/libcxx/selftest/newformat/sh.cpp/werror.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/werror.sh.cpp @@ -14,7 +14,6 @@ // TODO: We don't enable -Werror on GCC right now, because too many tests fail. // UNSUPPORTED: gcc -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} -Wunused-variable // RUN: %{run} diff --git a/libcxx/test/libcxx/selftest/newformat/shell-escape-pipes.sh.cpp b/libcxx/test/libcxx/selftest/newformat/shell-escape-pipes.sh.cpp index 3badc8c..194ad53 100644 --- a/libcxx/test/libcxx/selftest/newformat/shell-escape-pipes.sh.cpp +++ b/libcxx/test/libcxx/selftest/newformat/shell-escape-pipes.sh.cpp @@ -16,7 +16,6 @@ // %{exec}, the one difference we can rely on is that we're in a temporary // directory with all file dependencies satisfied, so that's what we use. -// FILE_DEPENDENCIES: %t.foobar // RUN: touch %t.foobar // RUN: %{exec} echo \| ls > %t.out // RUN: grep -e ".foobar" %t.out diff --git a/libcxx/test/libcxx/selftest/test.sh.cpp b/libcxx/test/libcxx/selftest/test.sh.cpp index ad75f02..5c4db16 100644 --- a/libcxx/test/libcxx/selftest/test.sh.cpp +++ b/libcxx/test/libcxx/selftest/test.sh.cpp @@ -7,8 +7,6 @@ // //===----------------------------------------------------------------------===// -// FILE_DEPENDENCIES: %t.exe - // RUN: %{build} // RUN: %{run} diff --git a/libcxx/test/libcxx/strings/basic.string/PR42676.sh.cpp b/libcxx/test/libcxx/strings/basic.string/PR42676.sh.cpp index 18faaf0..31bf81e 100644 --- a/libcxx/test/libcxx/strings/basic.string/PR42676.sh.cpp +++ b/libcxx/test/libcxx/strings/basic.string/PR42676.sh.cpp @@ -8,7 +8,6 @@ // Regression test for PR42676. -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %{flags} %s -o %t.exe %{compile_flags} %{link_flags} -D_LIBCPP_HIDE_FROM_ABI_PER_TU // RUN: %{run} diff --git a/libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp b/libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp index 844f8b0..33c1165 100644 --- a/libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp +++ b/libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp @@ -14,7 +14,6 @@ // on Darwin out-of-the-box. // REQUIRES: has-fblocks && darwin -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} -fblocks // RUN: %{run} diff --git a/libcxx/test/std/containers/associative/map/PR28469_undefined_behavior_segfault.sh.cpp b/libcxx/test/std/containers/associative/map/PR28469_undefined_behavior_segfault.sh.cpp index ee230cc..4181bc5 100644 --- a/libcxx/test/std/containers/associative/map/PR28469_undefined_behavior_segfault.sh.cpp +++ b/libcxx/test/std/containers/associative/map/PR28469_undefined_behavior_segfault.sh.cpp @@ -8,7 +8,6 @@ // UNSUPPORTED: c++03 -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} -O2 // RUN: %{run} diff --git a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.sh.cpp b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.sh.cpp index 650537d..16f2b85 100644 --- a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.sh.cpp @@ -10,7 +10,6 @@ // istream cerr; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe 2> %t.err // RUN: grep -e 'Hello World!' %t.err diff --git a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cin.sh.cpp b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cin.sh.cpp index 4cadde6..c2bbd36 100644 --- a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cin.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cin.sh.cpp @@ -12,7 +12,6 @@ // istream cin; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} echo "123" \| %t.exe > %t.out // RUN: grep -e 'The number is 123!' %t.out diff --git a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/clog.sh.cpp b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/clog.sh.cpp index 32e23bf..0e3faba 100644 --- a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/clog.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/clog.sh.cpp @@ -10,7 +10,6 @@ // istream clog; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe 2> %t.err // RUN: grep -e 'Hello World!' %t.err diff --git a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cout.sh.cpp b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cout.sh.cpp index f4a066b..8f65b95 100644 --- a/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cout.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/narrow.stream.objects/cout.sh.cpp @@ -12,7 +12,6 @@ // istream cout; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe > %t.out // RUN: grep -e 'Hello World!' %t.out diff --git a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp index 30974df..3ce65cb 100644 --- a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp @@ -10,7 +10,6 @@ // istream wcerr; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe 2> %t.err // RUN: grep -e 'Hello World!' %t.err diff --git a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp index 0d0ab7e..197c1bd 100644 --- a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp @@ -12,7 +12,6 @@ // istream wcin; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} echo "123" \| %t.exe > %t.out // RUN: grep -e 'The number is 123!' %t.out diff --git a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp index d1b1260..34a4913 100644 --- a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp @@ -10,7 +10,6 @@ // istream wclog; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe 2> %t.err // RUN: grep -e 'Hello World!' %t.err diff --git a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp index 0a14f89..577b0c9 100644 --- a/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp +++ b/libcxx/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp @@ -12,7 +12,6 @@ // istream wcout; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{exec} %t.exe > %t.out // RUN: grep -e 'Hello World!' %t.out diff --git a/libcxx/test/std/thread/thread.condition/thread.condition.condvarany/wait_terminates.sh.cpp b/libcxx/test/std/thread/thread.condition/thread.condition.condvarany/wait_terminates.sh.cpp index 2d6e962..f4bb2b7 100644 --- a/libcxx/test/std/thread/thread.condition/thread.condition.condvarany/wait_terminates.sh.cpp +++ b/libcxx/test/std/thread/thread.condition/thread.condition.condvarany/wait_terminates.sh.cpp @@ -13,7 +13,6 @@ // class condition_variable_any; -// FILE_DEPENDENCIES: %t.exe // RUN: %{build} // RUN: %{run} 1 // RUN: %{run} 2 diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py index 118cb89..5eccc27 100644 --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/utils/libcxx/test/config.py @@ -747,15 +747,14 @@ class Configuration(object): codesign_ident = self.get_lit_conf('llvm_codesign_identity', '') env_vars = ' '.join('%s=%s' % (k, pipes.quote(v)) for (k, v) in self.exec_env.items()) exec_args = [ + '--execdir %T', '--codesign_identity "{}"'.format(codesign_ident), - '--dependencies %{file_dependencies}', '--env {}'.format(env_vars) ] if isinstance(self.executor, SSHExecutor): exec_args.append('--host {}'.format(self.executor.user_prefix + self.executor.host)) executor = os.path.join(self.libcxx_src_root, 'utils', 'ssh.py') else: - exec_args.append('--execdir %t.execdir') executor = os.path.join(self.libcxx_src_root, 'utils', 'run.py') sub.append(('%{exec}', '{} {} {} -- '.format(pipes.quote(sys.executable), pipes.quote(executor), diff --git a/libcxx/utils/libcxx/test/dsl.py b/libcxx/utils/libcxx/test/dsl.py index f3add44..21b48af 100644 --- a/libcxx/utils/libcxx/test/dsl.py +++ b/libcxx/utils/libcxx/test/dsl.py @@ -70,9 +70,9 @@ def sourceBuilds(config, source): "mkdir -p %T", "%{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe" ] - commands = libcxx.test.newformat.parseScript(test, preamble=commands, fileDependencies=['%t.exe']) + commands = libcxx.test.newformat.parseScript(test, preamble=commands) out, err, exitCode, timeoutInfo = _executeScriptInternal(test, commands) - cleanup = libcxx.test.newformat.parseScript(test, preamble=['rm %t.exe'], fileDependencies=[]) + cleanup = libcxx.test.newformat.parseScript(test, preamble=['rm %t.exe']) _executeScriptInternal(test, cleanup) return exitCode == 0 @@ -85,7 +85,7 @@ def hasCompileFlag(config, flag): """ with _makeConfigTest(config) as test: commands = ["%{{cxx}} -xc++ {} -Werror -fsyntax-only %{{flags}} %{{compile_flags}} {}".format(os.devnull, flag)] - commands = libcxx.test.newformat.parseScript(test, preamble=commands, fileDependencies=[]) + commands = libcxx.test.newformat.parseScript(test, preamble=commands) out, err, exitCode, timeoutInfo = _executeScriptInternal(test, commands) return exitCode == 0 @@ -111,9 +111,9 @@ def hasLocale(config, locale): "%{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe", "%{{exec}} %t.exe {}".format(pipes.quote(locale)), ] - commands = libcxx.test.newformat.parseScript(test, preamble=commands, fileDependencies=['%t.exe']) + commands = libcxx.test.newformat.parseScript(test, preamble=commands) out, err, exitCode, timeoutInfo = _executeScriptInternal(test, commands) - cleanup = libcxx.test.newformat.parseScript(test, preamble=['rm %t.exe'], fileDependencies=[]) + cleanup = libcxx.test.newformat.parseScript(test, preamble=['rm %t.exe']) _executeScriptInternal(test, cleanup) return exitCode == 0 @@ -129,7 +129,7 @@ def compilerMacros(config, flags=''): """ with _makeConfigTest(config) as test: commands = ["%{{cxx}} -xc++ {} -dM -E %{{flags}} %{{compile_flags}} {}".format(os.devnull, flags)] - commands = libcxx.test.newformat.parseScript(test, preamble=commands, fileDependencies=[]) + commands = libcxx.test.newformat.parseScript(test, preamble=commands) unparsedOutput, err, exitCode, timeoutInfo = _executeScriptInternal(test, commands) parsedMacros = dict() defines = (l.strip() for l in unparsedOutput.split('\n') if l.startswith('#define ')) diff --git a/libcxx/utils/libcxx/test/newformat.py b/libcxx/utils/libcxx/test/newformat.py index 43b11a4..4390166 100644 --- a/libcxx/utils/libcxx/test/newformat.py +++ b/libcxx/utils/libcxx/test/newformat.py @@ -11,6 +11,7 @@ import lit.formats import os import pipes import re +import shutil import subprocess def _supportsVerify(config): @@ -40,7 +41,7 @@ def _getTempPaths(test): tmpBase = os.path.join(tmpDir, 't') return tmpDir, tmpBase -def parseScript(test, preamble, fileDependencies): +def parseScript(test, preamble): """ Extract the script from a test, with substitutions applied. @@ -54,9 +55,6 @@ def parseScript(test, preamble, fileDependencies): These commands can contain unexpanded substitutions, but they must not be of the form 'RUN:' -- they must be proper commands once substituted. - - - fileDependencies - A list of additional file dependencies for the test. """ # Get the default substitutions @@ -71,7 +69,7 @@ def parseScript(test, preamble, fileDependencies): # Parse the test file, including custom directives additionalCompileFlags = [] - fileDependencies = list(fileDependencies) + fileDependencies = [] parsers = [ lit.TestRunner.IntegratedTestKeywordParser('FILE_DEPENDENCIES:', lit.TestRunner.ParserKind.LIST, @@ -81,30 +79,25 @@ def parseScript(test, preamble, fileDependencies): initial_value=additionalCompileFlags) ] - script = list(preamble) - parsed = lit.TestRunner.parseIntegratedTestScript(test, additional_parsers=parsers, - require_script=not script) - if isinstance(parsed, lit.Test.Result): - return parsed - script += parsed + scriptInTest = lit.TestRunner.parseIntegratedTestScript(test, additional_parsers=parsers, + require_script=not preamble) + if isinstance(scriptInTest, lit.Test.Result): + return scriptInTest + + script = [] + + # For each file dependency in FILE_DEPENDENCIES, inject a command to copy + # that file to the execution directory. Execute the copy from %S to allow + # relative paths from the test directory. + for dep in fileDependencies: + script += ['%dbg(SETUP) cd %S && cp {} %T'.format(dep)] + script += preamble + script += scriptInTest # Add compile flags specified with ADDITIONAL_COMPILE_FLAGS. substitutions = [(s, x + ' ' + ' '.join(additionalCompileFlags)) if s == '%{compile_flags}' else (s, x) for (s, x) in substitutions] - # Perform substitutions inside FILE_DEPENDENCIES lines (or injected dependencies). - # This allows using variables like %t in file dependencies. Also note that we really - # need to resolve %{file_dependencies} now, because otherwise we won't be able to - # make all paths absolute below. - fileDependencies = lit.TestRunner.applySubstitutions(fileDependencies, substitutions, - recursion_limit=test.config.recursiveExpansionLimit) - - # Add the %{file_dependencies} substitution before we perform substitutions - # inside the script. - testDir = os.path.dirname(test.getSourcePath()) - fileDependencies = [f if os.path.isabs(f) else os.path.join(testDir, f) for f in fileDependencies] - substitutions.append(('%{file_dependencies}', ' '.join(map(pipes.quote, fileDependencies)))) - # Perform substitutions in the script itself. script = lit.TestRunner.applySubstitutions(script, substitutions, recursion_limit=test.config.recursiveExpansionLimit) @@ -170,11 +163,10 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): This directive expresses that the test requires the provided files or directories in order to run. An example is a test that requires some test input stored in a data file. When a test file contains - such a directive, this test format will collect them and make them - available in a special %{file_dependencies} substitution. The intent - is that if one needs to e.g. execute tests on a remote host, the - %{exec} substitution could use %{file_dependencies} to know which - files and directories to copy to the remote host. + such a directive, this test format will collect them and copy them + to the directory represented by %T. The intent is that %T contains + all the inputs necessary to run the test, such that e.g. execution + on a remote host can be done by simply copying %T to the host. // ADDITIONAL_COMPILE_FLAGS: flag1, flag2, flag3 @@ -188,11 +180,6 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): ============================================== The test format will define the following substitutions for use inside tests: - %{file_dependencies} - - Expands to the list of files that this test depends on. - See FILE_DEPENDENCIES above. - %{build} Expands to a command-line that builds the current source file with the %{flags}, %{compile_flags} and %{link_flags} @@ -273,7 +260,7 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): "%dbg(COMPILED WITH) %{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe", "%dbg(EXECUTED AS) %{exec} ! %t.exe" ] - return self._executeShTest(test, litConfig, steps, fileDependencies=['%t.exe']) + return self._executeShTest(test, litConfig, steps) elif filename.endswith('.verify.cpp'): if not supportsVerify: return lit.Test.Result(lit.Test.UNSUPPORTED, @@ -291,7 +278,7 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): "%dbg(COMPILED WITH) %{cxx} %s %{flags} %{compile_flags} %{link_flags} -o %t.exe", "%dbg(EXECUTED AS) %{exec} %t.exe" ] - return self._executeShTest(test, litConfig, steps, fileDependencies=['%t.exe']) + return self._executeShTest(test, litConfig, steps) # This is like a .verify.cpp test when clang-verify is supported, # otherwise it's like a .compile.fail.cpp test. This is only provided # for backwards compatibility with the test suite. @@ -313,11 +300,11 @@ class CxxStandardLibraryTest(lit.formats.TestFormat): string = ' '.join(flags) config.substitutions = [(s, x + ' ' + string) if s == '%{compile_flags}' else (s, x) for (s, x) in config.substitutions] - def _executeShTest(self, test, litConfig, steps, fileDependencies=None): + def _executeShTest(self, test, litConfig, steps): if test.config.unsupported: return lit.Test.Result(lit.Test.UNSUPPORTED, 'Test is unsupported') - script = parseScript(test, steps, fileDependencies or []) + script = parseScript(test, steps) if isinstance(script, lit.Test.Result): return script diff --git a/libcxx/utils/run.py b/libcxx/utils/run.py index 0453e4a..e91836b 100644 --- a/libcxx/utils/run.py +++ b/libcxx/utils/run.py @@ -13,8 +13,6 @@ program's error code. """ import argparse -import os -import shutil import subprocess import sys @@ -23,7 +21,6 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('--execdir', type=str, required=True) parser.add_argument('--codesign_identity', type=str, required=False, default=None) - parser.add_argument('--dependencies', type=str, nargs='*', required=False, default=[]) parser.add_argument('--env', type=str, nargs='*', required=False, default=dict()) (args, remaining) = parser.parse_known_args(sys.argv[1:]) @@ -43,24 +40,8 @@ def main(): # Extract environment variables into a dictionary env = {k : v for (k, v) in map(lambda s: s.split('=', 1), args.env)} - # Create the execution directory, and make sure we remove it at the end. - try: - os.makedirs(args.execdir) - - # Ensure the file dependencies exist and copy them to the execution directory. - for dep in args.dependencies: - if not os.path.exists(dep): - sys.stderr.write('Missing file or directory "{}" marked as a dependency of a test'.format(dep)) - exit(1) - if os.path.isdir(dep): - shutil.copytree(dep, os.path.join(args.execdir, os.path.basename(dep)), symlinks=True) - else: - shutil.copy2(dep, args.execdir) - - # Run the command line with the given environment in the execution directory. - return subprocess.call(subprocess.list2cmdline(commandLine), cwd=args.execdir, env=env, shell=True) - finally: - shutil.rmtree(args.execdir) + # Run the command line with the given environment in the execution directory. + return subprocess.call(subprocess.list2cmdline(commandLine), cwd=args.execdir, env=env, shell=True) if __name__ == '__main__': diff --git a/libcxx/utils/ssh.py b/libcxx/utils/ssh.py index 50c6f45..314b13b 100644 --- a/libcxx/utils/ssh.py +++ b/libcxx/utils/ssh.py @@ -25,8 +25,8 @@ import tempfile def main(): parser = argparse.ArgumentParser() parser.add_argument('--host', type=str, required=True) + parser.add_argument('--execdir', type=str, required=True) parser.add_argument('--codesign_identity', type=str, required=False, default=None) - parser.add_argument('--dependencies', type=str, nargs='*', required=False, default=[]) parser.add_argument('--env', type=str, nargs='*', required=False, default=dict()) (args, remaining) = parser.parse_known_args(sys.argv[1:]) @@ -40,6 +40,7 @@ def main(): scp = lambda src, dst: ['scp', '-q', '-oBatchMode=yes', src, '{}:{}'.format(args.host, dst)] # Create a temporary directory where the test will be run. + # That is effectively the value of %T on the remote host. tmp = subprocess.check_output(ssh('mktemp -d /tmp/libcxx.XXXXXXXXXX'), universal_newlines=True).strip() # HACK: @@ -58,16 +59,12 @@ def main(): for exe in filter(isTestExe, commandLine): subprocess.check_call(['xcrun', 'codesign', '-f', '-s', args.codesign_identity, exe], env={}) - # Ensure the test dependencies exist, tar them up and copy the tarball - # over to the remote host. + # tar up the execution directory (which contains everything that's needed + # to run the test), and copy the tarball over to the remote host. try: tmpTar = tempfile.NamedTemporaryFile(suffix='.tar', delete=False) with tarfile.open(fileobj=tmpTar, mode='w') as tarball: - for dep in args.dependencies: - if not os.path.exists(dep): - sys.stderr.write('Missing file or directory "{}" marked as a dependency of a test'.format(dep)) - return 1 - tarball.add(dep, arcname=os.path.basename(dep)) + tarball.add(args.execdir, arcname=os.path.basename(args.execdir)) # Make sure we close the file before we scp it, because accessing # the temporary file while still open doesn't work on Windows. @@ -82,7 +79,7 @@ def main(): # Untar the dependencies in the temporary directory and remove the tarball. remoteCommands = [ - 'tar -xf {} -C {}'.format(remoteTarball, tmp), + 'tar -xf {} -C {} --strip-components 1'.format(remoteTarball, tmp), 'rm {}'.format(remoteTarball) ] @@ -95,8 +92,7 @@ def main(): # Execute the command through SSH in the temporary directory, with the # correct environment. We tweak the command line to run it on the remote # host by transforming the path of test-executables to their path in the - # temporary directory, where we know they have been copied when we handled - # test dependencies above. + # temporary directory on the remote host. commandLine = (pathOnRemote(x) if isTestExe(x) else x for x in commandLine) remoteCommands.append('cd {}'.format(tmp)) if args.env: diff --git a/libcxxabi/test/incomplete_type.sh.cpp b/libcxxabi/test/incomplete_type.sh.cpp index 20deb16..41d003a 100644 --- a/libcxxabi/test/incomplete_type.sh.cpp +++ b/libcxxabi/test/incomplete_type.sh.cpp @@ -19,7 +19,6 @@ // in the system libc++abi installation on OS X. (DYLD_LIBRARY_PATH is ignored // for shell tests because of Apple security features). -// FILE_DEPENDENCIES: %t.exe // RUN: %{cxx} %{flags} %{compile_flags} -Wno-unreachable-code -c %s -o %t.one.o // RUN: %{cxx} %{flags} %{compile_flags} -Wno-unreachable-code -c %s -o %t.two.o -DTU_ONE // RUN: %{cxx} %{flags} %t.one.o %t.two.o %{link_libcxxabi} %{link_flags} -o %t.exe