diff --git a/README.md b/README.md index b7d5c837fe46f..7283b327c0cae 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ compiler crashes. 2. Specify the local toolchain for Xcode's use via `Xcode->Toolchains`. + ### Build Failures Try the suggestions in diff --git a/utils/swift_build_support/swift_build_support/products/cmark.py b/utils/swift_build_support/swift_build_support/products/cmark.py index bde199b37e0de..1408a7462a986 100644 --- a/utils/swift_build_support/swift_build_support/products/cmark.py +++ b/utils/swift_build_support/swift_build_support/products/cmark.py @@ -12,6 +12,7 @@ from . import cmake_product from . import earlyswiftdriver +from .. import shell class CMark(cmake_product.CMakeProduct): @@ -94,8 +95,13 @@ def test(self, host_target): # Xcode generator uses "RUN_TESTS" instead of "test". results_targets = ['RUN_TESTS'] - self.test_with_cmake(executable_target, results_targets, - self.args.cmark_build_variant, []) + test_env = { + "CTEST_OUTPUT_ON_FAILURE": "ON" + } + + with shell.pushenv(test_env): + self.test_with_cmake(executable_target, results_targets, + self.args.cmark_build_variant, []) def should_install(self, host_target): """should_install() -> Bool diff --git a/utils/swift_build_support/swift_build_support/shell.py b/utils/swift_build_support/swift_build_support/shell.py index 222d540dd2c95..1198b8b230026 100644 --- a/utils/swift_build_support/swift_build_support/shell.py +++ b/utils/swift_build_support/swift_build_support/shell.py @@ -162,6 +162,29 @@ def pushd(path, dry_run=None, echo=True): if not dry_run: os.chdir(old_dir) +@contextmanager +def pushenv(env, dry_run=None, echo=True): + saved_env = {} + for name in env.keys(): + if dry_run or echo: + _echo_command(dry_run, ['export', name + '=' + env[name]]) + if not dry_run: + if name in os.environ: + saved_env[name] = os.environ[name] + os.environ[name] = env[name] + yield + for name in env.keys(): + if name in saved_env: + if dry_run or echo: + _echo_command(dry_run, ['export', name + '=' + saved_env[name]]) + if not dry_run: + os.environ[name] = saved_env[name] + else: + if dry_run or echo: + _echo_command(dry_run, ['unset', name]) + if not dry_run: + del os.environ[name] + def makedirs(path, dry_run=None, echo=True): dry_run = _coerce_dry_run(dry_run)