From 3054e7902627fcb4099ad3a12defca17d9c57669 Mon Sep 17 00:00:00 2001 From: Denis Dowling Date: Wed, 21 Feb 2024 21:35:17 +1100 Subject: [PATCH 1/3] * Support calling build_sketch() multiple times in the CMakeList.txt file build multiple targets. * Add an include_guard() on build_sketch.cmake to prevent errors if this file is included multiple time. --- cmake/build_sketch.cmake | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/build_sketch.cmake b/cmake/build_sketch.cmake index 28a048621d..14037fa387 100644 --- a/cmake/build_sketch.cmake +++ b/cmake/build_sketch.cmake @@ -1,14 +1,18 @@ cmake_minimum_required(VERSION 3.21) +# Only want the variant and library targets to be defined once +include_guard(GLOBAL) + include(sketch_preprocess_sources) include(convert_file) include(set_base_arduino_config) +add_subdirectory(${BUILD_VARIANT_PATH} ./variant) +add_subdirectory(${BUILD_CORE_PATH} ./cores/arduino) +add_subdirectory(${BUILD_LIB_PATH} ./libraries) + function(build_sketch) - add_subdirectory(${BUILD_VARIANT_PATH} ./variant) - add_subdirectory(${BUILD_CORE_PATH} ./cores/arduino) - add_subdirectory(${BUILD_LIB_PATH} ./libraries) cmake_parse_arguments(PARSE_ARGV 0 SKBD "" "TARGET" "SOURCES;DEPENDS") From e9aedff68bd03950740e4ea058db9be5ccfb5ae1 Mon Sep 17 00:00:00 2001 From: Denis Dowling Date: Wed, 21 Feb 2024 21:37:10 +1100 Subject: [PATCH 2/3] * Fix dependency generation error when the sketch ino file is not in the project base directory. --- cmake/sketch_preprocess_sources.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/sketch_preprocess_sources.cmake b/cmake/sketch_preprocess_sources.cmake index 185aaf69e2..83caa819c7 100644 --- a/cmake/sketch_preprocess_sources.cmake +++ b/cmake/sketch_preprocess_sources.cmake @@ -27,7 +27,7 @@ function(sketch_preprocess_sources) COMPILE_OPTIONS "-include;Arduino.h;-include;${SRCFILE}.h" OBJECT_DEPENDS "${SRCFILE}.h" ) - list(APPEND SRCLIST ${SRCFILE}.cpp) + list(APPEND SRCLIST ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.cpp) else() list(APPEND SRCLIST ${SRCFILE}) endif() From 076681a588282551b9984f4248a04041fa63429a Mon Sep 17 00:00:00 2001 From: Denis Dowling Date: Thu, 22 Feb 2024 09:43:29 +1100 Subject: [PATCH 3/3] Fix sketch_preprocess_sources to make consistent use of the ${CMAKE_CURRENT_BINARY_DIR} on all generated files. --- cmake/sketch_preprocess_sources.cmake | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cmake/sketch_preprocess_sources.cmake b/cmake/sketch_preprocess_sources.cmake index 83caa819c7..aa681a3bae 100644 --- a/cmake/sketch_preprocess_sources.cmake +++ b/cmake/sketch_preprocess_sources.cmake @@ -5,29 +5,31 @@ function(sketch_preprocess_sources) set(SRCLIST "") foreach(SRCFILE IN LISTS SPC_SOURCES) if (${SRCFILE} MATCHES "\.ino$") + # Convert .ino to ${CMAKE_CURRENT_BINARY_DIR}/.ino.{cpp,h} cmake_path(GET SRCFILE FILENAME SRC_BASE_NAME) + set(SRC_BINARY_BASE_NAME ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}) configure_file( ${SRCFILE} - ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.cpp + ${SRC_BINARY_BASE_NAME}.cpp COPYONLY ) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.h - COMMAND ${ARDUINOCTAGS_EXECUTABLE} -u --language-force=c++ -f ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.ctags --c++-kinds=svpf --fields=KSTtzns --line-directives ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.cpp - COMMAND ${Python3_EXECUTABLE} ${SCRIPTS_FOLDER}/generate_header.py -i ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.ctags -o ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.h + add_custom_command(OUTPUT ${SRC_BINARY_BASE_NAME}.h + COMMAND ${ARDUINOCTAGS_EXECUTABLE} -u --language-force=c++ -f ${SRC_BINARY_BASE_NAME}.ctags --c++-kinds=svpf --fields=KSTtzns --line-directives ${SRC_BINARY_BASE_NAME}.cpp + COMMAND ${Python3_EXECUTABLE} ${SCRIPTS_FOLDER}/generate_header.py -i ${SRC_BINARY_BASE_NAME}.ctags -o ${SRC_BINARY_BASE_NAME}.h - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.cpp - BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.ctags + DEPENDS ${SRC_BINARY_BASE_NAME}.cpp + BYPRODUCTS ${SRC_BINARY_BASE_NAME}.ctags VERBATIM ) - set_source_files_properties(${SRCFILE}.cpp + set_source_files_properties(${SRC_BINARY_BASE_NAME}.cpp PROPERTIES - COMPILE_OPTIONS "-include;Arduino.h;-include;${SRCFILE}.h" - OBJECT_DEPENDS "${SRCFILE}.h" + COMPILE_OPTIONS "-include;Arduino.h;-include;${SRC_BINARY_BASE_NAME}.h" + OBJECT_DEPENDS ${SRC_BINARY_BASE_NAME}.h ) - list(APPEND SRCLIST ${CMAKE_CURRENT_BINARY_DIR}/${SRC_BASE_NAME}.cpp) + list(APPEND SRCLIST ${SRC_BINARY_BASE_NAME}.cpp) else() list(APPEND SRCLIST ${SRCFILE}) endif()