From 1c7ce32108e65a6c3efbb431b5f0e92da6ac68e3 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Mon, 3 Nov 2025 15:21:33 +0100 Subject: [PATCH] ci updated for aarch64 tests --- .github/workflows/build_wheels.yml | 14 +++--- .github/workflows/ci.yml | 29 +++++++---- tools/crosscompile.sh | 2 +- tools/make_example.py | 80 ++++-------------------------- 4 files changed, 39 insertions(+), 86 deletions(-) diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index cafb86a..3a73e18 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -45,17 +45,17 @@ jobs: python-version: "3.11" # Only needed for Linux ARM builds - #- name: Set up QEMU - # if: runner.os == 'Linux' - # uses: docker/setup-qemu-action@v2 - # with: - # platforms: all + - name: Set up QEMU + if: runner.os == 'Linux' + uses: docker/setup-qemu-action@v2 + with: + platforms: all - name: Build wheels uses: pypa/cibuildwheel@v3.2.0 env: - CIBW_ARCHS_LINUX: "x86_64" # aarch64 - CIBW_ARCHS_MACOS: "universal2" # x86_64 arm64 + CIBW_ARCHS_LINUX: "x86_64 aarch64" + CIBW_ARCHS_MACOS: "x86_64 universal2" # x86_64 arm64 CIBW_ARCHS_WINDOWS: "AMD64" # x86 CIBW_TEST_REQUIRES: "pytest" CIBW_TEST_COMMAND: "pytest {package}/tests/test_coparun_module.py" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d4c257..5771d29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,11 @@ jobs: name: stencil-object-files path: src/copapy/obj + #- uses: actions/download-artifact@v4 + # with: + # name: cross-runner + # path: bin + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -55,29 +60,35 @@ jobs: - name: Install Python dependencies run: python -m pip install -e .[dev] - - name: Compile coparun - run: | - mkdir -p bin - gcc -DENABLE_BASIC_LOGGING -O3 -Wall -Wextra -Wconversion -Wsign-conversion -Wshadow -Wstrict-overflow -Werror -g src/coparun/runmem.c src/coparun/coparun.c src/coparun/mem_man.c -o bin/coparun - - - name: Install ARM binutils + - name: Install ARM binutils and qemu + if: strategy.job-index == 0 run: | echo "set man-db/auto-update false" | sudo debconf-communicate sudo dpkg-reconfigure man-db sudo apt-get update - sudo apt-get install --no-install-recommends --no-install-suggests binutils-aarch64-linux-gnu + sudo apt-get install --no-install-recommends --no-install-suggests binutils-aarch64-linux-gnu qemu-user gcc-aarch64-linux-gnu libc6-dev-arm64-cross + + - name: Compile coparun + run: | + mkdir -p bin + gcc -O3 -DENABLE_BASIC_LOGGING -o bin/coparun src/coparun/runmem.c src/coparun/coparun.c src/coparun/mem_man.c + aarch64-linux-gnu-gcc -O3 -static -DENABLE_BASIC_LOGGING src/coparun/runmem.c src/coparun/coparun.c src/coparun/mem_man.c -o bin/coparun-aarch64 - name: Generate debug asm files if: strategy.job-index == 0 run: | + set -e + set -v python tools/make_example.py - python tools/extract_code.py "bin/test.copapy" "bin/test.copapy.bin" + echo "- Patch code..." + bin/coparun bin/test.copapy bin/test.copapy.bin + qemu-aarch64 bin/coparun-aarch64 bin/test-aarch64.copapy bin/test-aarch64.copapy.bin + objdump -D -b binary -m i386:x86-64 --adjust-vma=0x1000 bin/test.copapy.bin > bin/test.copapy.asm echo '

test.copapy.asm

' >> $GITHUB_STEP_SUMMARY python tools/clean_asm.py bin/test.copapy.asm >> $GITHUB_STEP_SUMMARY - #python tools/extract_code.py "bin/test-aarch64.copapy" "bin/test-aarch64.copapy.bin" #aarch64-linux-gnu-objdump -D -b binary -m aarch64 --adjust-vma=0x1000 bin/test-aarch64.copapy.bin > bin/test-aarch64.copapy.asm #echo '

test-aarch64.copapy.asm

' >> $GITHUB_STEP_SUMMARY #python tools/clean_asm.py bin/test-aarch64.copapy.asm >> $GITHUB_STEP_SUMMARY diff --git a/tools/crosscompile.sh b/tools/crosscompile.sh index 4acc079..81b4e96 100644 --- a/tools/crosscompile.sh +++ b/tools/crosscompile.sh @@ -59,4 +59,4 @@ riscv64-linux-gnu-gcc-13 $FLAGS -$OPT -c $SRC -o $DEST/stencils_riscv64_$OPT.o # -------------- Cross compile runner -------------- # Aarch64 -aarch64-linux-gnu-gcc-13 -static -O3 -o bin/coparun-aarch64 src/coparun/runmem.c src/coparun/coparun.c src/coparun/mem_man.c +aarch64-linux-gnu-gcc-13 -static -O3 -DENABLE_LOGGING -o bin/coparun-aarch64 src/coparun/runmem.c src/coparun/coparun.c src/coparun/mem_man.c diff --git a/tools/make_example.py b/tools/make_example.py index cedcae2..8dc8de2 100644 --- a/tools/make_example.py +++ b/tools/make_example.py @@ -1,34 +1,11 @@ from copapy import variable from copapy.backend import Write, compile_to_dag, stencil_db_from_package -import subprocess import copapy as cp from copapy._binwrite import Command -import os -if os.name == 'nt': - # On Windows wsl and qemu-user is required: - # sudo apt install qemu-user - qemu_command = ['wsl', 'qemu-aarch64', - 'bin/coparun-aarch64', - 'bin/test-aarch64.copapy', - 'bin/test-aarch64.copapy.bin'] -else: - qemu_command = ['qemu-aarch64', - 'bin/coparun-aarch64', - 'bin/test-aarch64.copapy', - 'bin/test-aarch64.copapy.bin'] - - -def run_command(command: list[str]) -> str: - result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8', check=False) - assert result.returncode != 11, f"SIGSEGV (segmentation fault)\n -Error occurred: {result.stderr}\n -Output: {result.stdout}" - assert result.returncode == 0, f"\n -Error occurred: {result.stderr}\n -Output: {result.stdout}" - return result.stdout - - -def test_compile() -> None: - """Test compilation of a simple program.""" +def compile_to_x86_64() -> None: + """Test compilation of a simple program for x86_64.""" c1 = variable(9.0) #ret = [c1 / 4, c1 / -4, c1 // 4, c1 // -4, (c1 * -1) // 4] @@ -39,23 +16,10 @@ def test_compile() -> None: out = [Write(r) for r in ret] - dw, vars = compile_to_dag(out, cp.generic_sdb) + sdb = stencil_db_from_package('x86_64') + dw, _ = compile_to_dag(out, sdb) - # run program command - dw.write_com(Command.RUN_PROG) - - # read first 32 byte - dw.write_com(Command.READ_DATA) - dw.write_int(0) - dw.write_int(32) - - # read variables - for addr, lengths, _ in vars.values(): - dw.write_com(Command.READ_DATA) - dw.write_int(addr) - dw.write_int(lengths) - - dw.write_com(Command.END_COM) + dw.write_com(Command.DUMP_CODE) print('* Data to runner:') dw.print() @@ -63,36 +27,21 @@ def test_compile() -> None: dw.to_file('bin/test.copapy') -def test_compile_aarch64() -> None: - """Test compilation of a simple program.""" +def compile_to_aarch64() -> None: + """Test compilation of a simple program for aarch64.""" c1 = variable(9.0) #ret = [c1 / 4, c1 / -4, c1 // 4, c1 // -4, (c1 * -1) // 4] #ret = [cp.sin(c1), cp.sqrt(c1) + 5] - ret = [cp.sqrt(c1)] + ret = [c1 // 3.3 + 5] #c2 = cp._math.get_42() #ret = [c2] out = [Write(r) for r in ret] sdb = stencil_db_from_package('aarch64') - dw, vars = compile_to_dag(out, sdb) + dw, _ = compile_to_dag(out, sdb) - # run program command - #dw.write_com(Command.RUN_PROG) - - # read first 32 byte - #dw.write_com(Command.READ_DATA) - #dw.write_int(0) - #dw.write_int(32) - - # read variables - #for addr, lengths, _ in vars.values(): - # dw.write_com(Command.READ_DATA) - # dw.write_int(addr) - # dw.write_int(lengths) - - #dw.write_com(Command.END_COM) dw.write_com(Command.DUMP_CODE) print('* Data to runner:') @@ -100,14 +49,7 @@ def test_compile_aarch64() -> None: dw.to_file('bin/test-aarch64.copapy') - result = run_command(qemu_command) - print('* Output from runner:\n--') - print(result) - print('--') - - assert 'DUMP_CODE' in result - if __name__ == "__main__": - #test_compile() - test_compile_aarch64() + compile_to_x86_64() + compile_to_aarch64()