From a00145932c817cbf7100d5c12f5d71596e11fc46 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Fri, 23 Aug 2024 23:31:26 +0200 Subject: [PATCH 1/7] Alway generate variable for artifacts filename --- .github/workflows/run-testsuite.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/run-testsuite.yml b/.github/workflows/run-testsuite.yml index 88a0701..c31c59a 100644 --- a/.github/workflows/run-testsuite.yml +++ b/.github/workflows/run-testsuite.yml @@ -70,6 +70,7 @@ jobs: paths: "**/test-results.xml" - name: Prepare upload of build artifacts + if: always() run: | echo "platform=${{ inputs.platform }}".replace(":", "-") >> $env:GITHUB_ENV From 741d448a1d088557d747ccf027c1890821ed4ca2 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Thu, 22 Aug 2024 22:54:51 +0200 Subject: [PATCH 2/7] Do not sort library directories Directory order is important in Arduino build spec. --- toolchain/arduino-cli-toolchain.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/toolchain/arduino-cli-toolchain.cmake b/toolchain/arduino-cli-toolchain.cmake index ae34f1f..4fea709 100644 --- a/toolchain/arduino-cli-toolchain.cmake +++ b/toolchain/arduino-cli-toolchain.cmake @@ -707,7 +707,6 @@ function(__arduino_add_import_library NAME SOURCE_DIR) # [SOURCE_DIR...] set(_library_directories "${SOURCE_DIR}" ${ARGN}) list(FILTER _library_directories EXCLUDE REGEX "^ *\$") list(REMOVE_DUPLICATES _library_directories) - list(SORT _library_directories) __arduino_collect_source_files(_library_sources ${_library_directories}) # <----- collect the library's source files From 6abc7cc86468869dfe09db853eb0f39073bb4bdb Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Thu, 22 Aug 2024 22:55:27 +0200 Subject: [PATCH 3/7] Do not count number of library source folders It's rather uninteresting noise. --- toolchain/arduino-cli-toolchain.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/toolchain/arduino-cli-toolchain.cmake b/toolchain/arduino-cli-toolchain.cmake index 4fea709..a54ef81 100644 --- a/toolchain/arduino-cli-toolchain.cmake +++ b/toolchain/arduino-cli-toolchain.cmake @@ -711,8 +711,7 @@ function(__arduino_add_import_library NAME SOURCE_DIR) # [SOURCE_DIR...] __arduino_collect_source_files(_library_sources ${_library_directories}) # <----- collect the library's source files list(LENGTH _library_sources _source_file_count) - list(LENGTH _library_directories _source_dir_count) - message(STATUS " ${_source_file_count} source files found for ${_target} in ${_source_dir_count} directories") + message(STATUS " ${_source_file_count} source files found for ${_target}") list(JOIN _library_sources "\"\n \"" _quoted_library_sources) # <--------- prepare CMake to build out of tree list(JOIN _library_directories "\"\n \"" _quoted_library_directories) From b48fca2f92f7c38718df86bd611dea7796da9175 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Thu, 22 Aug 2024 22:44:20 +0200 Subject: [PATCH 4/7] Reuse already built Arduino libraries --- toolchain/arduino-cli-toolchain.cmake | 112 +++++++++++++++++++------- 1 file changed, 81 insertions(+), 31 deletions(-) diff --git a/toolchain/arduino-cli-toolchain.cmake b/toolchain/arduino-cli-toolchain.cmake index a54ef81..a90adaf 100644 --- a/toolchain/arduino-cli-toolchain.cmake +++ b/toolchain/arduino-cli-toolchain.cmake @@ -696,50 +696,80 @@ endfunction() # if not hundreds of out-of-tree sources the library is built separately and later gets pulled as IMPORT library. # ---------------------------------------------------------------------------------------------------------------------- function(__arduino_add_import_library NAME SOURCE_DIR) # [SOURCE_DIR...] + string(TOUPPER "ARDUINO_${NAME}" _prefix) + set(_libname "Arduino${NAME}") set(_target "Arduino::${NAME}") - set(_library_binary_dir "${CMAKE_BINARY_DIR}/Arduino/${NAME}") - set(_library_source_dir "${CMAKE_BINARY_DIR}/ArduinoFiles/${NAME}") - set(_library_template "${ARDUINO_TOOLCHAIN_DIR}/Templates/ArduinoLibraryCMakeLists.txt.in") - set(_library_filepath "${_library_binary_dir}/lib${_libname}.a") + if (${_prefix}_FILEPATH) + message(STATUS "Using ${_target} from ${${_prefix}_FILEPATH}") - set(_library_directories "${SOURCE_DIR}" ${ARGN}) - list(FILTER _library_directories EXCLUDE REGEX "^ *\$") - list(REMOVE_DUPLICATES _library_directories) + set(_library_binary_dir "${${_prefix}_BINARY_DIR}") + set(_library_source_dir "${${_prefix}_BINARY_DIR}") + set(_library_directories "${${_prefix}_INCLUDE_DIRS}") + set(_library_filepath "${${_prefix}_FILEPATH}") + else() + message(STATUS "Building ${_target} from scratch") - __arduino_collect_source_files(_library_sources ${_library_directories}) # <----- collect the library's source files + set(_library_binary_dir "${CMAKE_BINARY_DIR}/Arduino/${NAME}") + set(_library_source_dir "${CMAKE_BINARY_DIR}/ArduinoFiles/${NAME}") + set(_library_filepath "${_library_binary_dir}/lib${_libname}.a") - list(LENGTH _library_sources _source_file_count) - message(STATUS " ${_source_file_count} source files found for ${_target}") + set(_library_directories "${SOURCE_DIR}" ${ARGN}) # <---------------- normalize the library's source directories + list(FILTER _library_directories EXCLUDE REGEX "^ *\$") + list(REMOVE_DUPLICATES _library_directories) - list(JOIN _library_sources "\"\n \"" _quoted_library_sources) # <--------- prepare CMake to build out of tree - list(JOIN _library_directories "\"\n \"" _quoted_library_directories) - configure_file("${_library_template}" "${_library_source_dir}/CMakeLists.txt") + __arduino_collect_source_files(_library_sources ${_library_directories}) # <--------- find the library's sources - add_custom_command( - OUTPUT "${_library_binary_dir}/CMakeCache.txt" - DEPENDS "${_library_template}" "${CMAKE_CURRENT_LIST_FILE}" - COMMENT "Configuring ${_target} library" - WORKING_DIRECTORY "${_library_binary_dir}" + list(LENGTH _library_sources _source_file_count) + message(STATUS " ${_source_file_count} source files found for ${_target}") + + list(JOIN _library_sources "\"\n \"" _quoted_library_sources) # <----- prepare CMake to build out of tree + list(JOIN _library_directories "\"\n \"" _quoted_library_directories) + + set(_library_template "${ARDUINO_TOOLCHAIN_DIR}/Templates/ArduinoLibraryCMakeLists.txt.in") + configure_file("${_library_template}" "${_library_source_dir}/CMakeLists.txt") + + add_custom_command( + OUTPUT "${_library_binary_dir}/CMakeCache.txt" + DEPENDS "${_library_template}" "${CMAKE_CURRENT_LIST_FILE}" + COMMENT "Configuring ${_target} library" + WORKING_DIRECTORY "${_library_binary_dir}" - COMMAND "${CMAKE_COMMAND}" + COMMAND "${CMAKE_COMMAND}" --toolchain "${CMAKE_CURRENT_FUNCTION_LIST_FILE}" -G "${CMAKE_GENERATOR}" -S "${_library_source_dir}" + -D "__ARDUINO_IMPORTED_TARGET_CACHE=${__ARDUINO_IMPORTED_TARGET_CACHE}" -D "ARDUINO_BOARD:STRING=${ARDUINO_BOARD}") - add_custom_command( - OUTPUT "${_library_filepath}" - DEPENDS ${_library_sources} "${_library_binary_dir}/CMakeCache.txt" - COMMENT "Building ${_target} library" - WORKING_DIRECTORY "${_library_binary_dir}" + add_custom_command( + OUTPUT "${_library_filepath}" + DEPENDS ${_library_sources} "${_library_binary_dir}/CMakeCache.txt" + COMMENT "Building ${_target} library" + WORKING_DIRECTORY "${_library_binary_dir}" + + COMMAND "${CMAKE_COMMAND}" --build "${_library_binary_dir}") - COMMAND "${CMAKE_COMMAND}" --build "${_library_binary_dir}") + add_custom_target("${_libname}_compile" DEPENDS "${_library_filepath}") - add_custom_target("${_libname}_compile" DEPENDS "${_library_filepath}") + set(${_prefix}_BINARY_DIR "${_library_binary_dir}" PARENT_SCOPE) # <------------------- set cache variables + set(${_prefix}_SOURCE_DIR "${_library_source_dir}" PARENT_SCOPE) + set(${_prefix}_FILEPATH "${_library_filepath}" PARENT_SCOPE) + set(${_prefix}_INCLUDE_DIRS "${_library_directories}" PARENT_SCOPE) + + file( + APPEND "${__ARDUINO_IMPORTED_TARGET_CACHE}" + "set(${_prefix}_BINARY_DIR \"${_library_binary_dir}\")\n" + "set(${_prefix}_SOURCE_DIR \"${_library_source_dir}\")\n" + "set(${_prefix}_FILEPATH \"${_library_filepath}\")\n" + "set(${_prefix}_INCLUDE_DIRS \"${_library_directories}\")\n") + endif() add_library("${_target}" STATIC IMPORTED) # <-------------------- define import library for the built static library - add_dependencies("${_target}" "${_libname}_compile") + + if (TARGET "${_libname}_compile") + add_dependencies("${_target}" "${_libname}_compile") + endif() if (NOT NAME STREQUAL "Core") target_link_libraries("${_target}" INTERFACE Arduino::Core) @@ -759,11 +789,22 @@ endfunction() # Creates an import library for Arduino's core library. # ---------------------------------------------------------------------------------------------------------------------- function(__arduino_add_arduino_core_library) - set(_library_directories - "${ARDUINO_PROPERTIES_EXPANDED_BUILD_CORE_PATH}" - "${ARDUINO_PROPERTIES_EXPANDED_BUILD_VARIANT_PATH}") + cmake_path( + CONVERT "${ARDUINO_PROPERTIES_EXPANDED_BUILD_CORE_PATH}" + TO_CMAKE_PATH_LIST _core_dirpath + NORMALIZE) + + cmake_path( + CONVERT "${ARDUINO_PROPERTIES_EXPANDED_BUILD_VARIANT_PATH}" + TO_CMAKE_PATH_LIST _variant_dirpath + NORMALIZE) + set(_library_directories "${_core_dirpath}" "${_variant_dirpath}") __arduino_add_import_library(Core ${_library_directories}) + + foreach(_suffix IN ITEMS BINARY_DIR SOURCE_DIR FILEPATH) + set("ARDUINO_CORE_${_suffix}" "${ARDUINO_CORE_${_suffix}}" PARENT_SCOPE) + endforeach() endfunction() # ---------------------------------------------------------------------------------------------------------------------- @@ -1036,7 +1077,8 @@ list( # <----------------------------------------------------------------------- ARDUINO_BOARD # make it just work __ARDUINO_PROPERTIES_EXPANDED_CACHE # make it MUCH faster __ARDUINO_PROPERTIES_UNEXPANDED_CACHE - __ARDUINO_INSTALLED_LIBRARIES_CACHE) + __ARDUINO_INSTALLED_LIBRARIES_CACHE + __ARDUINO_IMPORTED_TARGET_CACHE) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # try_compile() doesn't provide setup() and loop() @@ -1044,6 +1086,14 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE # <------------------ align object and librar "${ARDUINO_TOOLCHAIN_DIR}/Arduino/RulesOverride.cmake") if (CMAKE_PARENT_LIST_FILE MATCHES "CMakeSystem\\.cmake$") # <----------------- define additonal API, additional targets + if (__ARDUINO_IMPORTED_TARGET_CACHE) + message(STATUS "Using library cache from ${__ARDUINO_IMPORTED_TARGET_CACHE}") + include("${__ARDUINO_IMPORTED_TARGET_CACHE}") + else() + set(__ARDUINO_IMPORTED_TARGET_CACHE "${CMAKE_BINARY_DIR}/ArduinoFiles/ArduinoLibraries.cmake") + file(WRITE "${__ARDUINO_IMPORTED_TARGET_CACHE}" "# Generated from toolchain\n") + endif() + if (NOT CMAKE_PROJECT_NAME STREQUAL ArduinoCore) # FIXME Rather check for __ARDUINO_CORE_FILEPATH __arduino_add_arduino_core_library() endif() From 012c99873261c96c047c504ea3d3206017a115d7 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Fri, 23 Aug 2024 16:42:04 +0200 Subject: [PATCH 5/7] Rename find_board_details() to find_properties() --- toolchain/arduino-cli-toolchain.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/toolchain/arduino-cli-toolchain.cmake b/toolchain/arduino-cli-toolchain.cmake index a90adaf..4f1d238 100644 --- a/toolchain/arduino-cli-toolchain.cmake +++ b/toolchain/arduino-cli-toolchain.cmake @@ -202,7 +202,7 @@ function(__arduino_property_to_variable PROPERTY_NAME OUTPUT_VARIABLE) set(_host_variable "${_name}_${_host_suffix}") # Must check for empty _host_suffix because it will be empty initially - # while filling the alias variables in __arduino_find_board_details(). + # while filling the alias variables in __arduino_find_properties(). if (_host_suffix AND DEFINED "${_host_variable}") set("${OUTPUT_VARIABLE}" "${_host_variable}" PARENT_SCOPE) else() @@ -499,7 +499,7 @@ endfunction() # # See `arduino_get_property()` and `__arduino_property_to_variable()`. # ---------------------------------------------------------------------------------------------------------------------- -function(__arduino_find_board_details MODE) +function(__arduino_find_properties MODE) if (MODE STREQUAL UNEXPANDED) # <---------------------------------------------------------- parse function arguments set(_property_mode UNEXPANDED) elseif (MODE STREQUAL EXPANDED) @@ -1015,8 +1015,8 @@ find_program( # <--------------------------------------------------------------- [HKLM/SOFTWARE/Arduino CLI;InstallDir] "$ENV{PROGRAMFILES}/Arduino CLI") -__arduino_find_board_details(EXPANDED) # <----------------------------------- collect properties and installed libraries -__arduino_find_board_details(UNEXPANDED) +__arduino_find_properties(EXPANDED) # <-------------------------------------- collect properties and installed libraries +__arduino_find_properties(UNEXPANDED) __arduino_find_libraries() find_program( # <----------------------------------------------------------------------- find ctags from Arduino runtime From 06731cc329f5ae07562311c27e0229bc7e247029 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Fri, 23 Aug 2024 22:25:20 +0200 Subject: [PATCH 6/7] Clean up ArduinoLibraryCMakeLists.txt.in - align required CMake version with main project - do not set a project version - generate a log message --- toolchain/Templates/ArduinoLibraryCMakeLists.txt.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/toolchain/Templates/ArduinoLibraryCMakeLists.txt.in b/toolchain/Templates/ArduinoLibraryCMakeLists.txt.in index 2f10376..ba634f0 100644 --- a/toolchain/Templates/ArduinoLibraryCMakeLists.txt.in +++ b/toolchain/Templates/ArduinoLibraryCMakeLists.txt.in @@ -1,5 +1,7 @@ -cmake_minimum_required(VERSION ${CMAKE_VERSION}) -project(${_libname} VERSION 0.1 LANGUAGES ASM C CXX) +cmake_minimum_required(VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION}) +project(${_libname} LANGUAGES ASM C CXX) + +message(STATUS "Configuring ${_libname} for ${ARDUINO_BOARD}") add_library( ${_libname} STATIC From 6928f7fb733fb8821dbc738eef7b20df3800b4e7 Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Fri, 23 Aug 2024 22:24:23 +0200 Subject: [PATCH 7/7] Add comments to __arduino_add_import_library() Also report where libraries that need to be build are built. --- toolchain/arduino-cli-toolchain.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/toolchain/arduino-cli-toolchain.cmake b/toolchain/arduino-cli-toolchain.cmake index 4f1d238..5904bd0 100644 --- a/toolchain/arduino-cli-toolchain.cmake +++ b/toolchain/arduino-cli-toolchain.cmake @@ -701,20 +701,20 @@ function(__arduino_add_import_library NAME SOURCE_DIR) # [SOURCE_DIR...] set(_libname "Arduino${NAME}") set(_target "Arduino::${NAME}") - if (${_prefix}_FILEPATH) + if (${_prefix}_FILEPATH) # <--------------------------------- check if there already is a version that can be reused message(STATUS "Using ${_target} from ${${_prefix}_FILEPATH}") set(_library_binary_dir "${${_prefix}_BINARY_DIR}") set(_library_source_dir "${${_prefix}_BINARY_DIR}") set(_library_directories "${${_prefix}_INCLUDE_DIRS}") set(_library_filepath "${${_prefix}_FILEPATH}") - else() - message(STATUS "Building ${_target} from scratch") - + else() # <--------------------------------------------------------------------------------------- build from scratch set(_library_binary_dir "${CMAKE_BINARY_DIR}/Arduino/${NAME}") set(_library_source_dir "${CMAKE_BINARY_DIR}/ArduinoFiles/${NAME}") set(_library_filepath "${_library_binary_dir}/lib${_libname}.a") + message(STATUS "Building ${_target} at ${_library_binary_dir}") + set(_library_directories "${SOURCE_DIR}" ${ARGN}) # <---------------- normalize the library's source directories list(FILTER _library_directories EXCLUDE REGEX "^ *\$") list(REMOVE_DUPLICATES _library_directories)