Skip to content

Commit ced2231

Browse files
committed
Cross compile for armhf and s390x architectures
Signed-off-by: Paul Guyot <pguyot@kallisys.net>
1 parent cb5b4c7 commit ced2231

File tree

2 files changed

+150
-30
lines changed

2 files changed

+150
-30
lines changed

.github/workflows/build-and-test-other.yaml

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
strategy:
7171
fail-fast: false
7272
matrix:
73-
arch: ["arm32v5", "arm32v7"]
73+
arch: ["arm32v5"]
7474

7575
include:
7676
- arch: "arm32v5"
@@ -92,21 +92,6 @@ jobs:
9292
apt install -y -t stretch-backports cmake &&
9393
apt install -y file gcc g++ binutils make doxygen gperf zlib1g-dev libmbedtls-dev
9494
95-
- arch: "arm32v7"
96-
platform: "arm/v7"
97-
tag: "bookworm"
98-
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
99-
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
100-
cflags: "-mcpu=cortex-a7 -mfloat-abi=hard -O2 -mthumb -mthumb-interwork -D_FILE_OFFSET_BITS=64"
101-
cmake_opts: "-DAVM_WARNINGS_ARE_ERRORS=ON"
102-
103-
# Required for testing big endian archs
104-
- arch: "s390x"
105-
platform: "s390x"
106-
tag: "bookworm"
107-
cflags: "-O2"
108-
cmake_opts: "-DAVM_WARNINGS_ARE_ERRORS=ON"
109-
11095
steps:
11196
- name: Checkout repo
11297
uses: actions/checkout@v4

.github/workflows/build-and-test.yaml

Lines changed: 149 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,36 @@ jobs:
319319
rebar3_version: "3.24.0"
320320
cmake_opts_other: "-DAVM_DISABLE_JIT=OFF"
321321

322+
# armhf build
323+
- os: "ubuntu-24.04"
324+
cc: "arm-linux-gnueabihf-gcc"
325+
cxx: "arm-linux-gnueabihf-g++"
326+
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
327+
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
328+
cflags: "-mcpu=cortex-a7 -mfloat-abi=hard -O2 -mthumb -mthumb-interwork -D_FILE_OFFSET_BITS=64"
329+
otp: "28"
330+
elixir_version: "1.17"
331+
rebar3_version: "3.24.0"
332+
cmake_opts_other: "-DAVM_WARNINGS_ARE_ERRORS=ON -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/armhf_toolchain.cmake"
333+
compiler_pkgs: "crossbuild-essential-armhf libc6-dbg:armhf zlib1g-dev:armhf libmbedtls-dev:armhf qemu-user qemu-user-binfmt binfmt-support"
334+
arch: "armhf"
335+
library-arch: arm-linux-gnueabihf
336+
337+
# s390x build
338+
- os: "ubuntu-24.04"
339+
cc: "s390x-linux-gnu-gcc"
340+
cxx: "s390x-linux-gnu-g++"
341+
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
342+
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
343+
cflags: "-O2"
344+
otp: "28"
345+
elixir_version: "1.17"
346+
rebar3_version: "3.24.0"
347+
cmake_opts_other: "-DAVM_WARNINGS_ARE_ERRORS=ON -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/s390x_toolchain.cmake"
348+
compiler_pkgs: "crossbuild-essential-s390x libc6-dbg:s390x zlib1g-dev:s390x libmbedtls-dev:s390x qemu-user qemu-user-binfmt binfmt-support"
349+
arch: "s390x"
350+
library-arch: s390x-linux-gnu
351+
322352
env:
323353
ImageOS: ${{ matrix.container == 'ubuntu:20.04' && 'ubuntu20' || matrix.os == 'ubuntu-20.04' && 'ubuntu20' || matrix.os == 'ubuntu-22.04' && 'ubuntu22' || matrix.os == 'ubuntu-24.04' && 'ubuntu24' || 'ubuntu24' }}
324354
CC: ${{ matrix.cc }}
@@ -338,6 +368,32 @@ jobs:
338368
if: matrix.arch == 'i386'
339369
run: sudo dpkg --add-architecture i386
340370

371+
- name: "Setup cross compilation architecture"
372+
if: matrix.library-arch != ''
373+
run: |
374+
sudo dpkg --add-architecture ${{ matrix.arch }}
375+
cat > ${RUNNER_TEMP}/cross-compile-sources.list <<EOF
376+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble main restricted
377+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates main restricted
378+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble universe
379+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates universe
380+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble multiverse
381+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates multiverse
382+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-backports main restricted universe multiverse
383+
EOF
384+
sudo mv ${RUNNER_TEMP}/cross-compile-sources.list /etc/apt/sources.list.d/
385+
386+
sudo sed -i '/Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
387+
388+
cat > ${RUNNER_TEMP}/${{ matrix.arch }}_toolchain.cmake <<EOF
389+
set(CMAKE_SYSTEM_NAME Linux)
390+
set(CMAKE_C_LIBRARY_ARCHITECTURE ${{ matrix.library-arch }})
391+
392+
set(ZLIB_LIBRARY /usr/lib/${{ matrix.library-arch }}/libz.so)
393+
set(MBEDTLS_ROOT_DIR /usr)
394+
set(MBEDTLS_LIBRARIES_DIR /usr/lib/${{ matrix.library-arch }})
395+
EOF
396+
341397
- name: "APT update"
342398
run: sudo apt update -y
343399

@@ -405,99 +461,178 @@ jobs:
405461
406462
- name: "Build: run make"
407463
working-directory: build
408-
run: make
464+
run: make -j3
409465

410466
- name: "Build: run dialyzer"
411467
working-directory: build
412468
run: make dialyzer
413469

414470
# Test
415-
- name: "Test: test-erlang"
471+
- name: "Test: test-erlang with valgrind"
472+
if: matrix.library-arch == ''
416473
timeout-minutes: 30
417474
working-directory: build
418475
run: |
419476
ulimit -c unlimited
420477
valgrind --error-exitcode=1 ./tests/test-erlang -s prime_smp
478+
479+
- name: "Test: test-erlang"
480+
timeout-minutes: 10
481+
working-directory: build
482+
run: |
483+
ulimit -c unlimited
421484
./tests/test-erlang -s prime_smp
422485
423-
- name: "Test: test-enif"
486+
- name: "Test: test-enif with valgrind"
487+
if: matrix.library-arch == ''
424488
working-directory: build
425489
run: |
426490
ulimit -c unlimited
427491
valgrind --error-exitcode=1 ./tests/test-enif
492+
493+
- name: "Test: test-enif"
494+
working-directory: build
495+
run: |
496+
ulimit -c unlimited
428497
./tests/test-enif
429498
430-
- name: "Test: test-heap"
499+
- name: "Test: test-heap with valgrind"
500+
if: matrix.library-arch == ''
431501
working-directory: build
432502
run: |
433503
ulimit -c unlimited
434504
valgrind --error-exitcode=1 ./tests/test-heap
505+
506+
- name: "Test: test-heap"
507+
working-directory: build
508+
run: |
509+
ulimit -c unlimited
435510
./tests/test-heap
436511
437-
- name: "Test: test-mailbox"
512+
- name: "Test: test-mailbox with valgrind"
513+
if: matrix.library-arch == ''
438514
working-directory: build
439515
run: |
440516
ulimit -c unlimited
441517
valgrind --error-exitcode=1 ./tests/test-mailbox
518+
519+
- name: "Test: test-mailbox"
520+
working-directory: build
521+
run: |
522+
ulimit -c unlimited
442523
./tests/test-mailbox
443524
444-
- name: "Test: test-structs"
525+
- name: "Test: test-structs with valgrind"
526+
if: matrix.library-arch == ''
445527
timeout-minutes: 10
446528
working-directory: build
447529
run: |
448530
ulimit -c unlimited
449531
valgrind --error-exitcode=1 ./tests/test-structs
532+
533+
- name: "Test: test-structs"
534+
timeout-minutes: 10
535+
working-directory: build
536+
run: |
537+
ulimit -c unlimited
450538
./tests/test-structs
451539
540+
- name: "Test: test_etest.avm with valgrind"
541+
if: matrix.library-arch == ''
542+
timeout-minutes: 5
543+
working-directory: build
544+
run: |
545+
ulimit -c unlimited
546+
valgrind ./src/AtomVM ./tests/libs/etest/test_etest.avm
547+
452548
- name: "Test: test_etest.avm"
453549
timeout-minutes: 5
454550
working-directory: build
455551
run: |
456552
ulimit -c unlimited
457553
./src/AtomVM ./tests/libs/etest/test_etest.avm
458-
valgrind ./src/AtomVM ./tests/libs/etest/test_etest.avm
459554
460-
- name: "Test: test_estdlib.avm"
461-
timeout-minutes: 30
555+
- name: "Test: test_estdlib.avm with valgrind"
556+
if: matrix.library-arch == ''
557+
timeout-minutes: 20
462558
working-directory: build
463559
run: |
464560
ulimit -c unlimited
465561
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/estdlib/test_estdlib.avm
562+
563+
- name: "Test: test_estdlib.avm"
564+
timeout-minutes: 20
565+
working-directory: build
566+
run: |
567+
ulimit -c unlimited
466568
./src/AtomVM ./tests/libs/estdlib/test_estdlib.avm
467569
468-
- name: "Test: test_eavmlib.avm"
570+
- name: "Test: test_eavmlib.avm with valgrind"
571+
if: matrix.library-arch == ''
469572
timeout-minutes: 10
470573
working-directory: build
471574
run: |
472575
ulimit -c unlimited
473576
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/eavmlib/test_eavmlib.avm
577+
578+
- name: "Test: test_eavmlib.avm"
579+
timeout-minutes: 10
580+
working-directory: build
581+
run: |
582+
ulimit -c unlimited
474583
./src/AtomVM ./tests/libs/eavmlib/test_eavmlib.avm
475584
585+
- name: "Test: test_jit.avm with valgrind"
586+
if: matrix.library-arch == '' && matrix.otp != '21' && matrix.otp != '22'
587+
timeout-minutes: 20
588+
working-directory: build
589+
run: |
590+
ulimit -c unlimited
591+
valgrind --error-exitcode=1 ./src/AtomVM tests/libs/jit/test_jit.avm
592+
476593
- name: "Test: test_jit.avm"
477-
timeout-minutes: 30
594+
timeout-minutes: 20
478595
if: matrix.otp != '21' && matrix.otp != '22'
479596
working-directory: build
480597
run: |
481598
ulimit -c unlimited
482-
valgrind --error-exitcode=1 ./src/AtomVM tests/libs/jit/test_jit.avm
483599
./src/AtomVM tests/libs/jit/test_jit.avm
484600
485-
- name: "Test: test_alisp.avm"
601+
- name: "Test: test_alisp.avm with valgrind"
602+
if: matrix.library-arch == ''
486603
timeout-minutes: 10
487604
working-directory: build
488605
run: |
489606
ulimit -c unlimited
490607
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/alisp/test_alisp.avm
608+
609+
- name: "Test: test_alisp.avm"
610+
timeout-minutes: 10
611+
working-directory: build
612+
run: |
613+
ulimit -c unlimited
491614
./src/AtomVM ./tests/libs/alisp/test_alisp.avm
492615
493-
- name: "Test: Tests.avm (Elixir)"
616+
- name: "Test: Tests.avm (Elixir) with valgrind"
617+
if: matrix.library-arch == ''
494618
timeout-minutes: 10
495619
working-directory: build
496620
run: |
497621
ulimit -c unlimited
498622
if command -v elixirc >/dev/null 2>&1 && command -v elixir >/dev/null 2>&1
499623
then
500624
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/exavmlib/Tests.avm
625+
else
626+
echo "Elixir not installed, skipping Elixir tests"
627+
fi
628+
629+
- name: "Test: Tests.avm (Elixir)"
630+
timeout-minutes: 10
631+
working-directory: build
632+
run: |
633+
ulimit -c unlimited
634+
if command -v elixirc >/dev/null 2>&1 && command -v elixir >/dev/null 2>&1
635+
then
501636
./src/AtomVM ./tests/libs/exavmlib/Tests.avm
502637
else
503638
echo "Elixir not installed, skipping Elixir tests"

0 commit comments

Comments
 (0)