Check for ABI breaks #4221
Workflow file for this run
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | name: Check for ABI breaks | |
| on: | |
| pull_request: | |
| branches-ignore: | |
| - abi-break | |
| merge_group: | |
| jobs: | |
| run-abidiff: | |
| name: Compare ABIs | |
| runs-on: ubuntu-latest | |
| container: debian:trixie | |
| defaults: | |
| run: | |
| shell: bash | |
| steps: | |
| - name: Install prerequisites | |
| run: | | |
| apt-get update | |
| apt-get install -y meson ninja-build qemu-user \ | |
| python3-setuptools python3-jsonschema \ | |
| python3-pip abigail-tools git rsync wget file | |
| pip install --break-system-packages -U xbstrap pyexpect | |
| - name: Checkout base branch | |
| if: ${{ github.base_ref }} | |
| uses: actions/checkout@v2 | |
| with: | |
| path: mlibc-base | |
| ref: ${{ github.base_ref }} | |
| submodules: true | |
| fetch-depth: 4 | |
| - name: Checkout managarm/mlibc#master | |
| if: ${{ github.base_ref == '' }} | |
| uses: actions/checkout@v2 | |
| with: | |
| path: mlibc-base | |
| repository: managarm/mlibc | |
| submodules: true | |
| ref: master | |
| fetch-depth: 4 | |
| - name: Checkout branch | |
| uses: actions/checkout@v2 | |
| with: | |
| path: mlibc-branch | |
| submodules: true | |
| - name: Determine base ref | |
| run: | | |
| master_hash="$(git -C mlibc-base rev-parse HEAD)" | |
| branch_hash="$(git -C mlibc-branch rev-parse HEAD)" | |
| printf '%s\n' "$master_hash" "$branch_hash" | |
| if [ "$master_hash" = "$branch_hash" ]; then | |
| git -C mlibc-base reset --hard HEAD^ | |
| fi | |
| - name: Set up linux kernel headers | |
| run: | | |
| set -x | |
| mkdir -p linux-headers-base/{src,build} | |
| cp mlibc-base/ci/bootstrap.yml linux-headers-base/src/ | |
| ( | |
| cd linux-headers-base/build | |
| xbstrap init ../src | |
| xbstrap install linux-headers | |
| ) | |
| mkdir -p linux-headers-branch/{src,build} | |
| cp mlibc-branch/ci/bootstrap.yml linux-headers-branch/src/ | |
| ( | |
| cd linux-headers-branch/build | |
| xbstrap init ../src | |
| xbstrap install linux-headers | |
| ) | |
| cat > linux-headers-base/build/bootstrap-site.yml << EOF | |
| define_options: | |
| arch: ${{matrix.arch}} | |
| EOF | |
| cp linux-headers-base/build/bootstrap-site.yml linux-headers-branch/build/bootstrap-site.yml | |
| - name: Get libgcc-binaries | |
| run: | | |
| set -e | |
| wget -O /tmp/libgcc-x86_64.a https://github.com/osdev0/libgcc-binaries/releases/latest/download/libgcc-x86_64.a | |
| - name: Build and install both copies | |
| run: | | |
| set -xe | |
| mkdir root-base root-branch | |
| cat > linux-x86_64.cross-file <<-EOF | |
| [binaries] | |
| c = 'gcc' | |
| cpp = 'g++' | |
| [host_machine] | |
| system = 'linux' | |
| cpu_family = 'x86_64' | |
| cpu = 'x86_64' | |
| endian = 'little' | |
| EOF | |
| ( | |
| cd mlibc-branch | |
| LDFLAGS='-Wl,/tmp/libgcc-x86_64.a' meson setup \ | |
| --cross-file=../linux-x86_64.cross-file \ | |
| --buildtype=debugoptimized \ | |
| -Dlibgcc_dependency=false \ | |
| -Duse_freestnd_hdrs=enabled \ | |
| -Dlinux_kernel_headers=$GITHUB_WORKSPACE/linux-headers-branch/build/packages/linux-headers/usr/include \ | |
| build | |
| ninja -C build | |
| DESTDIR="$GITHUB_WORKSPACE/root-branch" ninja -C build install | |
| ) | |
| ( | |
| cd mlibc-base | |
| LDFLAGS='-Wl,/tmp/libgcc-x86_64.a' meson setup \ | |
| --cross-file=../linux-x86_64.cross-file \ | |
| --buildtype=debugoptimized \ | |
| -Dlibgcc_dependency=false \ | |
| -Duse_freestnd_hdrs=enabled \ | |
| -Dlinux_kernel_headers=$GITHUB_WORKSPACE/linux-headers-branch/build/packages/linux-headers/usr/include \ | |
| build | |
| ninja -C build | |
| DESTDIR="$GITHUB_WORKSPACE/root-base" ninja -C build install | |
| ) | |
| - name: Compare | |
| run: | | |
| # TODO(arsen): does this require handling for version suffixes? | |
| set -e +x | |
| exec 2>&1 # work around GHA foolishly decoupling stdout and stderr | |
| exitcode=0 | |
| git -C mlibc-branch show -s --format=%s | grep -q abi-break || \ | |
| exitcode=1 | |
| echo ==== RUNNING ABIDIFF... ==== | |
| ( cd root-base; find . -type f -name '*.so'; ) | while read -r file | |
| do | |
| if ! file -- root-{base,branch}/"$file"; then | |
| touch files-differ | |
| continue | |
| fi | |
| abidiff \ | |
| --no-added-syms \ | |
| --suppr mlibc-branch/ci/abidiff_suppress.ini \ | |
| --hd1 root-base/usr/local/include/ \ | |
| --hd2 root-branch/usr/local/include/ \ | |
| root-{base,branch}/"$file" \ | |
| || touch files-differ | |
| done | |
| echo ==== CHECKING FOR EXTRA FILES... ==== | |
| ( cd root-branch; find . -type f -name '*.so'; ) | while read -r file | |
| do | |
| [ -e "root-base/$file" ] || file root-{base,branch}/"$file" \ | |
| || touch files-differ | |
| done | |
| if [ -e files-differ ]; then | |
| echo SOME FILES/ABI DIFFER, SEE OUTPUT ABOVE | |
| exit "$exitcode" | |
| fi |