From f5f2324de1d86f537943081da3dd9953a1671f52 Mon Sep 17 00:00:00 2001 From: Lisanna Dettwyler Date: Fri, 3 May 2024 19:28:58 +0000 Subject: [PATCH] Add new workflows build-multi.yml: Build environment specified with Dockerfiles build-quick.yml: Build natively on GitHub runners (renamed from ci-external.yml) check-abi.yml: Checks for backwards-compatibility issues --- .github/docker/windows.Dockerfile | 2 +- .github/workflows/build-multi.yml | 217 ++++++++++++++++++ .../{ci-external.yml => build-quick.yml} | 0 .github/workflows/check-abi.yml | 79 +++++++ 4 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build-multi.yml rename .github/workflows/{ci-external.yml => build-quick.yml} (100%) create mode 100644 .github/workflows/check-abi.yml diff --git a/.github/docker/windows.Dockerfile b/.github/docker/windows.Dockerfile index 7b71bf9..af6310e 100644 --- a/.github/docker/windows.Dockerfile +++ b/.github/docker/windows.Dockerfile @@ -1,6 +1,6 @@ # escape=` -ARG BASE_IMAGE=mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2019 +ARG BASE_IMAGE=mcr.microsoft.com/dotnet/framework/runtime:4.8 FROM ${BASE_IMAGE} SHELL ["powershell"] diff --git a/.github/workflows/build-multi.yml b/.github/workflows/build-multi.yml new file mode 100644 index 0000000..62509fd --- /dev/null +++ b/.github/workflows/build-multi.yml @@ -0,0 +1,217 @@ +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: + +permissions: read-all + +defaults: + run: + shell: bash + +jobs: + config: + runs-on: ubuntu-latest + outputs: + short-sha: ${{ steps.const.outputs.short-sha }} + ref-slug: ${{ steps.const.outputs.ref-slug }} + build-matrix: ${{ steps.build-matrix.outputs.matrix }} + image-matrix: ${{ steps.image-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + with: + clean: true + ref: ${{ github.event.pull_request.head.sha }} + - name: Set constants + id: const + run: | + cat >> ${GITHUB_OUTPUT} <- + ${{ matrix.os.name == 'windows' && 'windows' || + format('{0}-{1}.{2}', + matrix.os.name, + matrix.os.vmaj, + matrix.os.vmin + ) + }} + DOCKER_BUILDKIT: ${{ matrix.os.name == 'windows' && '0' || '1' }} + steps: + - name: Compute image name + run: echo "DOCKER_IMAGE=localhost/${{ github.repository }}/${OS_STRING}" >> ${GITHUB_ENV} + - uses: actions/checkout@v4 + with: + clean: true + submodules: true + - name: "Registry login: ghcr.io" + run: | + echo ${{ secrets.GITHUB_TOKEN }} | + docker login -u sys-lzdev --password-stdin ghcr.io + - name: Setup buildkit builder + if: env.DOCKER_BUILDKIT == '1' + id: buildx-builder + uses: docker/setup-buildx-action@v2 + - name: Build image + run: | + docker info + docker \ + ${{ env.DOCKER_BUILDKIT == '0' && 'build' || 'buildx build --load' }} \ + ${{ runner.os == 'Windows' && ' \ + --memory 16G ' || ' ' + }}\ + ${{ matrix.os.vmaj != '' && format(' \ + --build-arg VMAJ={0} \ + --build-arg VMIN={1} ', matrix.os.vmaj, matrix.os.vmin) || ' ' + }}\ + --pull \ + --tag ${DOCKER_IMAGE}:${{ needs.config.outputs.ref-slug }} \ + - < .github/docker/${{ matrix.os.name }}.Dockerfile + - name: Save image + run: docker save ${DOCKER_IMAGE}:${{ needs.config.outputs.ref-slug }} -o ./${{ env.OS_STRING }}.tar + - name: Save image ID + run: echo "$(docker images --format '{{.ID}}' ${DOCKER_IMAGE}:${{ needs.config.outputs.ref-slug }})" > ./${{ env.OS_STRING }}.id + - name: Upload image + uses: actions/upload-artifact@v4 + with: + name: ${{ env.OS_STRING }} + path: ./${{ env.OS_STRING }}.* + + build: + # Notes on formatting: + # + # GitHub Actions expressions ${{ ... }} are used wherever possible so the + # evaluation results are plainly visible in the web console. + # + # Note the mixed spaces and tabs in the heredocs, see the bash man page + # entry for <<- in the Here Documents section. This allows generated code to + # be indented for readability in the workflow output. + needs: [config, image] + runs-on: ${{ matrix.os.name == 'windows' && 'windows-latest' || 'ubuntu-latest' }} + # Always run build even if the image step failed, except if the job was cancelled + if: >- + always() && + ! cancelled() && + needs.config.result == 'success' + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.config.outputs.build-matrix) }} + env: + MSYS_NO_PATHCONV: 1 + MOUNT_TARGET: ${{ matrix.os.name == 'windows' && 'C:/project' || '/project' }} + # -j breaks the Visual Studio configuration selection + PARALLEL: ${{ ! (matrix.os.name == 'windows') && '-j' || '' }} + ARCH_SUFFIX: ${{ matrix.arch != '' && format('_{0}', matrix.arch) || '' }} + steps: + - name: Set constants + id: const + env: + OS_STRING: >- + ${{ matrix.os.name == 'windows' && 'windows' || + format('{0}-{1}.{2}', + matrix.os.name, + matrix.os.vmaj, + matrix.os.vmin + ) + }} + CCACHE_DIR: ${{ github.workspace }}/ccache + run: | + cat >> ${GITHUB_OUTPUT} <> ${GITHUB_OUTPUT} + - name: Build + id: build + run: | + mkdir build + docker run \ + --rm \ + --interactive \ + -v '${{ github.workspace }}':${MOUNT_TARGET} \ + -w ${MOUNT_TARGET}/build \ + -e CCACHE_BASEDIR=${MOUNT_TARGET} \ + -e CCACHE_DIR=${MOUNT_TARGET}/ccache \ + -v '${{ steps.const.outputs.ccache-dir }}':${MOUNT_TARGET}/ccache \ + ${{ steps.image-id.outputs.id }} \ + bash -e -x <<-EOF + + cmake \ + ${{ matrix.os.name != 'windows' && ' \ + -G Ninja ' || ' ' + }}\ + ${{ matrix.arch == 'arm64' && ' \ + -D CMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ + -D CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ + -D CMAKE_SYSTEM_PROCESSOR=aarch64 ' || ' ' + }}\ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_INSTALL_PREFIX=${{ matrix.target == 'install' && '../level-zero-install' || matrix.target == 'package' && '/usr' || '' }} \ + -D CPACK_OUTPUT_FILE_PREFIX=${MOUNT_TARGET}/level-zero-package \ + .. + + cmake --build . ${PARALLEL} --target ${{ matrix.target }} ${{ matrix.os.name == 'windows' && '--config Release' || '' }} + + ccache --show-stats + + EOF diff --git a/.github/workflows/ci-external.yml b/.github/workflows/build-quick.yml similarity index 100% rename from .github/workflows/ci-external.yml rename to .github/workflows/build-quick.yml diff --git a/.github/workflows/check-abi.yml b/.github/workflows/check-abi.yml new file mode 100644 index 0000000..45738dd --- /dev/null +++ b/.github/workflows/check-abi.yml @@ -0,0 +1,79 @@ +on: + pull_request: + branches: [master] + +permissions: read-all + +jobs: + # Use https://lvc.github.io/abi-compliance-checker/ to compare builds + # of pull requests against master. Compares checkouts of github.base_ref and + # github.head_ref. + check-abi: + runs-on: ubuntu-latest + if: github.repository_owner == 'oneapi-src' + steps: + - name: Install dependencies + run: | + sudo apt update + sudo apt install -y elfutils universal-ctags + - name: Checkout base + uses: actions/checkout@v3 + with: + ref: ${{ github.base_ref }} + clean: true + path: base + - name: Checkout head + uses: actions/checkout@v3 + with: + clean: true + path: head + ref: ${{ github.event.pull_request.head.sha }} + - name: Build debug base + run: | + mkdir base/build + cd base/build + cmake -DCMAKE_BUILD_TYPE=Debug .. + make -j$(nproc) + - name: Build debug head + run: | + mkdir head/build + cd head/build + cmake -DCMAKE_BUILD_TYPE=Debug .. + make -j$(nproc) + - name: Download and setup abi-dumper + run: | + wget https://github.com/lvc/abi-dumper/archive/refs/tags/1.2.tar.gz -O abi-dumper.tar.gz + tar -xzf abi-dumper.tar.gz + cp abi-dumper-*/abi-dumper.pl . + chmod +x abi-dumper.pl + - name: Generate dump for base + run: | + ./abi-dumper.pl \ + ./base/build/lib/libze_loader.so \ + -lver $(cat ./base/build/VERSION) \ + -public-headers ./base/include \ + -o ./base.dump + - name: Generate dump for head + run: | + ./abi-dumper.pl \ + ./head/build/lib/libze_loader.so \ + -lver $(cat ./head/build/VERSION) \ + -public-headers ./head/include \ + -o ./head.dump + - name: Download and setup abi-compliance-checker + run: | + wget https://github.com/lvc/abi-compliance-checker/tarball/master -O abi-compliance-checker.tar.gz + tar -xzf abi-compliance-checker.tar.gz + chmod +x lvc-abi-compliance-checker-*/abi-compliance-checker.pl + - name: Compare dumps + run: | + lvc-abi-compliance-checker-*/abi-compliance-checker.pl \ + -l libze_loader \ + -old base.dump \ + -new head.dump \ + -report-path report.html + - uses: actions/upload-artifact@v3 + if: always() + with: + name: abi-report + path: report.html \ No newline at end of file