@@ -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