Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions .github/workflows/build-libraries.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,11 @@ jobs:
- name: "Rename and write sha256sum"
working-directory: build
run: |
ATOMVMLIB_FILE=atomvmlib-${{ github.ref_name }}.avm
mv libs/atomvmlib.avm "libs/${ATOMVMLIB_FILE}" &&
sha256sum "libs/${ATOMVMLIB_FILE}" > "libs/${ATOMVMLIB_FILE}.sha256"
for variant in atomvmlib atomvmlib-esp32 atomvmlib-rp2 atomvmlib-stm32 atomvmlib-emscripten; do
VARIANT_FILE="${variant}-${{ github.ref_name }}.avm"
mv "libs/${variant}.avm" "libs/${VARIANT_FILE}" &&
sha256sum "libs/${VARIANT_FILE}" > "libs/${VARIANT_FILE}.sha256"
done
HELLO_WORLD_FILE=hello_world-${{ github.ref_name }}.avm
mv examples/erlang/hello_world.avm "examples/erlang/${HELLO_WORLD_FILE}"
sha256sum "examples/erlang/${HELLO_WORLD_FILE}" > "examples/erlang/${HELLO_WORLD_FILE}.sha256"
Expand All @@ -129,5 +131,13 @@ jobs:
files: |
build/libs/atomvmlib-${{ github.ref_name }}.avm
build/libs/atomvmlib-${{ github.ref_name }}.avm.sha256
build/libs/atomvmlib-esp32-${{ github.ref_name }}.avm
build/libs/atomvmlib-esp32-${{ github.ref_name }}.avm.sha256
build/libs/atomvmlib-rp2-${{ github.ref_name }}.avm
build/libs/atomvmlib-rp2-${{ github.ref_name }}.avm.sha256
build/libs/atomvmlib-stm32-${{ github.ref_name }}.avm
build/libs/atomvmlib-stm32-${{ github.ref_name }}.avm.sha256
build/libs/atomvmlib-emscripten-${{ github.ref_name }}.avm
build/libs/atomvmlib-emscripten-${{ github.ref_name }}.avm.sha256
build/examples/erlang/hello_world-${{ github.ref_name }}.avm
build/examples/erlang/hello_world-${{ github.ref_name }}.avm.sha256
19 changes: 7 additions & 12 deletions .github/workflows/pico-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -138,15 +138,15 @@ jobs:
npm install
npx tsx run-tests.ts ../build.nosmp/tests/rp2_tests.uf2 ../build.nosmp/tests/test_erl_sources/rp2_test_modules.uf2

- name: Build atomvmlib.uf2
- name: Build atomvmlib-rp2.uf2
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w' && matrix.platform == '' && matrix.jit == ''
shell: bash
run: |
set -euo pipefail
mkdir build
cd build
cmake ..
make atomvmlib-${{ matrix.board }}.uf2
make atomvmlib-rp2-${{ matrix.board }}.uf2

- name: Rename AtomVM and write sha256sum
if: startsWith(github.ref, 'refs/tags/') && matrix.platform == '' && matrix.jit == ''
Expand All @@ -157,19 +157,14 @@ jobs:
mv src/AtomVM.uf2 "src/${ATOMVM_UF2}"
sha256sum "src/${ATOMVM_UF2}" > "src/${ATOMVM_UF2}.sha256"
popd
pushd build/libs
ATOMVMLIB_FILE=atomvmlib-${{ matrix.board }}-${{ github.ref_name }}.uf2
mv atomvmlib.uf2 "${ATOMVMLIB_FILE}"
sha256sum "${ATOMVMLIB_FILE}" > "${ATOMVMLIB_FILE}.sha256"
popd

- name: Rename atomvmlib and write sha256sum
- name: Rename atomvmlib-rp2 and write sha256sum
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w' && matrix.platform == '' && matrix.jit == ''
shell: bash
run: |
pushd build/libs
ATOMVMLIB_FILE=atomvmlib-${{ matrix.board }}-${{ github.ref_name }}.uf2
mv atomvmlib-${{ matrix.board }}.uf2 "${ATOMVMLIB_FILE}"
ATOMVMLIB_FILE=atomvmlib-rp2-${{ matrix.board }}-${{ github.ref_name }}.uf2
mv atomvmlib-rp2-${{ matrix.board }}.uf2 "${ATOMVMLIB_FILE}"
sha256sum "${ATOMVMLIB_FILE}" > "${ATOMVMLIB_FILE}.sha256"
popd

Expand All @@ -182,8 +177,8 @@ jobs:
files: |
src/platforms/rp2/build/src/AtomVM-${{ matrix.board }}-${{ github.ref_name }}.uf2
src/platforms/rp2/build/src/AtomVM-${{ matrix.board }}-${{ github.ref_name }}.uf2.sha256
build/libs/atomvmlib-${{ matrix.board }}-${{ github.ref_name }}.uf2
build/libs/atomvmlib-${{ matrix.board }}-${{ github.ref_name }}.uf2.sha256
build/libs/atomvmlib-rp2-${{ matrix.board }}-${{ github.ref_name }}.uf2
build/libs/atomvmlib-rp2-${{ matrix.board }}-${{ github.ref_name }}.uf2.sha256

- name: Release (PicoW)
uses: softprops/action-gh-release@v1
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/run-tests-with-beam.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ jobs:
working-directory: build
run: |
export PATH="${{ matrix.path_prefix }}$PATH"
erl -pa tests/libs/estdlib/ -pa tests/libs/estdlib/beams/ -pa libs/etest/src/beams -pa libs/eavmlib/src/beams -s tests -s init stop -noshell
erl -pa tests/libs/estdlib/ -pa tests/libs/estdlib/beams/ -pa libs/etest/src/beams -pa libs/eavmlib/src/beams -pa libs/avm_network/src/beams -s tests -s init stop -noshell

# Test
- name: "Run tests/libs/etest/test_eunit with OTP eunit"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/wasm-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ jobs:
cd build
cmake .. -G Ninja -DAVM_WARNINGS_ARE_ERRORS=ON
# test_eavmlib does not work with wasm due to http + ssl test
ninja AtomVM atomvmlib erlang_test_modules test_etest test_alisp test_estdlib hello_world run_script call_cast html5_events wasm_webserver
ninja AtomVM atomvmlib atomvmlib-emscripten erlang_test_modules test_etest test_alisp test_estdlib hello_world run_script call_cast html5_events wasm_webserver

- name: "Perform CodeQL Analysis"
uses: github/codeql-action/analyze@v4
Expand Down
133 changes: 84 additions & 49 deletions CMakeModules/BuildErlang.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,18 @@

macro(pack_archive avm_name)

set(multiValueArgs ERLC_FLAGS MODULES)
set(multiValueArgs ERLC_FLAGS MODULES DEPENDS_ON)
cmake_parse_arguments(PACK_ARCHIVE "" "" "${multiValueArgs}" ${ARGN})
list(JOIN PACK_ARCHIVE_ERLC_FLAGS " " PACK_ARCHIVE_ERLC_FLAGS)

# Build -pa flags and file dependencies from DEPENDS_ON
set(_pack_archive_pa_flags "")
set(_pack_archive_extra_deps "")
foreach(_dep_name IN LISTS PACK_ARCHIVE_DEPENDS_ON)
list(APPEND _pack_archive_pa_flags -pa ${CMAKE_BINARY_DIR}/libs/${_dep_name}/src/beams)
list(APPEND _pack_archive_extra_deps ${CMAKE_BINARY_DIR}/libs/${_dep_name}/src/${_dep_name}.avm)
endforeach()

foreach(module_name IN LISTS ${PACK_ARCHIVE_MODULES} PACK_ARCHIVE_MODULES PACK_ARCHIVE_UNPARSED_ARGUMENTS)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/beams/${module_name}.beam
Expand All @@ -32,8 +41,9 @@ macro(pack_archive avm_name)
-I ${CMAKE_SOURCE_DIR}/libs/include
-I ${CMAKE_SOURCE_DIR}/libs
-I ${CMAKE_CURRENT_SOURCE_DIR}/../include
${_pack_archive_pa_flags}
${CMAKE_CURRENT_SOURCE_DIR}/${module_name}.erl
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}.erl
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}.erl ${_pack_archive_extra_deps}
COMMENT "Compiling ${module_name}.erl"
VERBATIM
)
Expand Down Expand Up @@ -63,6 +73,10 @@ macro(pack_archive avm_name)
${avm_name} ALL
DEPENDS ${avm_name}_emu
)
# Add target-level dependencies from DEPENDS_ON
foreach(_dep_name IN LISTS PACK_ARCHIVE_DEPENDS_ON)
add_dependencies(${avm_name} ${_dep_name})
endforeach()
endmacro()

macro(pack_precompiled_archive avm_name)
Expand Down Expand Up @@ -127,12 +141,17 @@ macro(pack_precompiled_archive avm_name)
endmacro()

macro(pack_lib avm_name)
set(options UF2)
cmake_parse_arguments(PACK_LIB "${options}" "" "" ${ARGN})

set(pack_lib_${avm_name}_archive_targets "")
set(pack_lib_${avm_name}_archives "")
set(pack_lib_${avm_name}_emu_archives "")
if(NOT AVM_DISABLE_JIT)
set(pack_lib_${avm_name}_archive_targets jit)
endif()

foreach(archive_name ${ARGN})
foreach(archive_name ${PACK_LIB_UNPARSED_ARGUMENTS})
if(${archive_name} STREQUAL "exavmlib")
set(pack_lib_${avm_name}_archives ${pack_lib_${avm_name}_archives} ${CMAKE_BINARY_DIR}/libs/${archive_name}/lib/${archive_name}.avm)
elseif(${archive_name} STREQUAL "estdlib")
Expand Down Expand Up @@ -164,7 +183,7 @@ macro(pack_lib avm_name)
foreach(jit_target_arch_variant ${AVM_PRECOMPILED_TARGETS})
# Build JIT archives list for this specific target architecture
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant} ${CMAKE_BINARY_DIR}/libs/jit/src/jit-${jit_target_arch_variant}.avm)
foreach(archive_name ${ARGN})
foreach(archive_name ${PACK_LIB_UNPARSED_ARGUMENTS})
if(${archive_name} STREQUAL "estdlib")
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant} ${pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant}} ${CMAKE_BINARY_DIR}/libs/${archive_name}/src/${archive_name}-${jit_target_arch_variant}.avm)
endif()
Expand All @@ -180,56 +199,59 @@ macro(pack_lib avm_name)
set(target_deps ${target_deps} ${avm_name}-${jit_target_arch_variant}.avm)
endforeach()
endif()
add_custom_command(
OUTPUT ${avm_name}-pico.uf2
DEPENDS ${avm_name}.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-pico.uf2 -s 0x10100000 ${avm_name}.avm
COMMENT "Creating UF2 file ${avm_name}.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-pico2.uf2
DEPENDS ${avm_name}.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-pico2.uf2 -f data -s 0x10100000 ${avm_name}.avm
COMMENT "Creating UF2 file ${avm_name}.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-pico.uf2 ${avm_name}-pico2.uf2)

if((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m" IN_LIST AVM_PRECOMPILED_TARGETS))
if(PACK_LIB_UF2)
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico.uf2 -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m.uf2"
OUTPUT ${avm_name}-pico.uf2
DEPENDS ${avm_name}.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-pico.uf2 -s 0x10100000 ${avm_name}.avm
COMMENT "Creating UF2 file ${avm_name}-pico.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico2.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico2.uf2 -f data -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m.uf2"
OUTPUT ${avm_name}-pico2.uf2
DEPENDS ${avm_name}.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-pico2.uf2 -f data -s 0x10100000 ${avm_name}.avm
COMMENT "Creating UF2 file ${avm_name}-pico2.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-armv6m-pico.uf2 ${avm_name}-armv6m-pico2.uf2)
endif()
set(target_deps ${target_deps} ${avm_name}-pico.uf2 ${avm_name}-pico2.uf2)

if((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m+float32" IN_LIST AVM_PRECOMPILED_TARGETS))
add_custom_command(
OUTPUT ${avm_name}-armv6m+float32-pico.uf2
DEPENDS ${avm_name}-armv6m+float32.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m+float32-pico.uf2 -s 0x10100000 ${avm_name}-armv6m+float32.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m+float32.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-armv6m+float32-pico2.uf2
DEPENDS ${avm_name}-armv6m+float32.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m+float32-pico2.uf2 -f data -s 0x10100000 ${avm_name}-armv6m+float32.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m+float32.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-armv6m+float32-pico.uf2 ${avm_name}-armv6m+float32-pico2.uf2)
if((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m" IN_LIST AVM_PRECOMPILED_TARGETS))
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico.uf2 -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m-pico.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico2.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico2.uf2 -f data -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m-pico2.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-armv6m-pico.uf2 ${avm_name}-armv6m-pico2.uf2)
endif()

if((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m+float32" IN_LIST AVM_PRECOMPILED_TARGETS))
add_custom_command(
OUTPUT ${avm_name}-armv6m+float32-pico.uf2
DEPENDS ${avm_name}-armv6m+float32.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m+float32-pico.uf2 -s 0x10100000 ${avm_name}-armv6m+float32.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m+float32-pico.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-armv6m+float32-pico2.uf2
DEPENDS ${avm_name}-armv6m+float32.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m+float32-pico2.uf2 -f data -s 0x10100000 ${avm_name}-armv6m+float32.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m+float32-pico2.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-armv6m+float32-pico.uf2 ${avm_name}-armv6m+float32-pico2.uf2)
endif()
endif()

add_custom_target(
Expand Down Expand Up @@ -258,25 +280,38 @@ macro(pack_runnable avm_name main)
DEPENDS ${main}.beam
)

# Select the right PLT based on platform-specific dependencies
set(pack_runnable_${avm_name}_plt_name "atomvmlib")

foreach(archive_name ${ARGN})
if(NOT ${archive_name} STREQUAL "exavmlib")
set(pack_runnable_${avm_name}_archives ${pack_runnable_${avm_name}_archives} ${CMAKE_BINARY_DIR}/libs/${archive_name}/src/${archive_name}.avm)
if(NOT ${archive_name} MATCHES "^eavmlib|estdlib|alisp$")
if(NOT ${archive_name} MATCHES "^eavmlib|estdlib|alisp|avm_network|avm_esp32|avm_rp2|avm_stm32|avm_emscripten$")
set(${avm_name}_dialyzer_beams_opt ${${avm_name}_dialyzer_beams_opt} "-r" ${CMAKE_BINARY_DIR}/libs/${archive_name}/src/beams/)
endif()
else()
set(pack_runnable_${avm_name}_archives ${pack_runnable_${avm_name}_archives} ${CMAKE_BINARY_DIR}/libs/${archive_name}/lib/${archive_name}.avm)
endif()
set(pack_runnable_${avm_name}_archive_targets ${pack_runnable_${avm_name}_archive_targets} ${archive_name})
# Pick the platform-specific PLT if a platform library is in the dependencies
if(${archive_name} STREQUAL "avm_esp32")
set(pack_runnable_${avm_name}_plt_name "atomvmlib-esp32")
elseif(${archive_name} STREQUAL "avm_rp2")
set(pack_runnable_${avm_name}_plt_name "atomvmlib-rp2")
elseif(${archive_name} STREQUAL "avm_stm32")
set(pack_runnable_${avm_name}_plt_name "atomvmlib-stm32")
elseif(${archive_name} STREQUAL "avm_emscripten")
set(pack_runnable_${avm_name}_plt_name "atomvmlib-emscripten")
endif()
endforeach()

if (Dialyzer_FOUND)
add_custom_target(
${avm_name}_dialyzer
DEPENDS ${avm_name}_main
COMMAND dialyzer --plt ${CMAKE_BINARY_DIR}/libs/atomvmlib.plt -c ${main}.beam ${${avm_name}_dialyzer_beams_opt}
COMMAND dialyzer --plt ${CMAKE_BINARY_DIR}/libs/${pack_runnable_${avm_name}_plt_name}.plt -c ${main}.beam ${${avm_name}_dialyzer_beams_opt}
)
add_dependencies(${avm_name}_dialyzer atomvmlib_plt ${pack_runnable_${avm_name}_archive_targets})
add_dependencies(${avm_name}_dialyzer ${pack_runnable_${avm_name}_plt_name}_plt ${pack_runnable_${avm_name}_archive_targets})
add_dependencies(dialyzer ${avm_name}_dialyzer)
endif()

Expand Down
6 changes: 3 additions & 3 deletions examples/elixir/esp32/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ project(examples_elixir_esp32)

include(BuildElixir)

pack_runnable(Blink Blink estdlib eavmlib exavmlib)
pack_runnable(Ledc_x4 Ledc_x4 estdlib eavmlib exavmlib)
pack_runnable(Blink Blink estdlib eavmlib exavmlib avm_esp32)
pack_runnable(Ledc_x4 Ledc_x4 estdlib eavmlib exavmlib avm_esp32)
if(NOT (AVM_DISABLE_FP))
pack_runnable(SHT31 SHT31 estdlib eavmlib exavmlib)
pack_runnable(SHT31 SHT31 estdlib eavmlib exavmlib avm_esp32)
endif()
2 changes: 1 addition & 1 deletion examples/elixir/stm32/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ project(examples_elixir_stm32)

include(BuildElixir)

pack_runnable(MultiBlink MultiBlink estdlib eavmlib exavmlib)
pack_runnable(MultiBlink MultiBlink estdlib eavmlib exavmlib avm_stm32)
10 changes: 5 additions & 5 deletions examples/emscripten/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ project(examples_emscripten)

include(BuildErlang)

pack_runnable(run_script run_script estdlib eavmlib)
pack_runnable(call_cast call_cast eavmlib)
pack_runnable(html5_events html5_events estdlib eavmlib)
pack_runnable(echo_websocket echo_websocket estdlib eavmlib)
pack_runnable(wasm_webserver wasm_webserver estdlib eavmlib)
pack_runnable(run_script run_script estdlib eavmlib avm_emscripten)
pack_runnable(call_cast call_cast eavmlib avm_emscripten)
pack_runnable(html5_events html5_events estdlib eavmlib avm_emscripten)
pack_runnable(echo_websocket echo_websocket estdlib eavmlib avm_emscripten)
pack_runnable(wasm_webserver wasm_webserver estdlib eavmlib avm_network avm_emscripten)
6 changes: 3 additions & 3 deletions examples/erlang/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ pack_runnable(tcp_socket_client tcp_socket_client estdlib eavmlib)
pack_runnable(tcp_socket_server tcp_socket_server estdlib eavmlib)
pack_runnable(udp_socket_server udp_socket_server estdlib eavmlib)
pack_runnable(udp_socket_client udp_socket_client estdlib eavmlib)
pack_runnable(hello_world_server hello_world_server estdlib eavmlib)
pack_runnable(system_info_server system_info_server estdlib eavmlib)
pack_runnable(hello_world_server hello_world_server estdlib eavmlib avm_network)
pack_runnable(system_info_server system_info_server estdlib eavmlib avm_network)
pack_runnable(code_lock code_lock estdlib eavmlib)
pack_runnable(mqtt_client mqtt_client estdlib eavmlib)
pack_runnable(network_console network_console estdlib eavmlib alisp)
pack_runnable(logging_example logging_example estdlib eavmlib)
pack_runnable(http_client http_client estdlib eavmlib)
pack_runnable(http_client http_client estdlib eavmlib avm_network)
pack_runnable(disterl disterl estdlib)
Loading
Loading