Index: libcxx/docs/BuildingLibcxx.rst =================================================================== --- libcxx/docs/BuildingLibcxx.rst +++ libcxx/docs/BuildingLibcxx.rst @@ -98,21 +98,9 @@ ~~~~~~~~~~~~~~~~~~~~ Building with ninja is required for development to enable tests. -Running the tests also requires a Bash shell and Python to be available. - -If Git for Windows is available, that can be used to provide the bash -shell by adding the right bin directory to the path, e.g. -``set PATH=%PATH%;C:\Program Files\Git\usr\bin``. - -Alternatively, one can also choose to run the whole build in a MSYS2 -shell. That can be set up e.g. by starting a Visual Studio Tools Command -Prompt (for getting the environment variables pointing to the headers and -import libraries), and making sure that clang-cl is available in the -path. From there, launch an MSYS2 shell via e.g. -``C:\msys64\msys2_shell.cmd -full-path -mingw64`` (preserving the earlier -environment, allowing the MSVC headers/libraries and clang-cl to be found). - -In either case, then run: +Running the tests also requires Python to be available. The tests can +utilize a Bash shell if it happens to be available in the path, but +it's not strictly required. .. code-block:: batch Index: libcxx/utils/ci/buildkite-pipeline.yml =================================================================== --- libcxx/utils/ci/buildkite-pipeline.yml +++ libcxx/utils/ci/buildkite-pipeline.yml @@ -40,365 +40,13 @@ - exit_status: -1 # Agent was lost limit: 2 - - label: "C++11" - command: "libcxx/utils/ci/run-buildbot generic-cxx11" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "C++14" - command: "libcxx/utils/ci/run-buildbot generic-cxx14" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "C++17" - command: "libcxx/utils/ci/run-buildbot generic-cxx17" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "C++20" - command: "libcxx/utils/ci/run-buildbot generic-cxx20" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "C++2b" - command: "libcxx/utils/ci/run-buildbot generic-cxx2b" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "-fno-exceptions" - command: "libcxx/utils/ci/run-buildbot generic-noexceptions" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "GCC/C++20" - command: "libcxx/utils/ci/run-buildbot generic-gcc" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "ASAN" - command: "libcxx/utils/ci/run-buildbot generic-asan" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "TSAN" - command: "libcxx/utils/ci/run-buildbot generic-tsan" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "UBSAN" - command: "libcxx/utils/ci/run-buildbot generic-ubsan" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "With LLVM's libunwind" - command: "libcxx/utils/ci/run-buildbot generic-with_llvm_unwinder" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Single-threaded" - command: "libcxx/utils/ci/run-buildbot generic-singlethreaded" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "No debug mode" - command: "libcxx/utils/ci/run-buildbot generic-nodebug" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "No Filesystem" - command: "libcxx/utils/ci/run-buildbot generic-no-filesystem" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "No random device" - command: "libcxx/utils/ci/run-buildbot generic-no-random_device" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "No locale" - command: "libcxx/utils/ci/run-buildbot generic-no-localization" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "MacOS C++20" - command: "libcxx/utils/ci/run-buildbot generic-cxx20" - artifact_paths: - - "**/test-results.xml" - - "**/*.abilist" - agents: - queue: "libcxx-builders-macos" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Benchmarks" - command: "libcxx/utils/ci/run-buildbot benchmarks" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Documentation" - command: "libcxx/utils/ci/run-buildbot documentation" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Legacy standalone build" - command: "libcxx/utils/ci/run-buildbot legacy-standalone" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Unified standalone build" - command: "libcxx/utils/ci/run-buildbot unified-standalone" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - # All jobs defined before this `wait` will run whenever a CI job is started. - # Jobs defined after the `wait` will run only if all the jobs above succeeded. - # We use this to reduce the load on testers that have more constrained resources - # and avoid running builds that we know fail anyway. - - wait - - # Build with the configuration we use to generate libc++.dylib on Apple platforms - - label: "Apple system" - command: "libcxx/utils/ci/run-buildbot x86_64-apple-system" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-macos" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Apple system -fno-exceptions" - command: "libcxx/utils/ci/run-buildbot x86_64-apple-system-noexceptions" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-macos" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - # TODO: Re-enable those as soon as Green Dragon is back online. Currently, - # all the jobs are failing when they try to pull the older dylibs from - # Green Dragon, which is down. - # # Test back-deployment to older Apple platforms - # - label: "Apple back-deployment macosx10.9" - # command: "libcxx/utils/ci/run-buildbot x86_64-apple-system-backdeployment-10.9" - # artifact_paths: - # - "**/test-results.xml" - # agents: - # queue: "libcxx-builders-macos10.15" # TODO: For now, we're running the back-deployment tests for 10.9 on 10.15, because we don't have proper 10.9 machines - # retry: - # automatic: - # - exit_status: -1 # Agent was lost - # limit: 2 - - # - label: "Apple back-deployment macosx10.15" - # command: "libcxx/utils/ci/run-buildbot x86_64-apple-system-backdeployment-10.15" - # artifact_paths: - # - "**/test-results.xml" - # agents: - # queue: "libcxx-builders-macos10.15" - # retry: - # automatic: - # - exit_status: -1 # Agent was lost - # limit: 2 - - - label: "AArch64" - command: "libcxx/utils/ci/run-buildbot aarch64" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-linaro-arm" - arch: "aarch64" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "AArch64 -fno-exceptions" - command: "libcxx/utils/ci/run-buildbot aarch64-noexceptions" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-linaro-arm" - arch: "aarch64" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Armv8" - command: "libcxx/utils/ci/run-buildbot armv8" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-linaro-arm" - arch: "armv8l" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Armv8 -fno-exceptions" - command: "libcxx/utils/ci/run-buildbot armv8-noexceptions" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-linaro-arm" - arch: "armv8l" - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Armv7" - command: "libcxx/utils/ci/run-buildbot armv7" - artifact_paths: - - "**/test-results.xml" - agents: - queue: "libcxx-builders-linaro-arm" - arch: "armv8l" # Compiling for v7, running on v8 hardware - retry: - automatic: - - exit_status: -1 # Agent was lost - limit: 2 - - - label: "Armv7 -fno-exceptions" - command: "libcxx/utils/ci/run-buildbot armv7-noexceptions" + - label: "Windows" +# command: "libcxx\\utils\\ci\\run-buildbot-win.bat" + command: "\"\\Program Files\\Git\\usr\\bin\\bash\" libcxx/utils/ci/run-buildbot generic-win" artifact_paths: - "**/test-results.xml" agents: - queue: "libcxx-builders-linaro-arm" - arch: "armv8l" # Compiling for v7, running on v8 hardware + queue: "windows" retry: automatic: - exit_status: -1 # Agent was lost Index: libcxx/utils/ci/run-buildbot =================================================================== --- libcxx/utils/ci/run-buildbot +++ libcxx/utils/ci/run-buildbot @@ -348,6 +348,29 @@ check-cxx-cxxabi ;; +generic-win) + clean + echo "--- Generating CMake" + # -D_LIBCPP_HAS_NO_INT128 allows building filesystem with a MSVC + # setup that lacks the necessary builtins for int128. + # -DLIBCXX_TEST_LINKER_FLAGS="-loldnames" allows building some tests + # (in particular, filesystem tests) that rely on that library being + # linked implicitly. With Clang 12.0, -loldnames is properly linked in + # implicitly in this case and this line can be dropped. + cmake -S "${MONOREPO_ROOT}/libcxx" \ + -B "${BUILD_DIR}" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER=clang-cl \ + -DCMAKE_CXX_COMPILER=clang-cl \ + -DLLVM_LIT_ARGS="-sv --show-unsupported --xunit-xml-output test-results.xml" \ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO \ + -DLIBCXX_ENABLE_FILESYSTEM=YES \ + -DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_NO_INT128" \ + -DLIBCXX_TEST_LINKER_FLAGS="-loldnames" + echo "+++ Running the libc++ tests" + ${NINJA} -C "${BUILD_DIR}" check-cxx +;; legacy-standalone) export CC=clang export CXX=clang++ Index: libcxx/utils/ci/run-buildbot-win.bat =================================================================== --- /dev/null +++ libcxx/utils/ci/run-buildbot-win.bat @@ -0,0 +1,29 @@ +@echo off +rem #===-------------------------------------------------------------------===## +rem +rem Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +rem See https://llvm.org/LICENSE.txt for license information. +rem SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +rem +rem #===-------------------------------------------------------------------===## + +rem -D_LIBCPP_HAS_NO_INT128 allows building filesystem with a MSVC +rem setup that lacks the necessary builtins for int128. +rem -DLIBCXX_TEST_LINKER_FLAGS="-loldnames" allows building some tests +rem (in particular, filesystem tests) that rely on that library being +rem linked implicitly. With Clang 12.0, -loldnames is properly linked in +rem implicitly in this case and this line can be dropped. + +mkdir build +cd build +cmake -S "../libcxx" ^ + -GNinja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DLLVM_LIT_ARGS="-sv --show-unsupported --xunit-xml-output test-results.xml" ^ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO ^ + -DLIBCXX_ENABLE_FILESYSTEM=YES ^ + -DCMAKE_C_COMPILER=clang-cl ^ + -DCMAKE_CXX_COMPILER=clang-cl ^ + -DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_NO_INT128" ^ + -DLIBCXX_TEST_LINKER_FLAGS="-loldnames" +ninja check-cxx Index: libcxx/utils/libcxx/test/config.py =================================================================== --- libcxx/utils/libcxx/test/config.py +++ libcxx/utils/libcxx/test/config.py @@ -265,6 +265,9 @@ elif re.match(r'^arm.*', target_triple): self.config.available_features.add('target-arm') + if self.lit_config.getBashPath(): + self.config.available_features.add('bash') + def configure_compile_flags(self): self.configure_default_compile_flags() # Configure extra flags Index: libcxx/utils/libcxx/test/dsl.py =================================================================== --- libcxx/utils/libcxx/test/dsl.py +++ libcxx/utils/libcxx/test/dsl.py @@ -45,7 +45,7 @@ TODO: This really should be easier to access from Lit itself """ - parsedCommands = libcxx.test.format.parseScript(test, preamble=commands) + parsedCommands = libcxx.test.format.parseScript(test, preamble=commands, useExternalSh=True) litConfig = lit.LitConfig.LitConfig( progname='lit', Index: libcxx/utils/libcxx/test/format.py =================================================================== --- libcxx/utils/libcxx/test/format.py +++ libcxx/utils/libcxx/test/format.py @@ -46,7 +46,7 @@ for s in ['%{cxx}', '%{compile_flags}', '%{link_flags}', '%{flags}', '%{exec}']: assert s in substitutions, "Required substitution {} was not provided".format(s) -def parseScript(test, preamble): +def parseScript(test, preamble, useExternalSh): """ Extract the script from a test, with substitutions applied. @@ -64,7 +64,6 @@ # Get the default substitutions tmpDir, tmpBase = _getTempPaths(test) - useExternalSh = True substitutions = lit.TestRunner.getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=useExternalSh) @@ -297,7 +296,8 @@ if test.config.unsupported: return lit.Test.Result(lit.Test.UNSUPPORTED, 'Test is unsupported') - script = parseScript(test, steps) + useExternalSh = False + script = parseScript(test, steps, useExternalSh) if isinstance(script, lit.Test.Result): return script @@ -305,5 +305,4 @@ return lit.Test.Result(lit.Test.XFAIL if test.isExpectedToFail() else lit.Test.PASS) else: _, tmpBase = _getTempPaths(test) - useExternalSh = True return lit.TestRunner._runShTest(test, litConfig, useExternalSh, script, tmpBase) Index: llvm/utils/lit/lit/TestRunner.py =================================================================== --- llvm/utils/lit/lit/TestRunner.py +++ llvm/utils/lit/lit/TestRunner.py @@ -608,6 +608,7 @@ assert isinstance(cmd, ShUtil.Pipeline) procs = [] + negate_procs = [] default_stdin = subprocess.PIPE stderrTempFiles = [] opened_files = [] @@ -653,6 +654,12 @@ if not args: raise InternalShellError(j, "Error: 'not' requires a" " subcommand") + elif args[0] == '!': + not_args.append(args.pop(0)) + not_count += 1 + if not args: + raise InternalShellError(j, "Error: '!' requires a" + " subcommand") else: break @@ -699,7 +706,15 @@ # the assumptions that (1) environment variables are not intended to be # relevant to 'not' commands and (2) the 'env' command should always # blindly pass along the status it receives from any command it calls. - args = not_args + args + + # For plain negations, either 'not' without '--crash', or the shell + # operator '!', leave them out from the command to execute and + # invert the result code afterwards. + if not_crash: + args = not_args + args + not_count = 0 + else: + not_args = [] stdin, stdout, stderr = processRedirects(j, default_stdin, cmd_shenv, opened_files) @@ -763,6 +778,7 @@ stderr = stderr, env = cmd_shenv.env, close_fds = kUseCloseFDs)) + negate_procs.append((not_count % 2) != 0) # Let the helper know about this process timeoutHelper.addProcess(procs[-1]) except OSError as e: @@ -815,6 +831,8 @@ # Detect Ctrl-C in subprocess. if res == -signal.SIGINT: raise KeyboardInterrupt + if negate_procs[i]: + res = not res # Ensure the resulting output is always of string type. try: