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