From 8b5e5ecafe82e37df0198443311fabacbc1259da Mon Sep 17 00:00:00 2001 From: Alex Z Date: Thu, 14 Jul 2022 17:47:00 +0200 Subject: [PATCH] Change the build script to MUSL (#85) * Add the MUSL build script * Install ninja * Install the Rust target for MUSL * Install musl-gcc * Fix the LLVM output path * Fix the LLVM unit test path and target * Re-enable unit tests building * Remove the unit tests CI step Co-authored-by: Alex Z --- .github/workflows/compiler-benchmarks.yml | 7 +- .../workflows/compiler-integration-tests.yml | 13 +- build.sh | 258 ++++++++++-------- build_gnu.sh | 114 ++++++++ 4 files changed, 275 insertions(+), 117 deletions(-) create mode 100755 build_gnu.sh diff --git a/.github/workflows/compiler-benchmarks.yml b/.github/workflows/compiler-benchmarks.yml index a6c70bc24097..15fdc2ff28e8 100644 --- a/.github/workflows/compiler-benchmarks.yml +++ b/.github/workflows/compiler-benchmarks.yml @@ -111,6 +111,11 @@ jobs: env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PK_BOT }} + - name: Preparing workspace. Installing additional packages. + run: | + ${DOCKER_CMD} sh -c 'apt install -y ninja-build musl musl-tools' + ${DOCKER_CMD} sh -c 'rustup target add x86_64-unknown-linux-musl' + - name: Preparing workspace. Setting docker ssh key. run: | ${DOCKER_CMD} sh -c 'mkdir -pv /root/.ssh' @@ -133,7 +138,7 @@ jobs: git config --global url."https://${{ secrets.COMPILER_TESTER_ACCESS_TOKEN }}:x-oauth-basic@github.com/".insteadOf ssh://git@github.com/ && \ git config --global url."https://${{ secrets.COMPILER_TESTER_ACCESS_TOKEN }}:x-oauth-basic@github.com/".insteadOf https://github.com/ && \ export LLVM_SYS_130_PREFIX=${HOME}/opt/llvm-${{ env.LLVM_BUILD_TYPE }}/ && \ - cargo run --release --bin compiler-tester -- --filter=${{ env.LLVM_BENCHMARK_FILTER }} --domain=${{ env.LLVM_BENCHMARK_DOMAIN }} --benchmark=candidate.json' + cargo run --release --target x86_64-unknown-linux-musl --bin compiler-tester -- --filter=${{ env.LLVM_BENCHMARK_FILTER }} --domain=${{ env.LLVM_BENCHMARK_DOMAIN }} --benchmark=candidate.json' - uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/compiler-integration-tests.yml b/.github/workflows/compiler-integration-tests.yml index d8cac95cdbfa..505e1202ad58 100644 --- a/.github/workflows/compiler-integration-tests.yml +++ b/.github/workflows/compiler-integration-tests.yml @@ -80,6 +80,11 @@ jobs: env: SSH_PRIVATE_KEY: ${{secrets.SSH_PK_BOT}} + - name: Preparing workspace. Installing additional packages. + run: | + ${DOCKER_CMD} sh -c 'apt install -y ninja-build musl musl-tools' + ${DOCKER_CMD} sh -c 'rustup target add x86_64-unknown-linux-musl' + - name: Preparing workspace. Setting docker ssh key. run: | ${DOCKER_CMD} sh -c 'mkdir -pv /root/.ssh' @@ -94,12 +99,6 @@ jobs: ${DOCKER_CMD} sh -c 'cd compiler-llvm && \ ./build.sh ${{ env.LLVM_BUILD_TYPE }}' - - name: Testing. Running regression LLVM tests. - run: | - ${DOCKER_CMD} sh -c ' - cd compiler-llvm/build-${{ env.LLVM_BUILD_TYPE }} && \ - make -j24 check-llvm-codegen-syncvm' - - name: Testing. Building and running compiler tester. id: compiler_tester_run run: | @@ -108,7 +107,7 @@ jobs: git config --global url."https://${{ secrets.COMPILER_TESTER_ACCESS_TOKEN }}:x-oauth-basic@github.com/".insteadOf ssh://git@github.com/ && \ git config --global url."https://${{ secrets.COMPILER_TESTER_ACCESS_TOKEN }}:x-oauth-basic@github.com/".insteadOf https://github.com/ && \ export LLVM_SYS_130_PREFIX=${HOME}/opt/llvm-${{ env.LLVM_BUILD_TYPE }}/ && \ - cargo run --verbose --release --bin compiler-tester' + cargo run --release --target x86_64-unknown-linux-musl --bin compiler-tester' compiler_exit_code=$? if [ "${compiler_exit_code}" -gt "1" ]; then echo "RUN_SEGFAULT_STEP=true" >> $GITHUB_ENV diff --git a/build.sh b/build.sh index 7ee80a329586..2afffe0ace60 100755 --- a/build.sh +++ b/build.sh @@ -1,111 +1,151 @@ #!/usr/bin/env bash -set -Cex - -# Target build: 'debug' | 'release' -case "${1}" in - debug) - export DIRECTORY_SUFFIX='debug' - export BUILD_TYPE='Debug' - ;; - release) - export DIRECTORY_SUFFIX='release' - export BUILD_TYPE='Release' - ;; - *) - export DIRECTORY_SUFFIX='release' - export BUILD_TYPE='Release' - ;; -esac - -if [[ "$OSTYPE" == "darwin"* ]]; then - if [[ -z ${CI_RUNNING+x} ]]; then - brew update - brew install cmake - fi - - cmake \ - -S 'llvm' \ - -B "build-${DIRECTORY_SUFFIX}/" \ - -G 'Unix Makefiles' \ - -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DLLVM_TARGETS_TO_BUILD='X86' \ - -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='SyncVM' \ - -DLLVM_OPTIMIZED_TABLEGEN='On' \ - -DLLVM_BUILD_DOCS='Off' \ - -DLLVM_INCLUDE_DOCS='Off' \ - -DLLVM_ENABLE_ASSERTIONS='On' \ - -DLLVM_ENABLE_DOXYGEN='Off' \ - -DLLVM_ENABLE_SPHINX='Off' \ - -DLLVM_ENABLE_OCAMLDOC='Off' \ - -DLLVM_ENABLE_BINDINGS='Off' - - cd "build-${DIRECTORY_SUFFIX}/" - make -j "$(sysctl -n hw.logicalcpu)" -elif [[ -f '/etc/arch-release' ]]; then - if [[ -z ${CI_RUNNING+x} ]]; then - sudo pacman --sync --refresh --sysupgrade --noconfirm \ - cmake \ - clang \ - lld - fi - - cmake \ - -S 'llvm' \ - -B "build-${DIRECTORY_SUFFIX}/" \ - -G 'Unix Makefiles' \ - -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DCMAKE_C_COMPILER='clang' \ - -DCMAKE_CXX_COMPILER='clang++' \ - -DLLVM_TARGETS_TO_BUILD='X86' \ - -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='SyncVM' \ - -DLLVM_OPTIMIZED_TABLEGEN='On' \ - -DLLVM_USE_LINKER='lld' \ - -DLLVM_BUILD_DOCS='Off' \ - -DLLVM_INCLUDE_DOCS='Off' \ - -DLLVM_ENABLE_ASSERTIONS='On' \ - -DLLVM_ENABLE_DOXYGEN='Off' \ - -DLLVM_ENABLE_SPHINX='Off' \ - -DLLVM_ENABLE_OCAMLDOC='Off' \ - -DLLVM_ENABLE_BINDINGS='Off' - - cd "build-${DIRECTORY_SUFFIX}/" - make -j "$(nproc)" -elif [[ "$OSTYPE" == "linux-gnu" ]]; then - if [[ -z ${CI_RUNNING+x} ]]; then - sudo apt --yes update - sudo apt --yes install \ - cmake \ - clang-11 \ - lld-11 - export LLVM_VERSION=11 - fi - - cmake \ - -S 'llvm' \ - -B "build-${DIRECTORY_SUFFIX}/" \ - -G 'Unix Makefiles' \ - -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DCMAKE_C_COMPILER="clang-${LLVM_VERSION}" \ - -DCMAKE_CXX_COMPILER="clang++-${LLVM_VERSION}" \ - -DLLVM_TARGETS_TO_BUILD='X86' \ - -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='SyncVM' \ - -DLLVM_OPTIMIZED_TABLEGEN='On' \ - -DLLVM_USE_LINKER="lld-${LLVM_VERSION}" \ - -DLLVM_BUILD_DOCS='Off' \ - -DLLVM_INCLUDE_DOCS='Off' \ - -DLLVM_ENABLE_ASSERTIONS='On' \ - -DLLVM_ENABLE_DOXYGEN='Off' \ - -DLLVM_ENABLE_SPHINX='Off' \ - -DLLVM_ENABLE_OCAMLDOC='Off' \ - -DLLVM_ENABLE_BINDINGS='Off' \ - -DPython3_EXECUTABLE=`which python3` - - cd "build-${DIRECTORY_SUFFIX}/" - make -j "$(nproc)" -fi - -sudo make install +set -ex + +ROOT_DIR="${PWD}" + +MUSL_NAME='musl-1.2.3' +MUSL_BUILD="${ROOT_DIR}/${MUSL_NAME}/build/" +MUSL_INSTALL="${HOME}/opt/musl/" + +CRT_BUILD="${ROOT_DIR}/build-crt/" +CRT_INSTALL="${ROOT_DIR}/opt/crt-musl/" + +HOST_BUILD="${ROOT_DIR}/build-host/" +HOST_INSTALL="${HOME}/opt/llvm-musl-host/" + +TARGET_BUILD="${ROOT_DIR}/build-target/" +TARGET_INSTALL="${HOME}/opt/llvm-release/" + + + +wget "https://git.musl-libc.org/cgit/musl/snapshot/${MUSL_NAME}.tar.gz" +tar -xvzf "${MUSL_NAME}.tar.gz" + +mkdir -pv "${MUSL_BUILD}" +cd "${MUSL_BUILD}" +../configure \ + --prefix="${MUSL_INSTALL}" \ + --syslibdir="${MUSL_INSTALL}/lib/" \ + --enable-wrapper='clang' +cd "${MUSL_BUILD}" +make -j "$(nproc)" +make install +cd "${ROOT_DIR}" + +mkdir -pv "${MUSL_INSTALL}/include/asm" +types_h="${MUSL_INSTALL}/include/asm/types.h" +cp -rfv '/usr/include/linux' "${MUSL_INSTALL}/include/" +cp -rfv /usr/include/asm-generic/* "${MUSL_INSTALL}/include/asm/" +sed -i 's/asm-generic/asm/' "${types_h}" + + + +cmake './llvm' \ + -B "${CRT_BUILD}" \ + -G 'Ninja' \ + -DCMAKE_C_COMPILER='clang' \ + -DCMAKE_CXX_COMPILER='clang++' \ + -DCMAKE_INSTALL_PREFIX="${CRT_INSTALL}" \ + -DCMAKE_BUILD_TYPE='Release' \ + -DLLVM_ENABLE_PROJECTS='compiler-rt' \ + -DLLVM_TARGETS_TO_BUILD='X86' \ + -DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl' \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' \ + -DLLVM_ENABLE_TERMINFO='Off' \ + -DCOMPILER_RT_DEFAULT_TARGET_ARCH='x86_64' \ + -DCOMPILER_RT_BUILD_CRT='On' \ + -DCOMPILER_RT_BUILD_SANITIZERS='Off' \ + -DCOMPILER_RT_BUILD_XRAY='Off' \ + -DCOMPILER_RT_BUILD_LIBFUZZER='Off' \ + -DCOMPILER_RT_BUILD_PROFILE='Off' \ + -DCOMPILER_RT_BUILD_MEMPROF='Off' \ + -DCOMPILER_RT_BUILD_ORC='Off' \ + -DCOMPILER_RT_BUILD_GWP_ASAN='Off' +ninja -C "${CRT_BUILD}" install-crt + + + +cmake './llvm' \ + -B "${HOST_BUILD}" \ + -G 'Ninja' \ + -DDEFAULT_SYSROOT="${MUSL_INSTALL}" \ + -DBUILD_SHARED_LIBS='Off' \ + -DCMAKE_C_COMPILER='clang' \ + -DCMAKE_CXX_COMPILER='clang++' \ + -DCMAKE_INSTALL_PREFIX="${HOST_INSTALL}" \ + -DCMAKE_BUILD_TYPE='Release' \ + -DCLANG_DEFAULT_CXX_STDLIB='libc++' \ + -DCLANG_DEFAULT_RTLIB='compiler-rt' \ + -DLLVM_DEFAULT_TARGET_TRIPLE='x86_64-pc-linux-musl' \ + -DLLVM_TARGETS_TO_BUILD='X86' \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' \ + -DLLVM_ENABLE_TERMINFO='Off' \ + -DLIBCXX_CXX_ABI='libcxxabi' \ + -DLIBCXX_HAS_MUSL_LIBC='On' \ + -DLIBCXX_ENABLE_SHARED='Off' \ + -DLIBCXX_ENABLE_STATIC='On' \ + -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY='On' \ + -DLIBCXXABI_ENABLE_SHARED='Off' \ + -DLIBCXXABI_ENABLE_STATIC='On' \ + -DLIBCXXABI_ENABLE_STATIC_UNWINDER='On' \ + -DLIBCXXABI_USE_LLVM_UNWINDER='On' \ + -DLIBCXXABI_USE_COMPILER_RT='On' \ + -DLIBUNWIND_ENABLE_STATIC='On' \ + -DLIBUNWIND_ENABLE_SHARED='Off' \ + -DCOMPILER_RT_BUILD_CRT='On' \ + -DCOMPILER_RT_BUILD_SANITIZERS='Off' \ + -DCOMPILER_RT_BUILD_XRAY='Off' \ + -DCOMPILER_RT_BUILD_LIBFUZZER='Off' \ + -DCOMPILER_RT_BUILD_PROFILE='Off' \ + -DCOMPILER_RT_BUILD_MEMPROF='Off' \ + -DCOMPILER_RT_BUILD_ORC='Off' \ + -DCOMPILER_RT_DEFAULT_TARGET_ARCH='x86_64' \ + -DCOMPILER_RT_DEFAULT_TARGET_ONLY='On' +cp -rfv "${CRT_INSTALL}/lib/"* "${HOST_BUILD}/lib/" +ninja -C "${HOST_BUILD}" install + + + +cmake './llvm' \ + -B "${TARGET_BUILD}" \ + -G 'Ninja' \ + -DBUILD_SHARED_LIBS='Off' \ + -DCMAKE_C_COMPILER="${HOST_INSTALL}/bin/clang" \ + -DCMAKE_CXX_COMPILER="${HOST_INSTALL}/bin/clang++" \ + -DCMAKE_INSTALL_PREFIX="${TARGET_INSTALL}" \ + -DCMAKE_BUILD_TYPE='Release' \ + -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \ + -DCMAKE_EXE_LINKER_FLAGS='-fuse-ld=lld -static' \ + -DLLVM_TARGETS_TO_BUILD='SyncVM' \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_PROJECTS='llvm' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' \ + -DLLVM_ENABLE_TERMINFO='Off' \ + -DLLVM_ENABLE_PIC='Off' +ninja -C "${TARGET_BUILD}" install diff --git a/build_gnu.sh b/build_gnu.sh new file mode 100755 index 000000000000..663bcdc91c15 --- /dev/null +++ b/build_gnu.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash + +set -Cex + +# Target build: 'debug' | 'release' +case "${1}" in + debug) + export DIRECTORY_SUFFIX='debug' + export BUILD_TYPE='Debug' + ;; + release) + export DIRECTORY_SUFFIX='release' + export BUILD_TYPE='Release' + ;; + *) + export DIRECTORY_SUFFIX='release' + export BUILD_TYPE='Release' + ;; +esac + +if [[ "$OSTYPE" == "darwin"* ]]; then + if [[ -z ${CI_RUNNING+x} ]]; then + brew update + brew install cmake + fi + + cmake \ + -S 'llvm' \ + -B "build-${DIRECTORY_SUFFIX}/" \ + -G 'Unix Makefiles' \ + -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DLLVM_TARGETS_TO_BUILD='SyncVM' \ + -DLLVM_OPTIMIZED_TABLEGEN='On' \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' + + cd "build-${DIRECTORY_SUFFIX}/" + make -j "$(sysctl -n hw.logicalcpu)" +elif [[ -f '/etc/arch-release' ]]; then + if [[ -z ${CI_RUNNING+x} ]]; then + sudo pacman --sync --refresh --sysupgrade --noconfirm \ + cmake \ + clang \ + lld + fi + + cmake \ + -S 'llvm' \ + -B "build-${DIRECTORY_SUFFIX}/" \ + -G 'Unix Makefiles' \ + -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DCMAKE_C_COMPILER='clang' \ + -DCMAKE_CXX_COMPILER='clang++' \ + -DLLVM_TARGETS_TO_BUILD='SyncVM' \ + -DLLVM_OPTIMIZED_TABLEGEN='On' \ + -DLLVM_USE_LINKER='lld' \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' + + cd "build-${DIRECTORY_SUFFIX}/" + make -j "$(nproc)" +elif [[ "$OSTYPE" == "linux-gnu" ]]; then + if [[ -z ${CI_RUNNING+x} ]]; then + sudo apt --yes update + sudo apt --yes install \ + cmake \ + clang-11 \ + lld-11 + export LLVM_VERSION=11 + fi + + cmake \ + -S 'llvm' \ + -B "build-${DIRECTORY_SUFFIX}/" \ + -G 'Unix Makefiles' \ + -DCMAKE_INSTALL_PREFIX="${HOME}/opt/llvm-${DIRECTORY_SUFFIX}/" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DCMAKE_C_COMPILER="clang-${LLVM_VERSION}" \ + -DCMAKE_CXX_COMPILER="clang++-${LLVM_VERSION}" \ + -DLLVM_TARGETS_TO_BUILD='SyncVM' \ + -DLLVM_OPTIMIZED_TABLEGEN='On' \ + -DLLVM_USE_LINKER="lld-${LLVM_VERSION}" \ + -DLLVM_BUILD_DOCS='Off' \ + -DLLVM_BUILD_TESTS='Off' \ + -DLLVM_INCLUDE_DOCS='Off' \ + -DLLVM_INCLUDE_TESTS='Off' \ + -DLLVM_ENABLE_ASSERTIONS='Off' \ + -DLLVM_ENABLE_DOXYGEN='Off' \ + -DLLVM_ENABLE_SPHINX='Off' \ + -DLLVM_ENABLE_OCAMLDOC='Off' \ + -DLLVM_ENABLE_BINDINGS='Off' \ + -DPython3_EXECUTABLE=`which python3` + + cd "build-${DIRECTORY_SUFFIX}/" + make -j "$(nproc)" +fi + +make install