diff --git a/libcxx/utils/ci/buildkite-pipeline-clang.yml b/clang/utils/ci/buildkite-pipeline.yml rename from libcxx/utils/ci/buildkite-pipeline-clang.yml rename to clang/utils/ci/buildkite-pipeline.yml --- a/libcxx/utils/ci/buildkite-pipeline-clang.yml +++ b/clang/utils/ci/buildkite-pipeline.yml @@ -19,7 +19,7 @@ steps: - label: "Format" commands: - - "! grep -rnI '[[:blank:]]$' clang/lib clang/include clang/docs || false" + - "clang/utils/ci/run-buildbot check-format" agents: queue: "libcxx-builders" @@ -34,15 +34,7 @@ - label: "Building clang" commands: - - "mkdir install" - # We use Release here to avoid including debug information. Otherwise, the clang binary is very large, which - # is problematic because we need to upload the artifacts for other jobs to use. This may seem like nothing, - # but with the number of jobs we run daily, this can result in thousands of GB of network I/O. - - "cmake -S llvm -B build -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=\"ccache\" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DLLVM_ENABLE_PROJECTS=\"clang;compiler-rt\"" - - "ninja -C build install-clang install-clang-resource-headers" - - "ccache -s" - - "tar -cJvf install.tar.xz install/" - - "buildkite-agent artifact upload --debug install.tar.xz" + - "clang/utils/ci/run-buildbot build-clang" env: CC: "clang-${LLVM_HEAD_VERSION}" CXX: "clang++-${LLVM_HEAD_VERSION}" @@ -59,12 +51,7 @@ - label: "C++03" commands: - - "buildkite-agent artifact download install.tar.xz ." - - "tar -xvf install.tar.xz" - - "export CC=$(pwd)/install/bin/clang" - - "export CXX=$(pwd)/install/bin/clang++" - - "chmod +x install/bin/clang install/bin/clang++" - - "libcxx/utils/ci/run-buildbot generic-cxx03" + - "clang/utils/ci/run-buildbot generic-cxx03" artifact_paths: - "**/test-results.xml" - "**/crash_diagnostics/*" @@ -82,12 +69,7 @@ - label: "C++26" commands: - - "buildkite-agent artifact download install.tar.xz ." - - "tar -xvf install.tar.xz" - - "export CC=$(pwd)/install/bin/clang" - - "export CXX=$(pwd)/install/bin/clang++" - - "chmod +x install/bin/clang install/bin/clang++" - - "libcxx/utils/ci/run-buildbot generic-cxx26" + - "clang/utils/ci/run-buildbot generic-cxx26" artifact_paths: - "**/test-results.xml" - "**/crash_diagnostics/*" @@ -105,12 +87,7 @@ - label: "Modules" commands: - - "buildkite-agent artifact download install.tar.xz ." - - "tar -xvf install.tar.xz" - - "export CC=$(pwd)/install/bin/clang" - - "export CXX=$(pwd)/install/bin/clang++" - - "chmod +x install/bin/clang install/bin/clang++" - - "libcxx/utils/ci/run-buildbot generic-modules" + - "clang/utils/ci/run-buildbot generic-modules" artifact_paths: - "**/test-results.xml" - "**/crash_diagnostics/*" diff --git a/clang/utils/ci/run-buildbot b/clang/utils/ci/run-buildbot new file mode 100755 --- /dev/null +++ b/clang/utils/ci/run-buildbot @@ -0,0 +1,170 @@ +#!/usr/bin/env bash +#===----------------------------------------------------------------------===## +# +# 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 +# +#===----------------------------------------------------------------------===## + +set -ex +set -o pipefail +unset LANG +unset LC_ALL +unset LC_COLLATE + +PROGNAME="$(basename "${0}")" + +function usage() { +cat < + +[-h|--help] Display this help and exit. + +--llvm-root Path to the root of the LLVM monorepo. By default, we try + to figure it out based on the current working directory. + +--build-dir The directory to use for building the library. By default, + this is '/build/'. + +--osx-roots Path to pre-downloaded macOS dylibs. By default, we download + them from Green Dragon. This is only relevant at all when + running back-deployment testing if one wants to override + the old dylibs we use to run the tests with different ones. +Environment variables +CC The C compiler to use, this value is used by CMake. This + variable is optional. + +CXX The C++ compiler to use, this value is used by CMake. This + variable is optional. + +CMAKE The CMake binary to use. This variable is optional. +EOF +} + +if [[ $# == 0 ]]; then + usage + exit 0 +fi + +while [[ $# -gt 0 ]]; do + case ${1} in + -h|--help) + usage + exit 0 + ;; + --llvm-root) + MONOREPO_ROOT="${2}" + shift; shift + ;; + --build-dir) + BUILD_DIR="${2}" + shift; shift + ;; + --osx-roots) + OSX_ROOTS="${2}" + shift; shift + ;; + *) + BUILDER="${1}" + shift + ;; + esac +done + +MONOREPO_ROOT="${MONOREPO_ROOT:="$(git rev-parse --show-toplevel)"}" +BUILD_DIR="${BUILD_DIR:=${MONOREPO_ROOT}/build/${BUILDER}}" +INSTALL_DIR="${BUILD_DIR}/install" + +# If we can find Ninja/CMake provided by Xcode, use those since we know their +# version will generally work with the Clang shipped in Xcode (e.g. if Clang +# knows about -std=c++20, the CMake bundled in Xcode will probably know about +# that flag too). +if xcrun --find ninja &>/dev/null; then + NINJA="$(xcrun --find ninja)" +elif which ninja &>/dev/null; then + # The current implementation of modules needs the absolute path to the ninja + # binary. + # TODO MODULES Is this still needed when CMake has libc++ module support? + NINJA="$(which ninja)" +else + NINJA="ninja" +fi + +if [ -z "${CMAKE}" ]; then + if xcrun --find cmake &>/dev/null; then + CMAKE="$(xcrun --find cmake)" + else + CMAKE="cmake" + fi +fi + +# Print the version of a few tools to aid diagnostics in some cases +${CMAKE} --version +${NINJA} --version + +if [ ! -z "${CXX}" ]; then ${CXX} --version; fi + +case "${BUILDER}" in +check-format) + ! grep -rnI '[[:blank:]]$' clang/lib clang/include clang/docs +;; +build-clang) + mkdir install + # We use Release here to avoid including debug information. Otherwise, the + # clang binary is very large, which is problematic because we need to upload + # the artifacts for other jobs to use. This may seem like nothing, but with + # the number of jobs we run daily, this can result in thousands of GB of + # network I/O. + cmake \ + -S llvm \ + -B build \ + -G Ninja \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=install \ + -DLLVM_ENABLE_PROJECTS="clang;compiler-rt" \ + + ninja -C build install-clang install-clang-resource-headers + ccache -s + tar -cJvf install.tar.xz install/ + buildkite-agent artifact upload --debug install.tar.xz +;; +generic-cxx03) + buildkite-agent artifact download install.tar.xz . + tar -xvf install.tar.xz + export CC=$(pwd)/install/bin/clang + export CXX=$(pwd)/install/bin/clang++ + chmod +x install/bin/clang install/bin/clang++ + libcxx/utils/ci/run-buildbot generic-cxx03 +;; +generic-cxx26) + buildkite-agent artifact download install.tar.xz . + tar -xvf install.tar.xz + export CC=$(pwd)/install/bin/clang + export CXX=$(pwd)/install/bin/clang++ + chmod +x install/bin/clang install/bin/clang++ + libcxx/utils/ci/run-buildbot generic-cxx26 +;; +generic-modules) + buildkite-agent artifact download install.tar.xz . + tar -xvf install.tar.xz + export CC=$(pwd)/install/bin/clang + export CXX=$(pwd)/install/bin/clang++ + chmod +x install/bin/clang install/bin/clang++ + libcxx/utils/ci/run-buildbot generic-modules +;; +################################################################# +# Insert vendor-specific internal configurations below. +# +# This allows vendors to extend this file with their own internal +# configurations without running into merge conflicts with upstream. +################################################################# + +################################################################# +*) + echo "${BUILDER} is not a known configuration" + exit 1 +;; +esac diff --git a/libcxx/utils/ci/generate-buildkite-pipeline b/libcxx/utils/ci/generate-buildkite-pipeline --- a/libcxx/utils/ci/generate-buildkite-pipeline +++ b/libcxx/utils/ci/generate-buildkite-pipeline @@ -11,16 +11,4 @@ # This script generates the appropriate libc++ CI pipeline based on which project(s) were changed. # -if git diff --name-only HEAD~1 | grep -q -E "^libcxx/|^libcxxabi/|^libunwind/|^runtimes/|^cmake/"; then - LIBCXX_CHANGED=true -fi - -if git diff --name-only HEAD~1 | grep -q -E "^clang/"; then - CLANG_CHANGED=true -fi - -if [[ "${CLANG_CHANGED}" == "true" && "${LIBCXX_CHANGED}" != "true" ]]; then - cat libcxx/utils/ci/buildkite-pipeline-clang.yml -else - cat libcxx/utils/ci/buildkite-pipeline.yml -fi +cat libcxx/utils/ci/buildkite-pipeline-clang.yml diff --git a/libcxx/utils/ci/run-buildbot b/libcxx/utils/ci/run-buildbot --- a/libcxx/utils/ci/run-buildbot +++ b/libcxx/utils/ci/run-buildbot @@ -203,6 +203,9 @@ # Check if the diff is empty, fail otherwise. ! grep -q '^--- a' ${BUILD_DIR}/clang-format.patch ;; +check-format-clang) + ! grep -rnI '[[:blank:]]$' clang/lib clang/include clang/docs +;; check-generated-output) # `! foo` doesn't work properly with `set -e`, use `! foo || false` instead. # https://stackoverflow.com/questions/57681955/set-e-does-not-respect-logical-not