2020
2121macro (pack_archive avm_name)
2222
23- set (multiValueArgs ERLC_FLAGS MODULES)
23+ set (multiValueArgs ERLC_FLAGS MODULES DEPENDS_ON )
2424 cmake_parse_arguments (PACK_ARCHIVE "" "" "${multiValueArgs} " ${ARGN} )
2525 list (JOIN PACK_ARCHIVE_ERLC_FLAGS " " PACK_ARCHIVE_ERLC_FLAGS)
26+
27+ # Build -pa flags and file dependencies from DEPENDS_ON
28+ set (_pack_archive_pa_flags "" )
29+ set (_pack_archive_extra_deps "" )
30+ foreach (_dep_name IN LISTS PACK_ARCHIVE_DEPENDS_ON)
31+ list (APPEND _pack_archive_pa_flags -pa ${CMAKE_BINARY_DIR} /libs/${_dep_name} /src/beams)
32+ list (APPEND _pack_archive_extra_deps ${CMAKE_BINARY_DIR} /libs/${_dep_name} /src/${_dep_name} .avm)
33+ endforeach ()
34+
2635 foreach (module_name IN LISTS ${PACK_ARCHIVE_MODULES} PACK_ARCHIVE_MODULES PACK_ARCHIVE_UNPARSED_ARGUMENTS)
2736 add_custom_command (
2837 OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /beams/${module_name} .beam
@@ -32,8 +41,9 @@ macro(pack_archive avm_name)
3241 -I ${CMAKE_SOURCE_DIR} /libs/include
3342 -I ${CMAKE_SOURCE_DIR} /libs
3443 -I ${CMAKE_CURRENT_SOURCE_DIR} /../include
44+ ${_pack_archive_pa_flags}
3545 ${CMAKE_CURRENT_SOURCE_DIR} /${module_name} .erl
36- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /${module_name} .erl
46+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /${module_name} .erl ${_pack_archive_extra_deps}
3747 COMMENT "Compiling ${module_name} .erl"
3848 VERBATIM
3949 )
@@ -63,6 +73,10 @@ macro(pack_archive avm_name)
6373 ${avm_name} ALL
6474 DEPENDS ${avm_name} _emu
6575 )
76+ # Add target-level dependencies from DEPENDS_ON
77+ foreach (_dep_name IN LISTS PACK_ARCHIVE_DEPENDS_ON)
78+ add_dependencies (${avm_name} ${_dep_name} )
79+ endforeach ()
6680endmacro ()
6781
6882macro (pack_precompiled_archive avm_name)
@@ -127,12 +141,17 @@ macro(pack_precompiled_archive avm_name)
127141endmacro ()
128142
129143macro (pack_lib avm_name)
144+ set (options UF2)
145+ cmake_parse_arguments (PACK_LIB "${options} " "" "" ${ARGN} )
146+
130147 set (pack_lib_${avm_name} _archive_targets "" )
148+ set (pack_lib_${avm_name} _archives "" )
149+ set (pack_lib_${avm_name} _emu_archives "" )
131150 if (NOT AVM_DISABLE_JIT)
132151 set (pack_lib_${avm_name} _archive_targets jit)
133152 endif ()
134153
135- foreach (archive_name ${ARGN } )
154+ foreach (archive_name ${PACK_LIB_UNPARSED_ARGUMENTS } )
136155 if (${archive_name} STREQUAL "exavmlib" )
137156 set (pack_lib_${avm_name} _archives ${pack_lib_${avm_name} _archives} ${CMAKE_BINARY_DIR} /libs/${archive_name} /lib/${archive_name} .avm)
138157 elseif (${archive_name} STREQUAL "estdlib" )
@@ -164,7 +183,7 @@ macro(pack_lib avm_name)
164183 foreach (jit_target_arch_variant ${AVM_PRECOMPILED_TARGETS} )
165184 # Build JIT archives list for this specific target architecture
166185 set (pack_lib_${avm_name} _jit_archives_${jit_target_arch_variant} ${CMAKE_BINARY_DIR} /libs/jit/src/jit-${jit_target_arch_variant} .avm)
167- foreach (archive_name ${ARGN } )
186+ foreach (archive_name ${PACK_LIB_UNPARSED_ARGUMENTS } )
168187 if (${archive_name} STREQUAL "estdlib" )
169188 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)
170189 endif ()
@@ -180,56 +199,59 @@ macro(pack_lib avm_name)
180199 set (target_deps ${target_deps} ${avm_name} -${jit_target_arch_variant} .avm)
181200 endforeach ()
182201 endif ()
183- add_custom_command (
184- OUTPUT ${avm_name} -pico.uf2
185- DEPENDS ${avm_name} .avm UF2Tool
186- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -pico.uf2 -s 0x10100000 ${avm_name} .avm
187- COMMENT "Creating UF2 file ${avm_name} .uf2"
188- VERBATIM
189- )
190- add_custom_command (
191- OUTPUT ${avm_name} -pico2.uf2
192- DEPENDS ${avm_name} .avm UF2Tool
193- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -pico2.uf2 -f data -s 0x10100000 ${avm_name} .avm
194- COMMENT "Creating UF2 file ${avm_name} .uf2"
195- VERBATIM
196- )
197- set (target_deps ${target_deps} ${avm_name} -pico.uf2 ${avm_name} -pico2.uf2)
198202
199- if (( NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ( "armv6m" IN_LIST AVM_PRECOMPILED_TARGETS) )
203+ if (PACK_LIB_UF2 )
200204 add_custom_command (
201- OUTPUT ${avm_name} -armv6m- pico.uf2
202- DEPENDS ${avm_name} -armv6m .avm UF2Tool
203- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m- pico.uf2 -s 0x10100000 ${avm_name} -armv6m .avm
204- COMMENT "Creating UF2 file ${avm_name} -armv6m .uf2"
205+ OUTPUT ${avm_name} -pico.uf2
206+ DEPENDS ${avm_name} .avm UF2Tool
207+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -pico.uf2 -s 0x10100000 ${avm_name} .avm
208+ COMMENT "Creating UF2 file ${avm_name} -pico .uf2"
205209 VERBATIM
206210 )
207211 add_custom_command (
208- OUTPUT ${avm_name} -armv6m- pico2.uf2
209- DEPENDS ${avm_name} -armv6m .avm UF2Tool
210- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m- pico2.uf2 -f data -s 0x10100000 ${avm_name} -armv6m .avm
211- COMMENT "Creating UF2 file ${avm_name} -armv6m .uf2"
212+ OUTPUT ${avm_name} -pico2.uf2
213+ DEPENDS ${avm_name} .avm UF2Tool
214+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -pico2.uf2 -f data -s 0x10100000 ${avm_name} .avm
215+ COMMENT "Creating UF2 file ${avm_name} -pico2 .uf2"
212216 VERBATIM
213217 )
214- set (target_deps ${target_deps} ${avm_name} -armv6m-pico.uf2 ${avm_name} -armv6m-pico2.uf2)
215- endif ()
218+ set (target_deps ${target_deps} ${avm_name} -pico.uf2 ${avm_name} -pico2.uf2)
216219
217- if ((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m+float32" IN_LIST AVM_PRECOMPILED_TARGETS))
218- add_custom_command (
219- OUTPUT ${avm_name} -armv6m+float32-pico.uf2
220- DEPENDS ${avm_name} -armv6m+float32.avm UF2Tool
221- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m+float32-pico.uf2 -s 0x10100000 ${avm_name} -armv6m+float32.avm
222- COMMENT "Creating UF2 file ${avm_name} -armv6m+float32.uf2"
223- VERBATIM
224- )
225- add_custom_command (
226- OUTPUT ${avm_name} -armv6m+float32-pico2.uf2
227- DEPENDS ${avm_name} -armv6m+float32.avm UF2Tool
228- COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m+float32-pico2.uf2 -f data -s 0x10100000 ${avm_name} -armv6m+float32.avm
229- COMMENT "Creating UF2 file ${avm_name} -armv6m+float32.uf2"
230- VERBATIM
231- )
232- set (target_deps ${target_deps} ${avm_name} -armv6m+float32-pico.uf2 ${avm_name} -armv6m+float32-pico2.uf2)
220+ if ((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m" IN_LIST AVM_PRECOMPILED_TARGETS))
221+ add_custom_command (
222+ OUTPUT ${avm_name} -armv6m-pico.uf2
223+ DEPENDS ${avm_name} -armv6m.avm UF2Tool
224+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m-pico.uf2 -s 0x10100000 ${avm_name} -armv6m.avm
225+ COMMENT "Creating UF2 file ${avm_name} -armv6m-pico.uf2"
226+ VERBATIM
227+ )
228+ add_custom_command (
229+ OUTPUT ${avm_name} -armv6m-pico2.uf2
230+ DEPENDS ${avm_name} -armv6m.avm UF2Tool
231+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m-pico2.uf2 -f data -s 0x10100000 ${avm_name} -armv6m.avm
232+ COMMENT "Creating UF2 file ${avm_name} -armv6m-pico2.uf2"
233+ VERBATIM
234+ )
235+ set (target_deps ${target_deps} ${avm_name} -armv6m-pico.uf2 ${avm_name} -armv6m-pico2.uf2)
236+ endif ()
237+
238+ if ((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m+float32" IN_LIST AVM_PRECOMPILED_TARGETS))
239+ add_custom_command (
240+ OUTPUT ${avm_name} -armv6m+float32-pico.uf2
241+ DEPENDS ${avm_name} -armv6m+float32.avm UF2Tool
242+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m+float32-pico.uf2 -s 0x10100000 ${avm_name} -armv6m+float32.avm
243+ COMMENT "Creating UF2 file ${avm_name} -armv6m+float32-pico.uf2"
244+ VERBATIM
245+ )
246+ add_custom_command (
247+ OUTPUT ${avm_name} -armv6m+float32-pico2.uf2
248+ DEPENDS ${avm_name} -armv6m+float32.avm UF2Tool
249+ COMMAND ${CMAKE_BINARY_DIR} /tools/uf2tool/uf2tool create -o ${avm_name} -armv6m+float32-pico2.uf2 -f data -s 0x10100000 ${avm_name} -armv6m+float32.avm
250+ COMMENT "Creating UF2 file ${avm_name} -armv6m+float32-pico2.uf2"
251+ VERBATIM
252+ )
253+ set (target_deps ${target_deps} ${avm_name} -armv6m+float32-pico.uf2 ${avm_name} -armv6m+float32-pico2.uf2)
254+ endif ()
233255 endif ()
234256
235257 add_custom_target (
@@ -258,25 +280,38 @@ macro(pack_runnable avm_name main)
258280 DEPENDS ${main} .beam
259281 )
260282
283+ # Select the right PLT based on platform-specific dependencies
284+ set (pack_runnable_${avm_name} _plt_name "atomvmlib" )
285+
261286 foreach (archive_name ${ARGN} )
262287 if (NOT ${archive_name} STREQUAL "exavmlib" )
263288 set (pack_runnable_${avm_name} _archives ${pack_runnable_${avm_name} _archives} ${CMAKE_BINARY_DIR} /libs/${archive_name} /src/${archive_name} .avm)
264- if (NOT ${archive_name} MATCHES "^eavmlib|estdlib|alisp$" )
289+ if (NOT ${archive_name} MATCHES "^eavmlib|estdlib|alisp|avm_network|avm_esp32|avm_rp2|avm_stm32|avm_emscripten $" )
265290 set (${avm_name} _dialyzer_beams_opt ${${avm_name} _dialyzer_beams_opt} "-r" ${CMAKE_BINARY_DIR} /libs/${archive_name} /src/beams/)
266291 endif ()
267292 else ()
268293 set (pack_runnable_${avm_name} _archives ${pack_runnable_${avm_name} _archives} ${CMAKE_BINARY_DIR} /libs/${archive_name} /lib/${archive_name} .avm)
269294 endif ()
270295 set (pack_runnable_${avm_name} _archive_targets ${pack_runnable_${avm_name} _archive_targets} ${archive_name} )
296+ # Pick the platform-specific PLT if a platform library is in the dependencies
297+ if (${archive_name} STREQUAL "avm_esp32" )
298+ set (pack_runnable_${avm_name} _plt_name "atomvmlib-esp32" )
299+ elseif (${archive_name} STREQUAL "avm_rp2" )
300+ set (pack_runnable_${avm_name} _plt_name "atomvmlib-rp2" )
301+ elseif (${archive_name} STREQUAL "avm_stm32" )
302+ set (pack_runnable_${avm_name} _plt_name "atomvmlib-stm32" )
303+ elseif (${archive_name} STREQUAL "avm_emscripten" )
304+ set (pack_runnable_${avm_name} _plt_name "atomvmlib-emscripten" )
305+ endif ()
271306 endforeach ()
272307
273308 if (Dialyzer_FOUND)
274309 add_custom_target (
275310 ${avm_name} _dialyzer
276311 DEPENDS ${avm_name} _main
277- COMMAND dialyzer --plt ${CMAKE_BINARY_DIR} /libs/atomvmlib .plt -c ${main} .beam ${${avm_name} _dialyzer_beams_opt}
312+ COMMAND dialyzer --plt ${CMAKE_BINARY_DIR} /libs/${pack_runnable_ ${avm_name} _plt_name} .plt -c ${main} .beam ${${avm_name} _dialyzer_beams_opt}
278313 )
279- add_dependencies (${avm_name} _dialyzer atomvmlib_plt ${pack_runnable_${avm_name} _archive_targets})
314+ add_dependencies (${avm_name} _dialyzer ${pack_runnable_ ${avm_name} _plt_name}_plt ${pack_runnable_${avm_name} _archive_targets})
280315 add_dependencies (dialyzer ${avm_name} _dialyzer)
281316 endif ()
282317
0 commit comments