Skip to content

Commit 25de66f

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

File tree

2 files changed

+151
-31
lines changed

2 files changed

+151
-31
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", "arm64v8"]
73+
arch: ["arm32v5", "arm64v8"]
7474

7575
include:
7676
- arch: "arm32v5"
@@ -92,27 +92,12 @@ 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-
10395
- arch: "arm64v8"
10496
platform: "arm64/v8"
10597
tag: "bookworm"
10698
cflags: "-O2"
10799
cmake_opts: "-DAVM_WARNINGS_ARE_ERRORS=ON"
108100

109-
# Required for testing big endian archs
110-
- arch: "s390x"
111-
platform: "s390x"
112-
tag: "bookworm"
113-
cflags: "-O2"
114-
cmake_opts: "-DAVM_WARNINGS_ARE_ERRORS=ON"
115-
116101
steps:
117102
- name: Checkout repo
118103
uses: actions/checkout@v4

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

Lines changed: 150 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,36 @@ jobs:
300300
rebar3_version: "3.24.0"
301301
cmake_opts_other: "-DAVM_DISABLE_JIT=OFF"
302302

303+
# armhf build
304+
- os: "ubuntu-24.04"
305+
cc: "arm-linux-gnueabihf-gcc"
306+
cxx: "arm-linux-gnueabihf-g++"
307+
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
308+
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
309+
cflags: "-mcpu=cortex-a7 -mfloat-abi=hard -O2 -mthumb -mthumb-interwork -D_FILE_OFFSET_BITS=64"
310+
otp: "28"
311+
elixir_version: "1.17"
312+
rebar3_version: "3.24.0"
313+
cmake_opts_other: "-DAVM_WARNINGS_ARE_ERRORS=ON -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/armhf_toolchain.cmake"
314+
compiler_pkgs: "crossbuild-essential-armhf libc6-dbg:armhf zlib1g-dev:armhf libmbedtls-dev:armhf qemu-user qemu-user-binfmt binfmt-support"
315+
arch: "armhf"
316+
library-arch: arm-linux-gnueabihf
317+
318+
# s390x build
319+
- os: "ubuntu-24.04"
320+
cc: "s390x-linux-gnu-gcc"
321+
cxx: "s390x-linux-gnu-g++"
322+
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
323+
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
324+
cflags: "-O2"
325+
otp: "28"
326+
elixir_version: "1.17"
327+
rebar3_version: "3.24.0"
328+
cmake_opts_other: "-DAVM_WARNINGS_ARE_ERRORS=ON -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/s390x_toolchain.cmake"
329+
compiler_pkgs: "crossbuild-essential-s390x libc6-dbg:s390x zlib1g-dev:s390x libmbedtls-dev:s390x qemu-user qemu-user-binfmt binfmt-support"
330+
arch: "s390x"
331+
library-arch: s390x-linux-gnu
332+
303333
env:
304334
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' }}
305335
CC: ${{ matrix.cc }}
@@ -319,6 +349,32 @@ jobs:
319349
if: matrix.arch == 'i386'
320350
run: sudo dpkg --add-architecture i386
321351

352+
- name: "Setup cross compilation architecture"
353+
if: matrix.library-arch != ''
354+
run: |
355+
sudo dpkg --add-architecture ${{ matrix.arch }}
356+
cat > ${RUNNER_TEMP}/cross-compile-sources.list <<EOF
357+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble main restricted
358+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates main restricted
359+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble universe
360+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates universe
361+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble multiverse
362+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-updates multiverse
363+
deb [arch=${{ matrix.arch }}] http://ports.ubuntu.com/ noble-backports main restricted universe multiverse
364+
EOF
365+
sudo mv ${RUNNER_TEMP}/cross-compile-sources.list /etc/apt/sources.list.d/
366+
367+
sudo sed -i '/Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
368+
369+
cat > ${RUNNER_TEMP}/${{ matrix.arch }}_toolchain.cmake <<EOF
370+
set(CMAKE_SYSTEM_NAME Linux)
371+
set(CMAKE_C_LIBRARY_ARCHITECTURE ${{ matrix.library-arch }})
372+
373+
set(ZLIB_LIBRARY /usr/lib/${{ matrix.library-arch }}/libz.so)
374+
set(MBEDTLS_ROOT_DIR /usr)
375+
set(MBEDTLS_LIBRARIES_DIR /usr/lib/${{ matrix.library-arch }})
376+
EOF
377+
322378
- name: "APT update"
323379
run: sudo apt update -y
324380

@@ -378,99 +434,178 @@ jobs:
378434
379435
- name: "Build: run make"
380436
working-directory: build
381-
run: make
437+
run: make -j3
382438

383439
- name: "Build: run dialyzer"
384440
working-directory: build
385441
run: make dialyzer
386442

387443
# Test
388-
- name: "Test: test-erlang"
389-
timeout-minutes: 15
444+
- name: "Test: test-erlang with valgrind"
445+
if: matrix.library-arch == ''
446+
timeout-minutes: 10
390447
working-directory: build
391448
run: |
392449
ulimit -c unlimited
393450
valgrind --error-exitcode=1 ./tests/test-erlang -s prime_smp
451+
452+
- name: "Test: test-erlang"
453+
timeout-minutes: 10
454+
working-directory: build
455+
run: |
456+
ulimit -c unlimited
394457
./tests/test-erlang -s prime_smp
395458
396-
- name: "Test: test-enif"
459+
- name: "Test: test-enif with valgrind"
460+
if: matrix.library-arch == ''
397461
working-directory: build
398462
run: |
399463
ulimit -c unlimited
400464
valgrind --error-exitcode=1 ./tests/test-enif
465+
466+
- name: "Test: test-enif"
467+
working-directory: build
468+
run: |
469+
ulimit -c unlimited
401470
./tests/test-enif
402471
403-
- name: "Test: test-heap"
472+
- name: "Test: test-heap with valgrind"
473+
if: matrix.library-arch == ''
404474
working-directory: build
405475
run: |
406476
ulimit -c unlimited
407477
valgrind --error-exitcode=1 ./tests/test-heap
478+
479+
- name: "Test: test-heap"
480+
working-directory: build
481+
run: |
482+
ulimit -c unlimited
408483
./tests/test-heap
409484
410-
- name: "Test: test-mailbox"
485+
- name: "Test: test-mailbox with valgrind"
486+
if: matrix.library-arch == ''
411487
working-directory: build
412488
run: |
413489
ulimit -c unlimited
414490
valgrind --error-exitcode=1 ./tests/test-mailbox
491+
492+
- name: "Test: test-mailbox"
493+
working-directory: build
494+
run: |
495+
ulimit -c unlimited
415496
./tests/test-mailbox
416497
417-
- name: "Test: test-structs"
498+
- name: "Test: test-structs with valgrind"
499+
if: matrix.library-arch == ''
418500
timeout-minutes: 10
419501
working-directory: build
420502
run: |
421503
ulimit -c unlimited
422504
valgrind --error-exitcode=1 ./tests/test-structs
505+
506+
- name: "Test: test-structs"
507+
timeout-minutes: 10
508+
working-directory: build
509+
run: |
510+
ulimit -c unlimited
423511
./tests/test-structs
424512
513+
- name: "Test: test_etest.avm with valgrind"
514+
if: matrix.library-arch == ''
515+
timeout-minutes: 5
516+
working-directory: build
517+
run: |
518+
ulimit -c unlimited
519+
valgrind ./src/AtomVM ./tests/libs/etest/test_etest.avm
520+
425521
- name: "Test: test_etest.avm"
426522
timeout-minutes: 5
427523
working-directory: build
428524
run: |
429525
ulimit -c unlimited
430526
./src/AtomVM ./tests/libs/etest/test_etest.avm
431-
valgrind ./src/AtomVM ./tests/libs/etest/test_etest.avm
432527
433-
- name: "Test: test_estdlib.avm"
434-
timeout-minutes: 30
528+
- name: "Test: test_estdlib.avm with valgrind"
529+
if: matrix.library-arch == ''
530+
timeout-minutes: 20
435531
working-directory: build
436532
run: |
437533
ulimit -c unlimited
438534
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/estdlib/test_estdlib.avm
535+
536+
- name: "Test: test_estdlib.avm"
537+
timeout-minutes: 20
538+
working-directory: build
539+
run: |
540+
ulimit -c unlimited
439541
./src/AtomVM ./tests/libs/estdlib/test_estdlib.avm
440542
441-
- name: "Test: test_eavmlib.avm"
543+
- name: "Test: test_eavmlib.avm with valgrind"
544+
if: matrix.library-arch == ''
442545
timeout-minutes: 10
443546
working-directory: build
444547
run: |
445548
ulimit -c unlimited
446549
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/eavmlib/test_eavmlib.avm
550+
551+
- name: "Test: test_eavmlib.avm"
552+
timeout-minutes: 10
553+
working-directory: build
554+
run: |
555+
ulimit -c unlimited
447556
./src/AtomVM ./tests/libs/eavmlib/test_eavmlib.avm
448557
558+
- name: "Test: test_jit.avm with valgrind"
559+
if: matrix.library-arch == '' && matrix.otp != '21' && matrix.otp != '22'
560+
timeout-minutes: 20
561+
working-directory: build
562+
run: |
563+
ulimit -c unlimited
564+
valgrind --error-exitcode=1 ./src/AtomVM tests/libs/jit/test_jit.avm
565+
449566
- name: "Test: test_jit.avm"
450-
timeout-minutes: 30
567+
timeout-minutes: 20
451568
if: matrix.otp != '21' && matrix.otp != '22'
452569
working-directory: build
453570
run: |
454571
ulimit -c unlimited
455-
valgrind --error-exitcode=1 ./src/AtomVM tests/libs/jit/test_jit.avm
456572
./src/AtomVM tests/libs/jit/test_jit.avm
457573
458-
- name: "Test: test_alisp.avm"
574+
- name: "Test: test_alisp.avm with valgrind"
575+
if: matrix.library-arch == ''
459576
timeout-minutes: 10
460577
working-directory: build
461578
run: |
462579
ulimit -c unlimited
463580
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/alisp/test_alisp.avm
581+
582+
- name: "Test: test_alisp.avm"
583+
timeout-minutes: 10
584+
working-directory: build
585+
run: |
586+
ulimit -c unlimited
464587
./src/AtomVM ./tests/libs/alisp/test_alisp.avm
465588
466-
- name: "Test: Tests.avm (Elixir)"
589+
- name: "Test: Tests.avm (Elixir) with valgrind"
590+
if: matrix.library-arch == ''
467591
timeout-minutes: 10
468592
working-directory: build
469593
run: |
470594
ulimit -c unlimited
471595
if command -v elixirc >/dev/null 2>&1 && command -v elixir >/dev/null 2>&1
472596
then
473597
valgrind --error-exitcode=1 ./src/AtomVM ./tests/libs/exavmlib/Tests.avm
598+
else
599+
echo "Elixir not installed, skipping Elixir tests"
600+
fi
601+
602+
- name: "Test: Tests.avm (Elixir)"
603+
timeout-minutes: 10
604+
working-directory: build
605+
run: |
606+
ulimit -c unlimited
607+
if command -v elixirc >/dev/null 2>&1 && command -v elixir >/dev/null 2>&1
608+
then
474609
./src/AtomVM ./tests/libs/exavmlib/Tests.avm
475610
else
476611
echo "Elixir not installed, skipping Elixir tests"

0 commit comments

Comments
 (0)