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 --- 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 @@ -12,6 +12,7 @@ // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stderr.sh // RUN: %{build} // RUN: %{exec} bash check-stderr.sh "%t.exe" "1234" 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 --- 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 @@ -10,6 +10,7 @@ // istream cin; +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../send-stdin.sh // RUN: %{build} // RUN: %{exec} bash send-stdin.sh "%t.exe" "1234" 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 --- 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 @@ -12,6 +12,7 @@ // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stderr.sh // RUN: %{build} // RUN: %{exec} bash check-stderr.sh "%t.exe" "1234" 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 --- 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,6 +12,7 @@ // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stdout.sh // RUN: %{build} // RUN: %{exec} bash check-stdout.sh "%t.exe" "1234" 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 --- 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 @@ -13,6 +13,7 @@ // XFAIL: libcpp-has-no-wide-characters // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stderr.sh // RUN: %{build} // RUN: %{exec} bash check-stderr.sh "%t.exe" "1234" 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 --- 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,6 +12,7 @@ // XFAIL: libcpp-has-no-wide-characters +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../send-stdin.sh // RUN: %{build} // RUN: %{exec} bash send-stdin.sh "%t.exe" "1234" 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 --- 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 @@ -13,6 +13,7 @@ // XFAIL: libcpp-has-no-wide-characters // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stderr.sh // RUN: %{build} // RUN: %{exec} bash check-stderr.sh "%t.exe" "1234" 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 --- 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 @@ -13,6 +13,7 @@ // XFAIL: libcpp-has-no-wide-characters // XFAIL: LIBCXX-WINDOWS-FIXME +// UNSUPPORTED: executor-has-no-bash // FILE_DEPENDENCIES: ../check-stdout.sh // RUN: %{build} // RUN: %{exec} bash check-stdout.sh "%t.exe" "1234" diff --git a/libcxx/utils/libcxx/test/dsl.py b/libcxx/utils/libcxx/test/dsl.py --- a/libcxx/utils/libcxx/test/dsl.py +++ b/libcxx/utils/libcxx/test/dsl.py @@ -168,6 +168,18 @@ ]) return exitCode == 0 +@_memoizeExpensiveOperation(lambda c, s: (c.substitutions, c.environment, s)) +def runScriptExitCode(config, script): + """ + Runs the given script as a Lit test, and returns the exit code of the execution. + + The script must be a list of commands, each of which being something that + could appear on the right-hand-side of a `RUN:` keyword. + """ + with _makeConfigTest(config) as test: + _, _, exitCode, _ = _executeScriptInternal(test, script) + return exitCode + @_memoizeExpensiveOperation(lambda c, l: (c.substitutions, c.environment, l)) def hasAnyLocale(config, locales): """ diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -72,6 +72,11 @@ void f() { new int(3); } """, ['-shared'])), + # Whether Bash can run on the executor. + # This is not always the case, for example when running on embedded systems. + Feature(name='executor-has-no-bash', + when=lambda cfg: runScriptExitCode(cfg, ['%{exec} bash --version']) != 0), + Feature(name='apple-clang', when=_isAppleClang), Feature(name=lambda cfg: 'apple-clang-{__clang_major__}'.format(**compilerMacros(cfg)), when=_isAppleClang), Feature(name=lambda cfg: 'apple-clang-{__clang_major__}.{__clang_minor__}'.format(**compilerMacros(cfg)), when=_isAppleClang),