From 69cfa7130f3f2bda838633071b1c63aa7d56f940 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Fri, 10 Nov 2023 06:07:25 -0800 Subject: [PATCH] Add CI on Github Actions for x86_64, aarch64, arm, ppc64 and s390x (#476) * Add CI on Github Actions for x86_64, aarch64, armhf, ppc64 and s390x * Disable -march=native for testervecabi - fails when compiling on a host CPU with AVX512f (#478) * Enable qemu features for s390x, ppc64, and arm * Add some architecture-specific cmake flags * Use job dependencies to avoid duplicating building native * Fix permissions in downloaded artifacts * Disable arm inline headers - don't work (#480) * Document why DISABLE_VXE2 on s390x --- .github/workflows/build_and_test.yml | 242 +++++++++++++++++++++++++++ Configure.cmake | 5 - src/libm-tester/CMakeLists.txt | 1 - travis/toolchain-ppc64el.cmake | 2 +- 4 files changed, 243 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/build_and_test.yml diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml new file mode 100644 index 00000000..3540b600 --- /dev/null +++ b/.github/workflows/build_and_test.yml @@ -0,0 +1,242 @@ + +name: "Build & Test" + +on: + # allow direct trigger + workflow_dispatch: + push: + pull_request: + +permissions: + contents: read + +env: + COMMON_CMAKE_FLAGS: | + -DSLEEF_SHOW_CONFIG=1 + -DDISABLE_SSL=ON + -DBUILD_GNUABI_LIBS=ON + -DBUILD_INLINE_HEADERS=ON + -DBUILD_DFT=ON + -DBUILD_QUAD=ON + -DBUILD_SCALAR_LIB=ON + -DBUILD_STATIC_TEST_BINS=ON + +jobs: + build-native: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.1 + with: + persist-credentials: false + + - name: Install dependencies + run: sudo apt-get update -y -qq && sudo apt-get install -y -qq build-essential clang curl ninja-build libgmp-dev libmpfr-dev + + - name: Build native + run: | + set -x + EXTRA_CMAKE_FLAGS="-DENFORCE_SSE2=ON -DENFORCE_SSE4=ON -DENFORCE_AVX=ON -DENFORCE_AVX=ON -DENFORCE_AVX2=ON -DENFORCE_AVX512F=ON -DENFORCE_FMA4=ON" + cmake -S . -B _build-native -GNinja \ + -DCMAKE_INSTALL_PREFIX=$(pwd)/_install-native \ + ${COMMON_CMAKE_FLAGS} \ + ${EXTRA_CMAKE_FLAGS} + cmake --build _build-native + cmake --install _build-native + + - name: Upload build-native artifacts + uses: actions/upload-artifact@v3 + with: + name: build-native + path: | + _build-* + _install-* + if: always() + + test-native: + runs-on: ubuntu-latest + needs: [build-native] + steps: + - uses: actions/checkout@v4.1.1 + with: + persist-credentials: false + + - name: Install dependencies + run: sudo apt-get update -y -qq && sudo apt-get install -y -qq libgmp-dev libmpfr-dev + + - name: Print host CPU info + run: | + cat /proc/cpuinfo + + - name: Download build-native artifacts + uses: actions/download-artifact@v3 + with: + name: build-native + + - name: Fix build-native permissions + run: | + chmod +x _build-native/bin/* + + - name: Test native + env: + CTEST_OUTPUT_ON_FAILURE: "TRUE" + run: | + cd _build-native + ctest -j$(nproc) + + - name: Upload test-native artifacts + uses: actions/upload-artifact@v3 + with: + name: test-native + path: | + _build-native/Testing + if: always() + + build-cross: + runs-on: ubuntu-latest + needs: [build-native] + strategy: + fail-fast: false + matrix: + include: + # AArch64 + - arch: aarch64 + # Aarch32 + - arch: armhf + package: -arm-linux-gnueabihf + # PPC64 + - arch: ppc64el + package: -powerpc64le-linux-gnu + # IBM Z + - arch: s390x + + name: build-${{ matrix.arch }} + steps: + - uses: actions/checkout@v4.1.1 + with: + persist-credentials: false + + - name: Install dependencies + run: | + sudo apt-get update -y -qq + sudo apt-get install -y -qq build-essential clang curl ninja-build libgmp-dev libmpfr-dev gcc${{ matrix.package || format('-{0}-linux-gnu', matrix.arch) }} + + - name: Download build-native artifacts + uses: actions/download-artifact@v3 + with: + name: build-native + + - name: Fix build-native permissions + run: | + chmod +x _build-native/bin/* + + - name: Build ${{ matrix.arch }} + run: | + set -x + EXTRA_CMAKE_FLAGS="" + if [[ ${{ matrix.arch }} = "aarch64" ]]; then + EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_SVE=ON" + elif [[ ${{ matrix.arch }} = "armhf" ]]; then + # Disable inline headers, they just don't compile on armhf + EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DBUILD_INLINE_HEADERS=OFF" + elif [[ ${{ matrix.arch }} = "ppc64el" ]]; then + EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_VSX=ON -DENFORCE_VSX3=ON" + elif [[ ${{ matrix.arch }} = "s390x" ]]; then + EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_VXE=ON" + # Disable VXE2 support, QEMU doesn't support it + EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DDISABLE_VXE2=ON" + fi + cmake -S . -B _build-${{ matrix.arch }} -GNinja \ + -DCMAKE_INSTALL_PREFIX="$(pwd)/_install-${{ matrix.arch }}" \ + -DCMAKE_TOOLCHAIN_FILE=$(pwd)/travis/toolchain-${{ matrix.arch }}.cmake \ + -DNATIVE_BUILD_DIR="$(pwd)/_build-native" \ + ${COMMON_CMAKE_FLAGS} \ + ${EXTRA_CMAKE_FLAGS} + cmake --build _build-${{ matrix.arch }} + cmake --install _build-${{ matrix.arch }} + + - name: Upload build-${{ matrix.arch }} artifacts + uses: actions/upload-artifact@v3 + with: + name: build-${{ matrix.arch }} + path: | + _build-${{ matrix.arch }} + _install-${{ matrix.arch }} + if: always() + + test-cross: + runs-on: ubuntu-latest + needs: [build-native, build-cross] + strategy: + fail-fast: false + matrix: + include: + # AArch64 + - arch: aarch64 + qemu_cpu: "max,sve=off" + - arch: aarch64 + qemu_cpu: "max,sve=on,sve128=on" + - arch: aarch64 + qemu_cpu: "max,sve=on,sve256=on" + - arch: aarch64 + qemu_cpu: "max,sve=on,sve512=on" + # Aarch32 + - arch: armhf + binfmt: arm + qemu_cpu: "max" + # PPC64 + - arch: ppc64el + binfmt: ppc64le + qemu_cpu: "power10" + # IBM Z + # TODO: figure out qemu_cpu variable to make tests pass on QEMU + - arch: s390x + + name: "test-${{ matrix.arch }} (qemu_cpu: \"${{ matrix.qemu_cpu }}\")" + steps: + - uses: actions/checkout@v4.1.1 + with: + persist-credentials: false + + - uses: docker/setup-qemu-action@v3.0.0 + with: + platforms: ${{ matrix.binfmt || matrix.arch }} + + - name: Install dependencies + run: sudo apt-get update -y -qq && sudo apt-get install -y -qq libgmp-dev libmpfr-dev + + - name: Print host CPU info + run: | + cat /proc/cpuinfo + + - name: Download build-native artifacts + uses: actions/download-artifact@v3 + with: + name: build-native + + - name: Download build-${{ matrix.arch }} artifacts + uses: actions/download-artifact@v3 + with: + name: build-${{ matrix.arch }} + + - name: Fix build-native and _build-${{ matrix.arch }} permissions + run: | + chmod +x _build-native/bin/* + chmod +x _build-${{ matrix.arch }}/bin/* + + - name: Test ${{ matrix.arch }} + env: + CTEST_OUTPUT_ON_FAILURE: "TRUE" + run: | + if [[ -n "${{ matrix.qemu_cpu }}" ]]; then + export QEMU_CPU="${{ matrix.qemu_cpu }}" + fi + cd _build-${{ matrix.arch }} + ctest -j$(nproc) + + - name: Upload test-${{ matrix.arch }}-${{ strategy.job-index }} artifacts + uses: actions/upload-artifact@v3 + with: + name: test-${{ matrix.arch }}-${{ strategy.job-index }} + path: | + _build-${{ matrix.arch }}/Testing + if: always() diff --git a/Configure.cmake b/Configure.cmake index 9309f9db..63d2c638 100644 --- a/Configure.cmake +++ b/Configure.cmake @@ -165,7 +165,6 @@ set(CLANG_FLAGS_ENABLE_VXE2 "-march=z15;-mzvector") set(CLANG_FLAGS_ENABLE_VXE2NOFMA "-march=z15;-mzvector") set(FLAGS_OTHERS "") -set(FLAGS_ARCH_NATIVE "") # All variables storing compiler flags should be prefixed with FLAGS_ if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") @@ -178,10 +177,6 @@ if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") string(CONCAT FLAGS_STRICTMATH ${FLAGS_STRICTMATH} " -msse2 -mfpmath=sse") string(CONCAT FLAGS_FASTMATH ${FLAGS_FASTMATH} " -msse2 -mfpmath=sse") endif() - - if (SLEEF_ARCH_X86) - set(FLAGS_ARCH_NATIVE "-march=native") - endif() # Without the options below, gcc generates calls to libm string(CONCAT FLAGS_OTHERS "-fno-math-errno -fno-trapping-math") diff --git a/src/libm-tester/CMakeLists.txt b/src/libm-tester/CMakeLists.txt index 78a38cad..69f2ba6e 100644 --- a/src/libm-tester/CMakeLists.txt +++ b/src/libm-tester/CMakeLists.txt @@ -452,7 +452,6 @@ if(ENABLE_GNUABI AND COMPILER_SUPPORTS_OMP_SIMD AND NOT SLEEF_TARGET_PROCESSOR M add_executable(testervecabi testervecabi.c) target_compile_definitions(testervecabi PRIVATE ${COMMON_TARGET_DEFINITIONS}) target_compile_options(testervecabi PRIVATE ${OpenMP_C_FLAGS}) - target_compile_options(testervecabi PRIVATE ${FLAGS_ARCH_NATIVE}) target_link_libraries(testervecabi ${TARGET_LIBSLEEF} ${OpenMP_C_FLAGS}) set_target_properties(testervecabi PROPERTIES C_STANDARD 99) add_test(NAME testervecabi COMMAND testervecabi diff --git a/travis/toolchain-ppc64el.cmake b/travis/toolchain-ppc64el.cmake index 3f99c2fe..e26a6eaa 100644 --- a/travis/toolchain-ppc64el.cmake +++ b/travis/toolchain-ppc64el.cmake @@ -4,7 +4,7 @@ SET (CMAKE_SYSTEM_PROCESSOR "ppc64") SET(CMAKE_FIND_ROOT_PATH /usr/powerpc64le-linux-gnu /usr/include/powerpc64le-linux-gnu /usr/lib/powerpc64le-linux-gnu) -find_program(CMAKE_C_COMPILER ppc64el-cc) +find_program(CMAKE_C_COMPILER powerpc64le-linux-gnu-gcc ppc64el-cc) SET(CMAKE_AR /usr/powerpc64le-linux-gnu/bin/ar)