From 66af738c11487d194dbb39226755a147123cee17 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Mon, 8 Oct 2018 07:47:56 +0300 Subject: [PATCH 01/12] Added function/module to define custom cmake properties. Defined the 'board_id' property, associated with targets. --- cmake/Platform/Arduino.cmake | 1 + cmake/Platform/Properties/CMakeProperties.cmake | 11 +++++++++++ cmake/Platform/System/BuildSystemInitializer.cmake | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 cmake/Platform/Properties/CMakeProperties.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index abe748b..3040c01 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -18,6 +18,7 @@ include(SourcesManager) include(SketchManager) include(DefaultsManager) include(ArchitectureSupportQuery) +include(CMakeProperties) include(Libraries) diff --git a/cmake/Platform/Properties/CMakeProperties.cmake b/cmake/Platform/Properties/CMakeProperties.cmake new file mode 100644 index 0000000..9f0e563 --- /dev/null +++ b/cmake/Platform/Properties/CMakeProperties.cmake @@ -0,0 +1,11 @@ +#=============================================================================# +# Defines custom properties used internally by the framework. +#=============================================================================# +function(define_custom_properties) + + define_property(TARGET PROPERTY board_id + BRIEF_DOCS "ID of the associated hardware board" + FULL_DOCS + "Framework-Internal ID of the hardware Arduino board associated with the target") + +endfunction() diff --git a/cmake/Platform/System/BuildSystemInitializer.cmake b/cmake/Platform/System/BuildSystemInitializer.cmake index c7fb507..9dce221 100644 --- a/cmake/Platform/System/BuildSystemInitializer.cmake +++ b/cmake/Platform/System/BuildSystemInitializer.cmake @@ -18,12 +18,18 @@ endfunction() #=============================================================================# function(initialize_build_system) + define_custom_properties() + set_arduino_cmake_defaults() + find_required_platform_tools() + detect_sdk_version() + if (CMAKE_HOST_UNIX AND NOT CMAKE_HOST_APPLE) # Detect host's Linux distribution detect_host_linux_distribution() endif () + if (AUTO_SET_SKETCHBOOK_PATH) find_sketchbook_path() endif () From a94608944a9f267274d86571ff131e6f8670541d Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Mon, 8 Oct 2018 08:00:53 +0300 Subject: [PATCH 02/12] Set 'BOARD_ID' property on executable target, retrieved in `add_core_lib` function. --- cmake/Platform/Properties/CMakeProperties.cmake | 2 +- cmake/Platform/Targets/CoreLibTarget.cmake | 13 ++++++++----- cmake/Platform/Targets/ExecutableTarget.cmake | 8 +++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/cmake/Platform/Properties/CMakeProperties.cmake b/cmake/Platform/Properties/CMakeProperties.cmake index 9f0e563..9da2372 100644 --- a/cmake/Platform/Properties/CMakeProperties.cmake +++ b/cmake/Platform/Properties/CMakeProperties.cmake @@ -3,7 +3,7 @@ #=============================================================================# function(define_custom_properties) - define_property(TARGET PROPERTY board_id + define_property(TARGET PROPERTY BOARD_ID BRIEF_DOCS "ID of the associated hardware board" FULL_DOCS "Framework-Internal ID of the hardware Arduino board associated with the target") diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index 83f6e9d..40e0bcc 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -80,17 +80,20 @@ endfunction() # _board_id - Board to create the core library for. # Note that each board has a unique version of the library. #=============================================================================# -function(add_arduino_core_lib _target_name _board_id) +function(add_arduino_core_lib _target_name) - get_core_lib_target_name(${_board_id} core_lib_target) + # First, retrieve the board_id associated with the target from the matching property + get_target_property(board_id ${_target_name} BOARD_ID) + + get_core_lib_target_name(${board_id} core_lib_target) if (TARGET ${core_lib_target}) # Core-lib target already created for the given board if (TARGET ${_target_name}) # Executable/Firmware target also exists target_link_libraries(${_target_name} PUBLIC ${core_lib_target}) endif () else () # Core-Lib target needs to be created - _get_board_core(${_board_id} board_core) # Get board's core - _get_board_variant(${_board_id} board_variant) # Get board's variant + _get_board_core(${board_id} board_core) # Get board's core + _get_board_variant(${board_id} board_variant) # Get board's variant # Find sources in core directory and add the library target find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) @@ -113,7 +116,7 @@ function(add_arduino_core_lib _target_name _board_id) target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") - _set_core_lib_flags(${core_lib_target} ${_board_id}) + _set_core_lib_flags(${core_lib_target} ${board_id}) # Link Core-Lib to executable target if (TARGET ${_target_name}) diff --git a/cmake/Platform/Targets/ExecutableTarget.cmake b/cmake/Platform/Targets/ExecutableTarget.cmake index 12542f2..1bd03dd 100644 --- a/cmake/Platform/Targets/ExecutableTarget.cmake +++ b/cmake/Platform/Targets/ExecutableTarget.cmake @@ -11,8 +11,13 @@ function(add_arduino_executable _target_name _board_id) list(APPEND sources "${ARGN}") # Treat all remaining arguments as sources add_executable(${_target_name} "${sources}") + + # Set the 'board_id' property on the target + set_property(TARGET ${_target_name} PROPERTY BOARD_ID ${_board_id}) + # Always add board's core lib - add_arduino_core_lib(${_target_name} "${_board_id}") + add_arduino_core_lib(${_target_name}) + # Add compiler and linker flags set_executable_target_flags(${_target_name} "${_board_id}") @@ -38,6 +43,7 @@ function(add_arduino_executable _target_name _board_id) # Required for avr-size get_board_property("${_board_id}" build.mcu board_mcu) + set(avr_size_script "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake") From 76b3a84ff3a3c05c0e45a5fceb957f408cea2749 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Wed, 10 Oct 2018 07:57:36 +0300 Subject: [PATCH 03/12] Refactored modules to use new 'BOARD_ID' target property. Added check for target's type where interface libraries can be used to use the 'INTERFACE' prefix for the 'BOARD_ID' property in case the target is indeed an interface library. --- .../Libraries/LibraryFlagsManager.cmake | 16 ++++-- cmake/Platform/Other/TargetFlagsManager.cmake | 53 ++++++++++++------- .../Sketches/SketchHeadersManager.cmake | 11 ++-- cmake/Platform/Sketches/SketchManager.cmake | 10 ++-- .../Targets/ArduinoCMakeLibraryTarget.cmake | 18 ++++--- .../Targets/ArduinoExampleTarget.cmake | 20 ++++--- .../Targets/ArduinoLibraryTarget.cmake | 21 +++++--- cmake/Platform/Targets/CoreLibTarget.cmake | 26 ++++----- cmake/Platform/Targets/ExecutableTarget.cmake | 4 +- .../Targets/PlatformLibraryTarget.cmake | 17 +++--- cmake/Platform/Targets/UploadTarget.cmake | 9 ++-- .../Utilities/CMakeArgumentsUtils.cmake | 2 + examples/3rd-party-library/CMakeLists.txt | 8 +-- examples/arduino-library/CMakeLists.txt | 6 +-- examples/header-only-library/CMakeLists.txt | 2 +- examples/servo-knob-example/CMakeLists.txt | 3 +- examples/sketch/CMakeLists.txt | 2 +- 17 files changed, 135 insertions(+), 93 deletions(-) diff --git a/cmake/Platform/Libraries/LibraryFlagsManager.cmake b/cmake/Platform/Libraries/LibraryFlagsManager.cmake index 13a8c2a..0ed459a 100644 --- a/cmake/Platform/Libraries/LibraryFlagsManager.cmake +++ b/cmake/Platform/Libraries/LibraryFlagsManager.cmake @@ -2,16 +2,24 @@ # Sets compiler and linker flags on the given library target. # Changes are kept even outside the scope of the function since they apply on a target. # _library_target - Name of the library target. -# _board_id - Board ID associated with the library. Some flags require it. #=============================================================================# -function(set_library_flags _library_target _board_id) +function(set_library_flags _library_target) parse_scope_argument(scope "${ARGN}" DEFAULT_SCOPE PUBLIC) - set_compiler_target_flags(${_library_target} ${_board_id} ${scope}) + # Infer target's type and act differently if it's an interface-library + get_target_property(target_type ${_library_target} TYPE) + + if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") + get_target_property(board_id ${_library_target} INTERFACE_BOARD_ID) + else () + get_target_property(board_id ${_library_target} BOARD_ID) + endif () + + set_target_compile_flags(${_library_target} ${scope}) # Set linker flags - set_linker_flags(${_library_target} ${_board_id}) + set_linker_flags(${_library_target}) endfunction() diff --git a/cmake/Platform/Other/TargetFlagsManager.cmake b/cmake/Platform/Other/TargetFlagsManager.cmake index 0941bee..0f2b2e8 100644 --- a/cmake/Platform/Other/TargetFlagsManager.cmake +++ b/cmake/Platform/Other/TargetFlagsManager.cmake @@ -1,13 +1,21 @@ #=============================================================================# # Sets compiler flags on the given target using the given board ID, compiler language and scope. # _target_name - Name of the target (Executable or Library) to set flags on. -# _board_id - Target's bounded board ID. # _language - Language for which flags are set (such as C/C++). # _scope - Flags' scope relative to outer targets (targets using the given target). #=============================================================================# -function(_set_target_language_flags _target_name _board_id _language _scope) +function(_set_target_language_flags _target_name _language _scope) - parse_compiler_recipe_flags(${_board_id} compiler_recipe_flags + # Infer target's type and act differently if it's an interface-library + get_target_property(target_type ${_target_name} TYPE) + + if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") + get_target_property(board_id ${_target_name} INTERFACE_BOARD_ID) + else () + get_target_property(board_id ${_target_name} BOARD_ID) + endif () + + parse_compiler_recipe_flags(${board_id} compiler_recipe_flags LANGUAGE "${_language}") target_compile_options(${_target_name} ${_scope} @@ -18,27 +26,26 @@ endfunction() #=============================================================================# # Sets compiler flags on the given target, according also to the given board ID. # _target_name - Name of the target (Executable or Library) to set flags on. -# _board_id - Target's bounded board ID. #=============================================================================# -function(set_compiler_target_flags _target_name _board_id) +function(set_target_compile_flags _target_name) cmake_parse_arguments(parsed_args "" "LANGUAGE" "" ${ARGN}) parse_scope_argument(scope "${ARGN}" DEFAULT_SCOPE PUBLIC) if (parsed_args_LANGUAGE) - _set_target_language_flags(${_target_name} ${_board_id} ${parsed_args_LANGUAGE} ${scope}) + _set_target_language_flags(${_target_name} ${parsed_args_LANGUAGE} ${scope}) else () # No specific language requested - Use all get_cmake_compliant_language_name(asm lang) - _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${lang} ${scope}) get_cmake_compliant_language_name(c lang) - _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${lang} ${scope}) get_cmake_compliant_language_name(cpp lang) - _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${lang} ${scope}) endif () @@ -47,11 +54,19 @@ endfunction() #=============================================================================# # Sets linker flags on the given target, according also to the given board ID. # _target_name - Name of the target (Executable or Library) to set flags on. -# _board_id - Target's bounded board ID. #=============================================================================# -function(set_linker_flags _target_name _board_id) +function(set_linker_flags _target_name) + + # Infer target's type and act differently if it's an interface-library + get_target_property(target_type ${_target_name} TYPE) + + if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") + get_target_property(board_id ${_target_name} INTERFACE_BOARD_ID) + else () + get_target_property(board_id ${_target_name} BOARD_ID) + endif () - parse_linker_recpie_pattern("${_board_id}" linker_recipe_flags) + parse_linker_recpie_pattern(${board_id} linker_recipe_flags) string(REPLACE ";" " " cmake_compliant_linker_flags "${linker_recipe_flags}") @@ -63,12 +78,11 @@ endfunction() # Sets compiler and linker flags on the given Executable target, # according also to the given board ID. # _target_name - Name of the target (Executable) to set flags on. -# _board_id - Target's bounded board ID. #=============================================================================# -function(set_executable_target_flags _target_name _board_id) +function(set_executable_target_flags _target_name) - set_compiler_target_flags(${_target_name} "${_board_id}") - set_linker_flags(${_target_name} "${_board_id}") + set_target_compile_flags(${_target_name}) + set_linker_flags(${_target_name}) target_link_libraries(${_target_name} PUBLIC m) # Add math library @@ -80,14 +94,13 @@ endfunction() #=============================================================================# # Sets upload/flash flags on the given target, according also to the given board ID. # _target_name - Name of the target (Executable) to set flags on. -# _board_id - Target's bounded board ID. #=============================================================================# -function(set_upload_target_flags _target_name _board_id _upload_port _return_var) +function(set_upload_target_flags _target_name _upload_port _return_var) - set(upload_flags "") + get_target_property(board_id ${_target_name} BOARD_ID) # Parse and append recipe flags - parse_upload_recipe_pattern("${_board_id}" "${_upload_port}" upload_recipe_flags) + parse_upload_recipe_pattern(${board_id} "${_upload_port}" upload_recipe_flags) list(APPEND upload_flags "${upload_recipe_flags}") set(target_binary_base_path "${CMAKE_CURRENT_BINARY_DIR}/${_target_name}") diff --git a/cmake/Platform/Sketches/SketchHeadersManager.cmake b/cmake/Platform/Sketches/SketchHeadersManager.cmake index 3fc4303..7938d75 100644 --- a/cmake/Platform/Sketches/SketchHeadersManager.cmake +++ b/cmake/Platform/Sketches/SketchHeadersManager.cmake @@ -2,13 +2,14 @@ # Resolves the header files included in a sketch by linking their appropriate library if necessary # or by validating they're included by the sketch target. # _target_name - Name of the target to add the sketch file to. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # _sketch_file - Path to a sketch file to add to the target. #=============================================================================# -function(resolve_sketch_headers _target_name _board_id _sketch_file) +function(resolve_sketch_headers _target_name _sketch_file) get_source_file_included_headers("${_sketch_file}" sketch_headers) + get_target_property(board_id ${_target_name} BOARD_ID) + foreach (header ${sketch_headers}) # Header name without extension (such as '.h') can represent an Arduino/Platform library @@ -21,12 +22,12 @@ function(resolve_sketch_headers _target_name _board_id _sketch_file) string(TOLOWER ${header_we} header_we_lower) - link_platform_library(${_target_name} ${header_we_lower} ${_board_id}) + link_platform_library(${_target_name} ${header_we_lower}) else () # Pass the '3RD_PARTY' option to avoid name-conversion - find_arduino_library(${header_we}_sketch_lib ${header_we} ${_board_id} 3RD_PARTY QUIET) + find_arduino_library(${header_we}_sketch_lib ${header_we} ${board_id} 3RD_PARTY QUIET) # If library isn't found, display a status since it might be a user library if (NOT TARGET ${header_we}_sketch_lib OR @@ -38,7 +39,7 @@ function(resolve_sketch_headers _target_name _board_id _sketch_file) "you'd have to check this manually!") else () - link_arduino_library(${_target_name} ${header_we}_sketch_lib ${_board_id}) + link_arduino_library(${_target_name} ${header_we}_sketch_lib) endif () endif () diff --git a/cmake/Platform/Sketches/SketchManager.cmake b/cmake/Platform/Sketches/SketchManager.cmake index 4673821..c92e7bf 100644 --- a/cmake/Platform/Sketches/SketchManager.cmake +++ b/cmake/Platform/Sketches/SketchManager.cmake @@ -24,10 +24,9 @@ endfunction() # Each sketch is converted to a valid '.cpp' source file under the project's source directory. # The function also finds and links any libraries the sketch uses to the target. # _target_name - Name of the target to add the sketch file to. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # _sketch_file - Path to a sketch file to add to the target. #=============================================================================# -function(add_sketch_to_target _target_name _board_id _sketch_file) +function(add_sketch_to_target _target_name _sketch_file) _get_converted_source_desired_path(${_sketch_file} sketch_converted_source_path) @@ -35,7 +34,7 @@ function(add_sketch_to_target _target_name _board_id _sketch_file) if (CONVERT_SKETCHES_IF_CONVERTED_SOURCES_EXISTS OR NOT EXISTS ${sketch_converted_source_path}) - resolve_sketch_headers(${_target_name} ${_board_id} ${_sketch_file}) + resolve_sketch_headers(${_target_name} ${_sketch_file}) convert_sketch_to_source(${_sketch_file} ${sketch_converted_source_path}) @@ -48,15 +47,14 @@ endfunction() #=============================================================================# # Adds a list of sketch files as converted sources to the given target. # _target_name - Name of the target to add the sketch file to. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # [Sketches] - List of paths to sketch files to add to the target. #=============================================================================# -function(target_sketches _target_name _board_id) +function(target_sketches _target_name) parse_sources_arguments(parsed_sketches "" "" "" "${ARGN}") foreach (sketch_file ${parsed_sketches}) - add_sketch_to_target(${_target_name} ${_board_id} ${sketch_file}) + add_sketch_to_target(${_target_name} ${sketch_file}) endforeach () endfunction() diff --git a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake index 129eece..45c1193 100644 --- a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake @@ -16,21 +16,27 @@ function(_add_arduino_cmake_library _target_name _board_id _sources) add_library(${_target_name} INTERFACE) set(scope INTERFACE) - + + set_property(TARGET ${_target_name} PROPERTY INTERFACE_BOARD_ID ${_board_id}) + else () - - add_library(${_target_name} STATIC "${_sources}") + + add_library(${_target_name} STATIC "${_sources}") set(scope PUBLIC) - + + set_property(TARGET ${_target_name} PROPERTY BOARD_ID ${_board_id}) + endif () + # Treat headers' parent directories as include directories of the target get_headers_parent_directories("${_sources}" include_dirs) target_include_directories(${_target_name} ${scope} ${include_dirs}) - set_library_flags(${_target_name} ${_board_id} ${scope}) + set_library_flags(${_target_name} ${scope}) - set_target_architecture_definition(${_target_name} ${scope} ${ARDUINO_CMAKE_PLATFORM_ARCHITECTURE}) + set_target_architecture_definition(${_target_name} ${scope} + ${ARDUINO_CMAKE_PLATFORM_ARCHITECTURE}) endfunction() diff --git a/cmake/Platform/Targets/ArduinoExampleTarget.cmake b/cmake/Platform/Targets/ArduinoExampleTarget.cmake index a9805f8..e4dce22 100644 --- a/cmake/Platform/Targets/ArduinoExampleTarget.cmake +++ b/cmake/Platform/Targets/ArduinoExampleTarget.cmake @@ -11,11 +11,14 @@ function(add_arduino_example _target_name _board_id _example_name) convert_string_to_pascal_case(${_example_name} arduino_compliant_example_name) + find_arduino_example_sources("${ARDUINO_SDK_EXAMPLES_PATH}" ${arduino_compliant_example_name} example_sketches ${ARGN}) + # First create the target (Without sources), then add sketches as converted sources add_arduino_executable(${_target_name} ${_board_id}) - target_sketches(${_target_name} ${_board_id} "${example_sketches}") + + target_sketches(${_target_name} "${example_sketches}") endfunction() @@ -23,7 +26,6 @@ endfunction() # Adds/Creates an Arduino-Library-Example executable target with the given name, # using the given board ID and library example's sources. # _target_name - Name of the target (Executable) to create. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # _library_target_name - Name of an already-existing library target. # This means the library should first be found by the user. # _library_name - Name of the library the example belongs to, such as 'Servo'. @@ -32,8 +34,7 @@ endfunction() # e.g The 'Blink' example is under the '01.Basics' category. # Generally, all this does is improving search performance by narrowing. #=============================================================================# -function(add_arduino_library_example _target_name _board_id - _library_target_name _library_name _example_name) +function(add_arduino_library_example _target_name _library_target_name _library_name _example_name) convert_string_to_pascal_case(${_example_name} arduino_compliant_example_name) convert_string_to_pascal_case(${_library_name} arduino_compliant_library_name) @@ -42,10 +43,15 @@ function(add_arduino_library_example _target_name _board_id message(SEND_ERROR "Library target doesn't exist - It must be created first!") endif () + get_target_property(board_id ${_library_target_name} BOARD_ID) + find_arduino_library_example_sources("${ARDUINO_SDK_LIBRARIES_PATH}/${arduino_compliant_library_name}" ${arduino_compliant_example_name} example_sketches ${ARGN}) - add_arduino_executable(${_target_name} ${_board_id}) - target_sketches(${_target_name} ${_board_id} "${example_sketches}") - link_arduino_library(${_target_name} ${_library_target_name} ${_board_id}) + + add_arduino_executable(${_target_name} ${board_id}) + + target_sketches(${_target_name} "${example_sketches}") + + link_arduino_library(${_target_name} ${_library_target_name}) endfunction() \ No newline at end of file diff --git a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake index 084ed75..75d2ee4 100644 --- a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake @@ -34,7 +34,7 @@ function(add_arduino_library _target_name _board_id) find_dependent_platform_libraries("${arch_resolved_sources}" lib_platform_libs) foreach (platform_lib ${lib_platform_libs}) - link_platform_library(${_target_name} ${platform_lib} ${_board_id}) + link_platform_library(${_target_name} ${platform_lib}) endforeach () endfunction() @@ -57,23 +57,30 @@ endfunction() # it adds core lib's include directories to the libraries include directories. # _target_name - Name of the "executable" target. # _library_target_name - Name of the library target. -# _board_id - Board ID associated with the linked Core Lib. # [HEADER_ONLY] - Whether library is a header-only library, i.e has no source files #=============================================================================# -function(link_arduino_library _target_name _library_target_name _board_id) +function(link_arduino_library _target_name _library_target_name) cmake_parse_arguments(parsed_args "HEADER_ONLY" "" "" ${ARGN}) - get_core_lib_target_name(${_board_id} core_lib_target) - if (NOT TARGET ${_target_name}) message(FATAL_ERROR "Target doesn't exist - It must be created first!") elseif (NOT TARGET ${_library_target_name}) message(FATAL_ERROR "Library target doesn't exist - It must be created first!") - elseif (NOT TARGET ${core_lib_target}) - message(FATAL_ERROR "Core Library target doesn't exist. This is bad and should be reported") endif () + # Retrieve 'board_id' property of targets + get_target_property(board_id ${_target_name} BOARD_ID) + + # Get the name of the Core-Lib target associated with the targets' 'board_id' + get_core_lib_target_name(${board_id} core_lib_target) + + if (NOT TARGET ${core_lib_target}) + message(FATAL_ERROR "Core Library target doesn't exist. " + "This is bad and should be reported") + endif () + + # Infer scope if (parsed_args_HEADER_ONLY) set(scope INTERFACE) else () diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index 40e0bcc..481d405 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -60,14 +60,12 @@ endfunction() # Sets compiler and linker flags on the given Core-Lib target. # Changes are kept even outside the scope of the function since they apply on a target. # _core_target_name - Name of the Core-Lib target. -# _board_id - Board ID associated with the library. Some flags require it. #=============================================================================# -function(_set_core_lib_flags _core_target_name _board_id) +function(_set_core_lib_flags _core_target_name) - set_compiler_target_flags(${_core_target_name} ${_board_id} PUBLIC) + set_target_compile_flags(${_core_target_name} PUBLIC) - # Set linker flags - set_linker_flags(${_core_target_name} ${_board_id}) + set_linker_flags(${_core_target_name}) endfunction() @@ -82,16 +80,18 @@ endfunction() #=============================================================================# function(add_arduino_core_lib _target_name) - # First, retrieve the board_id associated with the target from the matching property - get_target_property(board_id ${_target_name} BOARD_ID) - get_core_lib_target_name(${board_id} core_lib_target) if (TARGET ${core_lib_target}) # Core-lib target already created for the given board if (TARGET ${_target_name}) # Executable/Firmware target also exists target_link_libraries(${_target_name} PUBLIC ${core_lib_target}) endif () + else () # Core-Lib target needs to be created + + # First, retrieve the board_id associated with the target from the matching property + get_target_property(board_id ${_target_name} BOARD_ID) + _get_board_core(${board_id} board_core) # Get board's core _get_board_variant(${board_id} board_variant) # Get board's variant @@ -99,29 +99,29 @@ function(add_arduino_core_lib _target_name) find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) if (${CMAKE_HOST_UNIX}) - if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN) - list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*") - endif () - endif () add_library(${core_lib_target} STATIC "${core_sources}") + # Set the BOARD_ID property on the core-lib's target as well + set_property(TARGET ${core_lib_target} PROPERTY BOARD_ID ${board_id}) + # Include platform's core and variant directories target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") - _set_core_lib_flags(${core_lib_target} ${board_id}) + _set_core_lib_flags(${core_lib_target}) # Link Core-Lib to executable target if (TARGET ${_target_name}) target_link_libraries(${_target_name} PUBLIC "${core_lib_target}") endif () + endif () endfunction() diff --git a/cmake/Platform/Targets/ExecutableTarget.cmake b/cmake/Platform/Targets/ExecutableTarget.cmake index 1bd03dd..da37968 100644 --- a/cmake/Platform/Targets/ExecutableTarget.cmake +++ b/cmake/Platform/Targets/ExecutableTarget.cmake @@ -19,7 +19,7 @@ function(add_arduino_executable _target_name _board_id) add_arduino_core_lib(${_target_name}) # Add compiler and linker flags - set_executable_target_flags(${_target_name} "${_board_id}") + set_executable_target_flags(${_target_name}) set(target_path "${CMAKE_CURRENT_BINARY_DIR}/${_target_name}") @@ -42,7 +42,7 @@ function(add_arduino_executable _target_name _board_id) VERBATIM) # Required for avr-size - get_board_property("${_board_id}" build.mcu board_mcu) + get_board_property(${_board_id} build.mcu board_mcu) set(avr_size_script "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake") diff --git a/cmake/Platform/Targets/PlatformLibraryTarget.cmake b/cmake/Platform/Targets/PlatformLibraryTarget.cmake index e5a9fd4..752fb85 100644 --- a/cmake/Platform/Targets/PlatformLibraryTarget.cmake +++ b/cmake/Platform/Targets/PlatformLibraryTarget.cmake @@ -41,10 +41,9 @@ endfunction() #=============================================================================# # Links the given platform library target to the given target. # _target_name - Name of the target to link against. -# _library_name - Name of the library target to create, usually the platform library name. -# _board_id - Board ID associated with the linked Core Lib. +# _library_name - Platform library's name. #=============================================================================# -function(link_platform_library _target_name _library_name _board_id) +function(link_platform_library _target_name _platform_library_name) if (NOT TARGET ${_target_name}) message(FATAL_ERROR "Target ${_target_name} doesn't exist - It must be created first!") @@ -53,17 +52,19 @@ function(link_platform_library _target_name _library_name _board_id) parse_scope_argument(scope "${ARGN}" DEFAULT_SCOPE PUBLIC) - if (NOT TARGET ${_library_name}) + if (NOT TARGET ${_platform_library_name}) + + get_target_property(board_id ${_target_name} BOARD_ID) - _add_platform_library(${_library_name} ${_board_id}) + _add_platform_library(${_platform_library_name} ${board_id}) - get_core_lib_target_name(${_board_id} core_lib_target) - _link_arduino_cmake_library(${_target_name} ${_library_name} + get_core_lib_target_name(${board_id} core_lib_target) + _link_arduino_cmake_library(${_target_name} ${_platform_library_name} ${scope} BOARD_CORE_TARGET ${core_lib_target}) else () - target_link_libraries(${_target_name} ${scope} ${_library_name}) + target_link_libraries(${_target_name} ${scope} ${_platform_library_name}) endif () endfunction() diff --git a/cmake/Platform/Targets/UploadTarget.cmake b/cmake/Platform/Targets/UploadTarget.cmake index aeee595..5b8b006 100644 --- a/cmake/Platform/Targets/UploadTarget.cmake +++ b/cmake/Platform/Targets/UploadTarget.cmake @@ -1,16 +1,17 @@ #=============================================================================# # Uploads the given target to te connected Arduino board using the given board ID and port. # _target_name - Name of the target (Executable) to upload. -# _board_id - Target's bounded board ID. # _port - Serial port on the host system used to upload/flash the connected Arduino board. #=============================================================================# -function(upload_arduino_target _target_name _board_id _port) +function(upload_arduino_target _target_name _port) + + get_target_property(board_id ${_target_name} BOARD_ID) if ("${_target_name}" STREQUAL "") message(FATAL_ERROR "Can't create upload target for an invalid target ${_target_name}") endif () - set_upload_target_flags("${_target_name}" "${_board_id}" "${_port}" upload_args) + set_upload_target_flags(${_target_name} ${_port} upload_args) add_custom_command(TARGET ${_target_name} POST_BUILD COMMAND ${ARDUINO_CMAKE_AVRDUDE_PROGRAM} @@ -18,4 +19,4 @@ function(upload_arduino_target _target_name _board_id _port) COMMENT "Uploading ${_target_name} target" DEPENDS ${_target_name}) -endfunction() \ No newline at end of file +endfunction() diff --git a/cmake/Platform/Utilities/CMakeArgumentsUtils.cmake b/cmake/Platform/Utilities/CMakeArgumentsUtils.cmake index 7dc9f40..a94a62b 100644 --- a/cmake/Platform/Utilities/CMakeArgumentsUtils.cmake +++ b/cmake/Platform/Utilities/CMakeArgumentsUtils.cmake @@ -21,6 +21,8 @@ function(_consume_reserved_arguments _args _reserved_options _reserved_single_va decrement_integer(args_length 1) # We'll peform index iteration - It's always length-1 + # ToDo: Handle empty given sources + foreach (index RANGE ${args_length}) list(GET _args ${index} arg) diff --git a/examples/3rd-party-library/CMakeLists.txt b/examples/3rd-party-library/CMakeLists.txt index b10778c..f35faa5 100644 --- a/examples/3rd-party-library/CMakeLists.txt +++ b/examples/3rd-party-library/CMakeLists.txt @@ -25,7 +25,7 @@ find_arduino_library(sky_writer Skywriter ${board_id} 3RD_PARTY) find_arduino_library(liquid_Crystal LiquidCrystal_I2C ${board_id} 3RD_PARTY) # Link all libraries to our previously created target -link_arduino_library(3rd_Party_Arduino_Library adafruit_NeoPixel ${board_id}) -link_arduino_library(3rd_Party_Arduino_Library adafruit_GFX ${board_id}) -link_arduino_library(3rd_Party_Arduino_Library sky_writer ${board_id}) -link_arduino_library(3rd_Party_Arduino_Library liquid_Crystal ${board_id}) +link_arduino_library(3rd_Party_Arduino_Library adafruit_NeoPixel) +link_arduino_library(3rd_Party_Arduino_Library adafruit_GFX) +link_arduino_library(3rd_Party_Arduino_Library sky_writer) +link_arduino_library(3rd_Party_Arduino_Library liquid_Crystal) diff --git a/examples/arduino-library/CMakeLists.txt b/examples/arduino-library/CMakeLists.txt index 5af7320..6ff0708 100644 --- a/examples/arduino-library/CMakeLists.txt +++ b/examples/arduino-library/CMakeLists.txt @@ -7,15 +7,15 @@ add_arduino_executable(Arduino_Library ${board_id} test.cpp) # Find and link the Stepper library find_arduino_library(stepper_lib stePpEr ${board_id}) # Library name is case-insensitive to the user -link_arduino_library(Arduino_Library stepper_lib ${board_id}) +link_arduino_library(Arduino_Library stepper_lib) # Find and link the Servo library - Custom implementation for many architectures, # 'avr' is used by default find_arduino_library(servo_lib Servo ${board_id}) -link_arduino_library(Arduino_Library servo_lib ${board_id}) +link_arduino_library(Arduino_Library servo_lib) # Find and link the Ethernet library - Depends on the SPI avr-platform library find_arduino_library(ethernet_lib Ethernet ${board_id}) -link_arduino_library(Arduino_Library ethernet_lib ${board_id}) +link_arduino_library(Arduino_Library ethernet_lib) #upload_arduino_target(Arduino_Library "${board_id}" COM3) diff --git a/examples/header-only-library/CMakeLists.txt b/examples/header-only-library/CMakeLists.txt index c4f8d2d..b566f5c 100644 --- a/examples/header-only-library/CMakeLists.txt +++ b/examples/header-only-library/CMakeLists.txt @@ -10,4 +10,4 @@ add_arduino_executable(Header_Only_Lib ${board_id} headerOnlyTest.cpp) set(ARDUINO_CMAKE_SKETCHBOOK_PATH "${CMAKE_CURRENT_LIST_DIR}") find_arduino_library(headerTest test-lib ${board_id} 3RD_PARTY HEADER_ONLY) -link_arduino_library(Header_Only_Lib headerTest ${board_id} HEADER_ONLY) +link_arduino_library(Header_Only_Lib headerTest HEADER_ONLY) diff --git a/examples/servo-knob-example/CMakeLists.txt b/examples/servo-knob-example/CMakeLists.txt index 014a29d..87c4280 100644 --- a/examples/servo-knob-example/CMakeLists.txt +++ b/examples/servo-knob-example/CMakeLists.txt @@ -5,5 +5,4 @@ project(Knob_Example) get_board_id(board_id nano atmega328) find_arduino_library(servo_example_lib Servo ${board_id}) -add_arduino_library_example(Knob_Example ${board_id} servo_example_lib Servo Knob) - +add_arduino_library_example(Knob_Example servo_example_lib Servo Knob) diff --git a/examples/sketch/CMakeLists.txt b/examples/sketch/CMakeLists.txt index 796458f..32ae6c7 100644 --- a/examples/sketch/CMakeLists.txt +++ b/examples/sketch/CMakeLists.txt @@ -4,4 +4,4 @@ project(Sketch) get_board_id(board_id nano atmega328) add_arduino_executable(Sketch ${board_id}) -target_sketches(Sketch ${board_id} sketch1.ino sketch2.pde) +target_sketches(Sketch sketch1.ino sketch2.pde) From 96dd17d3f5257cc5cb30fe49af1e89548b49ec63 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sun, 9 Dec 2018 15:28:10 +0200 Subject: [PATCH 04/12] Added ability to configure boards on project-level Moved board-related modules under the `Hardware/Boards` directory. --- cmake/Platform/Arduino.cmake | 6 ++-- .../Hardware/Boards/BoardConfigurator.cmake | 29 +++++++++++++++++++ .../Boards}/BoardManager.cmake | 26 +++++++++++++++-- cmake/Platform/Hardware/Boards/Boards.cmake | 2 ++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 cmake/Platform/Hardware/Boards/BoardConfigurator.cmake rename cmake/Platform/{Other => Hardware/Boards}/BoardManager.cmake (97%) create mode 100644 cmake/Platform/Hardware/Boards/Boards.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index 3040c01..9bf8c2b 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -1,6 +1,7 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.8.2) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Utilities) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Hardware/Boards) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/System) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Other) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Properties) @@ -11,7 +12,8 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Targets) include(Utilities) -include(BoardManager) +include(Boards) + include(RecipeParser) include(TargetFlagsManager) include(SourcesManager) diff --git a/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake b/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake new file mode 100644 index 0000000..cb08e26 --- /dev/null +++ b/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake @@ -0,0 +1,29 @@ +include(CoreLibTarget) + +#========================================================================================================# +# Internal function that actually configures project for use with a given hardware board. +# Currently it only creates a Core-Library target based on the given board, which will be linked +# to every Arduino-target created afterwards. +# _board_id - Complete ID of the board which will be used throughout the project. +#========================================================================================================# +function(_configure_arduino_board _board_id) + + add_arduino_core_lib(${_board_id}) + +endfunction() + +#========================================================================================================# +# Configures CMake framework for use with the given Arduino hardware board. +# Note that it doesn't do anything that's actually related to hardware, this is simply configuration! +# This functio should be called at least once in each project, so targets created later could use the board. +# _board_name - Name of the board, e.g. nano, uno, etc... +# [] - Explicit board CPU if there are multiple versions of the board (such as atmega328p). +# This is an argument variable which has no name and can be passed as the last argument when required. +#========================================================================================================# +function(configure_arduino_board _board_name _board_cpu) + + get_board_id(board_id ${_board_name} ${_board_cpu}) + + _configure_arduino_board(${board_id}) + +endfunction() diff --git a/cmake/Platform/Other/BoardManager.cmake b/cmake/Platform/Hardware/Boards/BoardManager.cmake similarity index 97% rename from cmake/Platform/Other/BoardManager.cmake rename to cmake/Platform/Hardware/Boards/BoardManager.cmake index f9ecec0..d923842 100644 --- a/cmake/Platform/Other/BoardManager.cmake +++ b/cmake/Platform/Hardware/Boards/BoardManager.cmake @@ -12,30 +12,43 @@ function(get_board_id _return_var _board_name) set(extra_args ${ARGN}) + list(LENGTH extra_args num_of_extra_args) + if (${num_of_extra_args} GREATER 0) list(GET extra_args 0 _board_cpu) endif () list(FIND ARDUINO_CMAKE_BOARDS ${_board_name} board_name_index) + if (${board_name_index} LESS 0) # Negative value = not found in list - message(FATAL_ERROR "Unknown given board name, not defined in 'boards.txt'. Check your\ - spelling.") + message(FATAL_ERROR "Given board not defined in 'boards.txt' - Check your spelling.") + else () # Board is valid and has been found + if (DEFINED ${_board_name}_cpu_list) # Board cpu is to be expected + if (NOT _board_cpu) message(FATAL_ERROR "Expected board CPU to be provided for the ${_board_name} board") + else () + list(FIND ${_board_name}_cpu_list ${_board_cpu} board_cpu_index) + if (${board_cpu_index} LESS 0) message(FATAL_ERROR "Unknown given board cpu") endif () + set(board_id "${_board_name}.${_board_cpu}") + set(${_return_var} "${board_id}" PARENT_SCOPE) + endif () + else () # Board without explicit CPU set(${_return_var} ${_board_name} PARENT_SCOPE) endif () + endif () endfunction() @@ -58,19 +71,24 @@ function(get_board_property _board_id _property _return_var) # Get the length of the board to determine whether board CPU is to be expected list(LENGTH board_id num_of_board_elements) + list(GET board_id 0 board_name) # Get the board name which is mandatory if (DEFINED ${board_name}_${property}) set(retrieved_property ${${board_name}_${property}}) elseif (${num_of_board_elements} EQUAL 1) # Only board name is supplied message(WARNING "Property ${_property} couldn't be found on board ${_board_id}") + else () + list(GET board_id 1 board_cpu) + if (NOT DEFINED ${board_name}_menu_cpu_${board_cpu}_${property}) message(WARNING "Property ${_property} couldn't be found on board ${_board_id}") else () set(retrieved_property ${${board_name}_menu_cpu_${board_cpu}_${property}}) endif () + endif () set(${_return_var} ${retrieved_property} PARENT_SCOPE) @@ -100,13 +118,17 @@ function(try_get_board_property _board_id _property _return_var) set(${_return_var} ${${board_name}_${property}} PARENT_SCOPE) elseif (${num_of_board_elements} EQUAL 1) # Only board name is supplied return() + else () + list(GET board_id 1 board_cpu) + if (NOT DEFINED ${board_name}_menu_cpu_${board_cpu}_${property}) return() else () set(${_return_var} ${${board_name}_menu_cpu_${board_cpu}_${property}} PARENT_SCOPE) endif () + endif () endfunction() diff --git a/cmake/Platform/Hardware/Boards/Boards.cmake b/cmake/Platform/Hardware/Boards/Boards.cmake new file mode 100644 index 0000000..c25f40b --- /dev/null +++ b/cmake/Platform/Hardware/Boards/Boards.cmake @@ -0,0 +1,2 @@ +include(BoardManager) +include(BoardConfigurator) From 55dfe2b2520d85e5d729a728017d32e65a6fceaf Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Fri, 22 Feb 2019 19:57:49 +0200 Subject: [PATCH 05/12] Mostly cosmetic changes - Renaming & Reordering --- .../Libraries/LibraryFlagsManager.cmake | 2 +- cmake/Platform/Other/TargetFlagsManager.cmake | 4 ++-- .../Targets/ArduinoLibraryTarget.cmake | 2 +- cmake/Platform/Targets/CoreLibTarget.cmake | 19 +++++++++---------- .../Targets/PlatformLibraryTarget.cmake | 3 ++- cmake/Platform/Utilities/StringUtils.cmake | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cmake/Platform/Libraries/LibraryFlagsManager.cmake b/cmake/Platform/Libraries/LibraryFlagsManager.cmake index 0ed459a..83c0d42 100644 --- a/cmake/Platform/Libraries/LibraryFlagsManager.cmake +++ b/cmake/Platform/Libraries/LibraryFlagsManager.cmake @@ -20,6 +20,6 @@ function(set_library_flags _library_target) set_target_compile_flags(${_library_target} ${scope}) # Set linker flags - set_linker_flags(${_library_target}) + set_target_linker_flags(${_library_target}) endfunction() diff --git a/cmake/Platform/Other/TargetFlagsManager.cmake b/cmake/Platform/Other/TargetFlagsManager.cmake index 0f2b2e8..fa28b31 100644 --- a/cmake/Platform/Other/TargetFlagsManager.cmake +++ b/cmake/Platform/Other/TargetFlagsManager.cmake @@ -55,7 +55,7 @@ endfunction() # Sets linker flags on the given target, according also to the given board ID. # _target_name - Name of the target (Executable or Library) to set flags on. #=============================================================================# -function(set_linker_flags _target_name) +function(set_target_linker_flags _target_name) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_target_name} TYPE) @@ -82,7 +82,7 @@ endfunction() function(set_executable_target_flags _target_name) set_target_compile_flags(${_target_name}) - set_linker_flags(${_target_name}) + set_target_linker_flags(${_target_name}) target_link_libraries(${_target_name} PUBLIC m) # Add math library diff --git a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake index 75d2ee4..6c3aa21 100644 --- a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake @@ -73,7 +73,7 @@ function(link_arduino_library _target_name _library_target_name) get_target_property(board_id ${_target_name} BOARD_ID) # Get the name of the Core-Lib target associated with the targets' 'board_id' - get_core_lib_target_name(${board_id} core_lib_target) + generate_core_lib_target_name(${board_id} core_lib_target) if (NOT TARGET ${core_lib_target}) message(FATAL_ERROR "Core Library target doesn't exist. " diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index 481d405..affc012 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -5,6 +5,7 @@ function(_is_board_core_valid _board_core _board_id) list(FIND ARDUINO_CMAKE_PLATFORM_CORES "${board_core}" index) + if (${index} LESS 0) message(FATAL_ERROR "Unknown board core \"${board_core}\" for the ${_board_id} board") endif () @@ -18,6 +19,7 @@ endfunction() function(_is_board_variant_valid _board_variant _board_id) list(FIND ARDUINO_CMAKE_PLATFORM_VARIANTS "${board_variant}" index) + if (${index} LESS 0) message(FATAL_ERROR "Unknown board variant \"${board_variant}\" for the ${_board_id} board") endif () @@ -64,23 +66,23 @@ endfunction() function(_set_core_lib_flags _core_target_name) set_target_compile_flags(${_core_target_name} PUBLIC) - - set_linker_flags(${_core_target_name}) + set_target_linker_flags(${_core_target_name}) endfunction() #=============================================================================# # Adds/Creates a static library target for Arduino's core library (Core-Lib), -# required by every standard Arduino Application/Executable. -# The library is then linked against the given executable target -# (Which also means is has to be created first). +# required by every arduino target. # _target_name - Name of the Application/Executable target created earlier. # _board_id - Board to create the core library for. # Note that each board has a unique version of the library. #=============================================================================# function(add_arduino_core_lib _target_name) - get_core_lib_target_name(${board_id} core_lib_target) + # First, retrieve the board_id associated with the target from the matching property + get_target_property(board_id ${_target_name} BOARD_ID) + + generate_core_lib_target_name(${board_id} core_lib_target) if (TARGET ${core_lib_target}) # Core-lib target already created for the given board if (TARGET ${_target_name}) # Executable/Firmware target also exists @@ -89,16 +91,13 @@ function(add_arduino_core_lib _target_name) else () # Core-Lib target needs to be created - # First, retrieve the board_id associated with the target from the matching property - get_target_property(board_id ${_target_name} BOARD_ID) - _get_board_core(${board_id} board_core) # Get board's core _get_board_variant(${board_id} board_variant) # Get board's variant # Find sources in core directory and add the library target find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) - if (${CMAKE_HOST_UNIX}) + if (CMAKE_HOST_UNIX) if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN) list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*") endif () diff --git a/cmake/Platform/Targets/PlatformLibraryTarget.cmake b/cmake/Platform/Targets/PlatformLibraryTarget.cmake index 752fb85..82b14b1 100644 --- a/cmake/Platform/Targets/PlatformLibraryTarget.cmake +++ b/cmake/Platform/Targets/PlatformLibraryTarget.cmake @@ -58,7 +58,8 @@ function(link_platform_library _target_name _platform_library_name) _add_platform_library(${_platform_library_name} ${board_id}) - get_core_lib_target_name(${board_id} core_lib_target) + generate_core_lib_target_name(${board_id} core_lib_target) + _link_arduino_cmake_library(${_target_name} ${_platform_library_name} ${scope} BOARD_CORE_TARGET ${core_lib_target}) diff --git a/cmake/Platform/Utilities/StringUtils.cmake b/cmake/Platform/Utilities/StringUtils.cmake index 3efa362..795ef26 100644 --- a/cmake/Platform/Utilities/StringUtils.cmake +++ b/cmake/Platform/Utilities/StringUtils.cmake @@ -59,7 +59,7 @@ endfunction() # _return_var - Name of variable in parent-scope holding the return value. # Returns - Name of the core library target for the given board. #=============================================================================# -function(get_core_lib_target_name _board_id _return_var) +function(generate_core_lib_target_name _board_id _return_var) string(REPLACE "." "_" board_id "${_board_id}") From 73cd076b5dc00c1a0f7d057bb534e216eec856cf Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sat, 23 Feb 2019 15:46:10 +0200 Subject: [PATCH 06/12] Further refactored towards a project-global `board_id` It omits the need to pass it as an argument to functions or to set it as a target property. --- cmake/Platform/Arduino.cmake | 3 ++ .../Hardware/Boards/BoardConfigurator.cmake | 29 ------------------- cmake/Platform/Hardware/Boards/Boards.cmake | 1 - .../Platform/Libraries/LibrariesFinder.cmake | 7 ++--- .../Libraries/LibraryFlagsManager.cmake | 6 ---- cmake/Platform/Other/TargetFlagsManager.cmake | 24 +++------------ cmake/Platform/Project/BoardSetup.cmake | 15 ++++++++++ cmake/Platform/Project/Project.cmake | 2 ++ cmake/Platform/Project/Setup.cmake | 9 ++++++ .../Sketches/SketchHeadersManager.cmake | 4 +-- .../Targets/ArduinoCMakeLibraryTarget.cmake | 11 ++----- .../Targets/ArduinoExampleTarget.cmake | 9 ++---- .../Targets/ArduinoLibraryTarget.cmake | 16 ++++------ cmake/Platform/Targets/CoreLibTarget.cmake | 18 ++++-------- cmake/Platform/Targets/ExecutableTarget.cmake | 11 ++----- .../Targets/PlatformLibraryTarget.cmake | 11 +++---- cmake/Platform/Targets/UploadTarget.cmake | 2 -- examples/3rd-party-library/CMakeLists.txt | 16 +++++----- examples/arduino-library/CMakeLists.txt | 16 +++++----- examples/blink-example/CMakeLists.txt | 7 +++-- examples/header-only-library/CMakeLists.txt | 10 ++++--- examples/hello-world/CMakeLists.txt | 6 ++-- examples/misc/CMakeLists.txt | 2 -- examples/misc/libraries/CMakeLists.txt | 2 -- .../late-sources-library/CMakeLists.txt | 11 +++---- examples/platform-library/CMakeLists.txt | 12 ++++---- examples/servo-knob-example/CMakeLists.txt | 7 +++-- examples/sketch/CMakeLists.txt | 8 +++-- 28 files changed, 114 insertions(+), 161 deletions(-) delete mode 100644 cmake/Platform/Hardware/Boards/BoardConfigurator.cmake create mode 100644 cmake/Platform/Project/BoardSetup.cmake create mode 100644 cmake/Platform/Project/Project.cmake create mode 100644 cmake/Platform/Project/Setup.cmake diff --git a/cmake/Platform/Arduino.cmake b/cmake/Platform/Arduino.cmake index 9bf8c2b..5980fc1 100644 --- a/cmake/Platform/Arduino.cmake +++ b/cmake/Platform/Arduino.cmake @@ -4,6 +4,7 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Utilities) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Hardware/Boards) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/System) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Other) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Project) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Properties) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Sketches) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/Sources) @@ -34,4 +35,6 @@ include(ArduinoLibraryTarget) include(PlatformLibraryTarget) include(ArduinoExampleTarget) +include(Project) + initialize_build_system() diff --git a/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake b/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake deleted file mode 100644 index cb08e26..0000000 --- a/cmake/Platform/Hardware/Boards/BoardConfigurator.cmake +++ /dev/null @@ -1,29 +0,0 @@ -include(CoreLibTarget) - -#========================================================================================================# -# Internal function that actually configures project for use with a given hardware board. -# Currently it only creates a Core-Library target based on the given board, which will be linked -# to every Arduino-target created afterwards. -# _board_id - Complete ID of the board which will be used throughout the project. -#========================================================================================================# -function(_configure_arduino_board _board_id) - - add_arduino_core_lib(${_board_id}) - -endfunction() - -#========================================================================================================# -# Configures CMake framework for use with the given Arduino hardware board. -# Note that it doesn't do anything that's actually related to hardware, this is simply configuration! -# This functio should be called at least once in each project, so targets created later could use the board. -# _board_name - Name of the board, e.g. nano, uno, etc... -# [] - Explicit board CPU if there are multiple versions of the board (such as atmega328p). -# This is an argument variable which has no name and can be passed as the last argument when required. -#========================================================================================================# -function(configure_arduino_board _board_name _board_cpu) - - get_board_id(board_id ${_board_name} ${_board_cpu}) - - _configure_arduino_board(${board_id}) - -endfunction() diff --git a/cmake/Platform/Hardware/Boards/Boards.cmake b/cmake/Platform/Hardware/Boards/Boards.cmake index c25f40b..773a826 100644 --- a/cmake/Platform/Hardware/Boards/Boards.cmake +++ b/cmake/Platform/Hardware/Boards/Boards.cmake @@ -1,2 +1 @@ include(BoardManager) -include(BoardConfigurator) diff --git a/cmake/Platform/Libraries/LibrariesFinder.cmake b/cmake/Platform/Libraries/LibrariesFinder.cmake index 4fa1df0..70e0a8c 100644 --- a/cmake/Platform/Libraries/LibrariesFinder.cmake +++ b/cmake/Platform/Libraries/LibrariesFinder.cmake @@ -11,13 +11,12 @@ endmacro() # using the current platform architecture. # _target_name - Name of the library target to be created. Usually library's real name. # _library_name - Name of the Arduino library to find. -# _board_id - Board ID associated with the linked Core Lib. # [3RD_PARTY] - Whether library should be treated as a 3rd Party library. # [HEADER_ONLY] - Whether library should be treated as header-only library. # [QUIET] - Whether function should "fail" safely without warnings/errors # in case of an actual error. #=============================================================================# -function(find_arduino_library _target_name _library_name _board_id) +function(find_arduino_library _target_name _library_name) set(argument_options "3RD_PARTY" "HEADER_ONLY" "QUIET") cmake_parse_arguments(parsed_args "${argument_options}" "" "" ${ARGN}) @@ -53,7 +52,7 @@ function(find_arduino_library _target_name _library_name _board_id) else () if (parsed_args_HEADER_ONLY) - add_arduino_header_only_library(${_target_name} ${_board_id} ${library_headers}) + add_arduino_header_only_library(${_target_name} ${library_headers}) else () @@ -74,7 +73,7 @@ function(find_arduino_library _target_name _library_name _board_id) set(sources ${library_headers} ${library_sources}) - add_arduino_library(${_target_name} ${_board_id} ${sources}) + add_arduino_library(${_target_name} ${sources}) endif () diff --git a/cmake/Platform/Libraries/LibraryFlagsManager.cmake b/cmake/Platform/Libraries/LibraryFlagsManager.cmake index 83c0d42..64b2137 100644 --- a/cmake/Platform/Libraries/LibraryFlagsManager.cmake +++ b/cmake/Platform/Libraries/LibraryFlagsManager.cmake @@ -11,12 +11,6 @@ function(set_library_flags _library_target) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_library_target} TYPE) - if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") - get_target_property(board_id ${_library_target} INTERFACE_BOARD_ID) - else () - get_target_property(board_id ${_library_target} BOARD_ID) - endif () - set_target_compile_flags(${_library_target} ${scope}) # Set linker flags diff --git a/cmake/Platform/Other/TargetFlagsManager.cmake b/cmake/Platform/Other/TargetFlagsManager.cmake index fa28b31..76f1ce2 100644 --- a/cmake/Platform/Other/TargetFlagsManager.cmake +++ b/cmake/Platform/Other/TargetFlagsManager.cmake @@ -9,17 +9,9 @@ function(_set_target_language_flags _target_name _language _scope) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_target_name} TYPE) - if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") - get_target_property(board_id ${_target_name} INTERFACE_BOARD_ID) - else () - get_target_property(board_id ${_target_name} BOARD_ID) - endif () - - parse_compiler_recipe_flags(${board_id} compiler_recipe_flags - LANGUAGE "${_language}") + parse_compiler_recipe_flags(${ARDUINO_CMAKE_PROJECT_BOARD} compiler_recipe_flags LANGUAGE "${_language}") - target_compile_options(${_target_name} ${_scope} - $<$:${compiler_recipe_flags}>) + target_compile_options(${_target_name} ${_scope} $<$:${compiler_recipe_flags}>) endfunction() @@ -60,13 +52,7 @@ function(set_target_linker_flags _target_name) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_target_name} TYPE) - if ("${target_type}" STREQUAL "INTERFACE_LIBRARY") - get_target_property(board_id ${_target_name} INTERFACE_BOARD_ID) - else () - get_target_property(board_id ${_target_name} BOARD_ID) - endif () - - parse_linker_recpie_pattern(${board_id} linker_recipe_flags) + parse_linker_recpie_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} linker_recipe_flags) string(REPLACE ";" " " cmake_compliant_linker_flags "${linker_recipe_flags}") @@ -97,10 +83,8 @@ endfunction() #=============================================================================# function(set_upload_target_flags _target_name _upload_port _return_var) - get_target_property(board_id ${_target_name} BOARD_ID) - # Parse and append recipe flags - parse_upload_recipe_pattern(${board_id} "${_upload_port}" upload_recipe_flags) + parse_upload_recipe_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} "${_upload_port}" upload_recipe_flags) list(APPEND upload_flags "${upload_recipe_flags}") set(target_binary_base_path "${CMAKE_CURRENT_BINARY_DIR}/${_target_name}") diff --git a/cmake/Platform/Project/BoardSetup.cmake b/cmake/Platform/Project/BoardSetup.cmake new file mode 100644 index 0000000..1e722fd --- /dev/null +++ b/cmake/Platform/Project/BoardSetup.cmake @@ -0,0 +1,15 @@ +function(setup_project_board) + + cmake_parse_arguments(parsed_args "" "BOARD_NAME;BOARD_CPU" "" ${ARGV}) + + if (NOT parsed_args_BOARD_NAME) + message(FATAL_ERROR "Expected board name in setup function") + else () + + get_board_id(board_id ${parsed_args_BOARD_NAME} ${parsed_args_BOARD_CPU}) + + set(ARDUINO_CMAKE_PROJECT_BOARD ${board_id} CACHE STRING "Project-Wide board ID") + + endif () + +endfunction() diff --git a/cmake/Platform/Project/Project.cmake b/cmake/Platform/Project/Project.cmake new file mode 100644 index 0000000..3e4985b --- /dev/null +++ b/cmake/Platform/Project/Project.cmake @@ -0,0 +1,2 @@ +include(BoardSetup) +include(Setup) diff --git a/cmake/Platform/Project/Setup.cmake b/cmake/Platform/Project/Setup.cmake new file mode 100644 index 0000000..c3ec332 --- /dev/null +++ b/cmake/Platform/Project/Setup.cmake @@ -0,0 +1,9 @@ +function(arduino_cmake_project _project_name) + + project(${_project_name}) + + set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} CACHE STRING "Current project name") + + setup_project_board(${ARGN}) + +endfunction() diff --git a/cmake/Platform/Sketches/SketchHeadersManager.cmake b/cmake/Platform/Sketches/SketchHeadersManager.cmake index 7938d75..e98025a 100644 --- a/cmake/Platform/Sketches/SketchHeadersManager.cmake +++ b/cmake/Platform/Sketches/SketchHeadersManager.cmake @@ -8,8 +8,6 @@ function(resolve_sketch_headers _target_name _sketch_file) get_source_file_included_headers("${_sketch_file}" sketch_headers) - get_target_property(board_id ${_target_name} BOARD_ID) - foreach (header ${sketch_headers}) # Header name without extension (such as '.h') can represent an Arduino/Platform library @@ -27,7 +25,7 @@ function(resolve_sketch_headers _target_name _sketch_file) else () # Pass the '3RD_PARTY' option to avoid name-conversion - find_arduino_library(${header_we}_sketch_lib ${header_we} ${board_id} 3RD_PARTY QUIET) + find_arduino_library(${header_we}_sketch_lib ${header_we} 3RD_PARTY QUIET) # If library isn't found, display a status since it might be a user library if (NOT TARGET ${header_we}_sketch_lib OR diff --git a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake index 45c1193..86b8ff6 100644 --- a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake @@ -3,12 +3,11 @@ # One can also specify an architecture for the library, which will result in a special parsing # of the sources, ommiting non-compliant sources. # _target_name - Name of the library target to be created. Usually library's real name. -# _board_id - Board ID associated with the linked Core Lib. # _sources - Source and header files to create library target from. # [ARCH] - Optional library architecture (Such as 'avr', 'nrf52', etc.). # [INTERFACE] - Whether the library should be created as an interface library (header-only). #=============================================================================# -function(_add_arduino_cmake_library _target_name _board_id _sources) +function(_add_arduino_cmake_library _target_name _sources) cmake_parse_arguments(parsed_args "INTERFACE" "" "" ${ARGN}) @@ -17,26 +16,20 @@ function(_add_arduino_cmake_library _target_name _board_id _sources) add_library(${_target_name} INTERFACE) set(scope INTERFACE) - set_property(TARGET ${_target_name} PROPERTY INTERFACE_BOARD_ID ${_board_id}) - else () add_library(${_target_name} STATIC "${_sources}") set(scope PUBLIC) - set_property(TARGET ${_target_name} PROPERTY BOARD_ID ${_board_id}) - endif () - # Treat headers' parent directories as include directories of the target get_headers_parent_directories("${_sources}" include_dirs) target_include_directories(${_target_name} ${scope} ${include_dirs}) set_library_flags(${_target_name} ${scope}) - set_target_architecture_definition(${_target_name} ${scope} - ${ARDUINO_CMAKE_PLATFORM_ARCHITECTURE}) + set_target_architecture_definition(${_target_name} ${scope} ${ARDUINO_CMAKE_PLATFORM_ARCHITECTURE}) endfunction() diff --git a/cmake/Platform/Targets/ArduinoExampleTarget.cmake b/cmake/Platform/Targets/ArduinoExampleTarget.cmake index e4dce22..57f49b2 100644 --- a/cmake/Platform/Targets/ArduinoExampleTarget.cmake +++ b/cmake/Platform/Targets/ArduinoExampleTarget.cmake @@ -2,13 +2,12 @@ # Adds/Creates an Arduino-Example executable target with the given name, # using the given board ID and example's sources. # _target_name - Name of the target (Executable) to create. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # _example_name - Name of the example to use, such as 'Blink'. # [CATEGORY cat] - Optional argument representing the category of the Example to use. # e.g The 'Blink' example is under the '01.Basics' category. # Generally, all this does is improving search performance by narrowing. #=============================================================================# -function(add_arduino_example _target_name _board_id _example_name) +function(add_arduino_example _target_name _example_name) convert_string_to_pascal_case(${_example_name} arduino_compliant_example_name) @@ -16,7 +15,7 @@ function(add_arduino_example _target_name _board_id _example_name) ${arduino_compliant_example_name} example_sketches ${ARGN}) # First create the target (Without sources), then add sketches as converted sources - add_arduino_executable(${_target_name} ${_board_id}) + add_arduino_executable(${_target_name}) target_sketches(${_target_name} "${example_sketches}") @@ -43,12 +42,10 @@ function(add_arduino_library_example _target_name _library_target_name _library_ message(SEND_ERROR "Library target doesn't exist - It must be created first!") endif () - get_target_property(board_id ${_library_target_name} BOARD_ID) - find_arduino_library_example_sources("${ARDUINO_SDK_LIBRARIES_PATH}/${arduino_compliant_library_name}" ${arduino_compliant_example_name} example_sketches ${ARGN}) - add_arduino_executable(${_target_name} ${board_id}) + add_arduino_executable(${_target_name}) target_sketches(${_target_name} "${example_sketches}") diff --git a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake index 6c3aa21..2627c15 100644 --- a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake @@ -2,11 +2,10 @@ # Creates a library target for the given name and sources. # As it's an Arduino library, it also finds and links all dependent platform libraries (if any). # _target_name - Name of the library target to be created. Usually library's real name. -# _board_id - Board ID associated with the linked Core Lib. # [Sources] - List of source files (Could also be headers for code-inspection in some IDEs) # to create the executable from, similar to CMake's built-in add_executable. #=============================================================================# -function(add_arduino_library _target_name _board_id) +function(add_arduino_library _target_name) parse_sources_arguments(parsed_sources "" "" "" "${ARGN}") @@ -23,11 +22,11 @@ function(add_arduino_library _target_name _board_id) resolve_library_architecture("${parsed_sources}" arch_resolved_sources) endif () - _add_arduino_cmake_library(${_target_name} ${_board_id} "${arch_resolved_sources}") + _add_arduino_cmake_library(${_target_name} "${arch_resolved_sources}") else() # No sources have been provided at this stage, simply create a library target - _add_arduino_cmake_library(${_target_name} ${_board_id} "") + _add_arduino_cmake_library(${_target_name} "") endif() @@ -42,13 +41,12 @@ endfunction() #=============================================================================# # Creates a header-only library target for the given name and sources. # _target_name - Name of the "executable" target. -# _board_id - Board ID associated with the linked Core Lib. #=============================================================================# -function(add_arduino_header_only_library _target_name _board_id) +function(add_arduino_header_only_library _target_name) parse_sources_arguments(parsed_headers "" "" "" "${ARGN}") - _add_arduino_cmake_library(${_target_name} ${_board_id} "${parsed_headers}" INTERFACE) + _add_arduino_cmake_library(${_target_name} "${parsed_headers}" INTERFACE) endfunction() @@ -69,11 +67,9 @@ function(link_arduino_library _target_name _library_target_name) message(FATAL_ERROR "Library target doesn't exist - It must be created first!") endif () - # Retrieve 'board_id' property of targets - get_target_property(board_id ${_target_name} BOARD_ID) # Get the name of the Core-Lib target associated with the targets' 'board_id' - generate_core_lib_target_name(${board_id} core_lib_target) + generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) if (NOT TARGET ${core_lib_target}) message(FATAL_ERROR "Core Library target doesn't exist. " diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index affc012..2dc33fd 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -79,10 +79,7 @@ endfunction() #=============================================================================# function(add_arduino_core_lib _target_name) - # First, retrieve the board_id associated with the target from the matching property - get_target_property(board_id ${_target_name} BOARD_ID) - - generate_core_lib_target_name(${board_id} core_lib_target) + generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) if (TARGET ${core_lib_target}) # Core-lib target already created for the given board if (TARGET ${_target_name}) # Executable/Firmware target also exists @@ -91,8 +88,8 @@ function(add_arduino_core_lib _target_name) else () # Core-Lib target needs to be created - _get_board_core(${board_id} board_core) # Get board's core - _get_board_variant(${board_id} board_variant) # Get board's variant + _get_board_core(${ARDUINO_CMAKE_PROJECT_BOARD} board_core) # Get board's core + _get_board_variant(${ARDUINO_CMAKE_PROJECT_BOARD} board_variant) # Get board's variant # Find sources in core directory and add the library target find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) @@ -105,14 +102,9 @@ function(add_arduino_core_lib _target_name) add_library(${core_lib_target} STATIC "${core_sources}") - # Set the BOARD_ID property on the core-lib's target as well - set_property(TARGET ${core_lib_target} PROPERTY BOARD_ID ${board_id}) - # Include platform's core and variant directories - target_include_directories(${core_lib_target} PUBLIC - "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") - target_include_directories(${core_lib_target} PUBLIC - "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") + target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") + target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") _set_core_lib_flags(${core_lib_target}) diff --git a/cmake/Platform/Targets/ExecutableTarget.cmake b/cmake/Platform/Targets/ExecutableTarget.cmake index da37968..e9b8fc7 100644 --- a/cmake/Platform/Targets/ExecutableTarget.cmake +++ b/cmake/Platform/Targets/ExecutableTarget.cmake @@ -2,19 +2,15 @@ # Adds/Creates an Arduino-Executable target with the given name, # using the given board ID and source files. # _target_name - Name of the target (Executable) to create. -# _board_id - ID of the board to bind to the target (Each target can have a single board). # [Sources] - List of source files (Could also be headers for code-inspection in some IDEs) # to create the executable from, similar to CMake's built-in add_executable. #=============================================================================# -function(add_arduino_executable _target_name _board_id) +function(add_arduino_executable _target_name) list(APPEND sources "${ARGN}") # Treat all remaining arguments as sources add_executable(${_target_name} "${sources}") - # Set the 'board_id' property on the target - set_property(TARGET ${_target_name} PROPERTY BOARD_ID ${_board_id}) - # Always add board's core lib add_arduino_core_lib(${_target_name}) @@ -42,10 +38,9 @@ function(add_arduino_executable _target_name _board_id) VERBATIM) # Required for avr-size - get_board_property(${_board_id} build.mcu board_mcu) + get_board_property(${ARDUINO_CMAKE_PROJECT_BOARD} build.mcu board_mcu) - set(avr_size_script - "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake") + set(avr_size_script "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake") add_custom_command(TARGET ${_target_name} POST_BUILD COMMAND ${CMAKE_COMMAND} diff --git a/cmake/Platform/Targets/PlatformLibraryTarget.cmake b/cmake/Platform/Targets/PlatformLibraryTarget.cmake index 82b14b1..53b2007 100644 --- a/cmake/Platform/Targets/PlatformLibraryTarget.cmake +++ b/cmake/Platform/Targets/PlatformLibraryTarget.cmake @@ -25,16 +25,15 @@ endfunction() #=============================================================================# # Creates a platform library target with the given name. # _library_name - Name of the library target to create, usually the platform library name. -# _board_id - Board ID associated with the linked Core Lib. #=============================================================================# -function(_add_platform_library _library_name _board_id) +function(_add_platform_library _library_name) find_library_header_files("${ARDUINO_CMAKE_PLATFORM_LIBRARIES_PATH}/${_library_name}/src" lib_headers) find_library_source_files("${ARDUINO_CMAKE_PLATFORM_LIBRARIES_PATH}/${_library_name}/src" lib_source_files) set(lib_sources ${lib_headers} ${lib_source_files}) - _add_arduino_cmake_library(${_library_name} ${_board_id} "${lib_sources}") + _add_arduino_cmake_library(${_library_name} "${lib_sources}") endfunction() @@ -54,11 +53,9 @@ function(link_platform_library _target_name _platform_library_name) if (NOT TARGET ${_platform_library_name}) - get_target_property(board_id ${_target_name} BOARD_ID) + _add_platform_library(${_platform_library_name}) - _add_platform_library(${_platform_library_name} ${board_id}) - - generate_core_lib_target_name(${board_id} core_lib_target) + generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) _link_arduino_cmake_library(${_target_name} ${_platform_library_name} ${scope} diff --git a/cmake/Platform/Targets/UploadTarget.cmake b/cmake/Platform/Targets/UploadTarget.cmake index 5b8b006..6b33dce 100644 --- a/cmake/Platform/Targets/UploadTarget.cmake +++ b/cmake/Platform/Targets/UploadTarget.cmake @@ -5,8 +5,6 @@ #=============================================================================# function(upload_arduino_target _target_name _port) - get_target_property(board_id ${_target_name} BOARD_ID) - if ("${_target_name}" STREQUAL "") message(FATAL_ERROR "Can't create upload target for an invalid target ${_target_name}") endif () diff --git a/examples/3rd-party-library/CMakeLists.txt b/examples/3rd-party-library/CMakeLists.txt index f35faa5..146e4d7 100644 --- a/examples/3rd-party-library/CMakeLists.txt +++ b/examples/3rd-party-library/CMakeLists.txt @@ -1,28 +1,30 @@ cmake_minimum_required(VERSION 3.8.2) -project(3rd_Party_Arduino_Library) -get_board_id(board_id nano atmega328) +#[[project(3rd_Party_Arduino_Library) +get_board_id(board_id nano atmega328)]] + +arduino_cmake_project(3rd_Party_Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) # First, declare and create our executable - It'll use 4 sources -add_arduino_executable(3rd_Party_Arduino_Library ${board_id} 3rd_party.cpp +add_arduino_executable(3rd_Party_Arduino_Library 3rd_party.cpp NeoPixelTest.cpp GFXTest.cpp LiquidCrystalTest.cpp) target_include_directories(3rd_Party_Arduino_Library PRIVATE include) # Add the "NeoPixel" library manually using the library addition API -add_arduino_library(adafruit_NeoPixel ${board_id} libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp) +add_arduino_library(adafruit_NeoPixel libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp) target_include_directories(adafruit_NeoPixel PUBLIC libraries/Adafruit_NeoPixel) # Find the "GFX" library - It's located under the 'libraries' sub-dir, which is a valid search path -find_arduino_library(adafruit_GFX Adafruit-GFX-Library ${board_id} 3RD_PARTY) +find_arduino_library(adafruit_GFX Adafruit-GFX-Library 3RD_PARTY) # We can also explicitly add additional directories to the target, # as only root dir and 'src' and 'utility' sub-dirs are added by default target_source_directories(adafruit_GFX DIRS libraries/Adafruit-GFX-Library/Fonts) # We can even automatically find a library that doesn't have a properties file! -find_arduino_library(sky_writer Skywriter ${board_id} 3RD_PARTY) +find_arduino_library(sky_writer Skywriter 3RD_PARTY) # Libraries that have an inner-dependency on a platform library are also suported! -find_arduino_library(liquid_Crystal LiquidCrystal_I2C ${board_id} 3RD_PARTY) +find_arduino_library(liquid_Crystal LiquidCrystal_I2C 3RD_PARTY) # Link all libraries to our previously created target link_arduino_library(3rd_Party_Arduino_Library adafruit_NeoPixel) diff --git a/examples/arduino-library/CMakeLists.txt b/examples/arduino-library/CMakeLists.txt index 6ff0708..a4e4f52 100644 --- a/examples/arduino-library/CMakeLists.txt +++ b/examples/arduino-library/CMakeLists.txt @@ -1,21 +1,23 @@ cmake_minimum_required(VERSION 3.8.2) -project(Arduino_Library) -get_board_id(board_id nano atmega328) +#[[project(Arduino_Library) +get_board_id(board_id nano atmega328)]] -add_arduino_executable(Arduino_Library ${board_id} test.cpp) +arduino_cmake_project(Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) + +add_arduino_executable(Arduino_Library test.cpp) # Find and link the Stepper library -find_arduino_library(stepper_lib stePpEr ${board_id}) # Library name is case-insensitive to the user +find_arduino_library(stepper_lib stePpEr) # Library name is case-insensitive to the user link_arduino_library(Arduino_Library stepper_lib) # Find and link the Servo library - Custom implementation for many architectures, # 'avr' is used by default -find_arduino_library(servo_lib Servo ${board_id}) +find_arduino_library(servo_lib Servo) link_arduino_library(Arduino_Library servo_lib) # Find and link the Ethernet library - Depends on the SPI avr-platform library -find_arduino_library(ethernet_lib Ethernet ${board_id}) +find_arduino_library(ethernet_lib Ethernet) link_arduino_library(Arduino_Library ethernet_lib) -#upload_arduino_target(Arduino_Library "${board_id}" COM3) +#upload_arduino_target(Arduino_Library "" COM3) diff --git a/examples/blink-example/CMakeLists.txt b/examples/blink-example/CMakeLists.txt index 998897d..b82b92e 100644 --- a/examples/blink-example/CMakeLists.txt +++ b/examples/blink-example/CMakeLists.txt @@ -1,7 +1,8 @@ cmake_minimum_required(VERSION 3.8.2) -project(Blink_Example) +#[[project(Blink_Example) +get_board_id(board_id nano atmega328)]] -get_board_id(board_id nano atmega328) +arduino_cmake_project(Blink_Example BOARD_NAME nano BOARD_CPU atmega328) -add_arduino_example(Blink_Example ${board_id} Blink) +add_arduino_example(Blink_Example Blink) diff --git a/examples/header-only-library/CMakeLists.txt b/examples/header-only-library/CMakeLists.txt index b566f5c..e6bc08f 100644 --- a/examples/header-only-library/CMakeLists.txt +++ b/examples/header-only-library/CMakeLists.txt @@ -1,13 +1,15 @@ cmake_minimum_required(VERSION 3.8.2) -project(Header_Only_Lib) -get_board_id(board_id nano atmega328) +#[[project(Header_Only_Lib) +get_board_id(board_id nano atmega328)]] -add_arduino_executable(Header_Only_Lib ${board_id} headerOnlyTest.cpp) +arduino_cmake_project(Header_Only_Lib BOARD_NAME nano BOARD_CPU atmega328) + +add_arduino_executable(Header_Only_Lib headerOnlyTest.cpp) # Find the library by 'tricking' the framework to use current directory as the Sketchbook path, # allowing us to use the 'find' API set(ARDUINO_CMAKE_SKETCHBOOK_PATH "${CMAKE_CURRENT_LIST_DIR}") -find_arduino_library(headerTest test-lib ${board_id} 3RD_PARTY HEADER_ONLY) +find_arduino_library(headerTest test-lib 3RD_PARTY HEADER_ONLY) link_arduino_library(Header_Only_Lib headerTest HEADER_ONLY) diff --git a/examples/hello-world/CMakeLists.txt b/examples/hello-world/CMakeLists.txt index deb7c4b..61961fb 100644 --- a/examples/hello-world/CMakeLists.txt +++ b/examples/hello-world/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 3.8.2) -project(Hello_World) -get_board_id(board_id nano atmega328) +#project(Hello_World) +#get_board_id(board_id nano atmega328) + +arduino_cmake_project(Hello_World BOARD_NAME nano BOARD_CPU atmega328) add_arduino_executable(Hello_World ${board_id} helloWorld.cpp) diff --git a/examples/misc/CMakeLists.txt b/examples/misc/CMakeLists.txt index 7094aa9..07dd26c 100644 --- a/examples/misc/CMakeLists.txt +++ b/examples/misc/CMakeLists.txt @@ -1,5 +1,3 @@ cmake_minimum_required(VERSION 3.8.2) -project(NONE) - add_subdirectory(libraries) diff --git a/examples/misc/libraries/CMakeLists.txt b/examples/misc/libraries/CMakeLists.txt index 31e79e6..1285af1 100644 --- a/examples/misc/libraries/CMakeLists.txt +++ b/examples/misc/libraries/CMakeLists.txt @@ -1,5 +1,3 @@ cmake_minimum_required(VERSION 3.8.2) -project(NONE) - add_subdirectory(late-sources-library) diff --git a/examples/misc/libraries/late-sources-library/CMakeLists.txt b/examples/misc/libraries/late-sources-library/CMakeLists.txt index a3df1c8..8988a39 100644 --- a/examples/misc/libraries/late-sources-library/CMakeLists.txt +++ b/examples/misc/libraries/late-sources-library/CMakeLists.txt @@ -1,16 +1,17 @@ cmake_minimum_required(VERSION 3.8.2) -project(Late_Source_Library) +#[[project(Late_Source_Library) +get_board_id(board_id nano atmega328)]] -get_board_id(board_id nano atmega328) +arduino_cmake_project(Late_Source_Library BOARD_NAME nano BOARD_CPU atmega328) # Explictly/Manually add a library without any sources at this stage -add_arduino_library(adafruit_NeoPixel_Late ${board_id}) +add_arduino_library(adafruit_NeoPixel_Late) -add_arduino_executable(Late_Source_Library ${board_id} late-sources-lib.cpp) +add_arduino_executable(Late_Source_Library late-sources-lib.cpp) # Complete required sources for the library that was manaully created earlier target_sources(adafruit_NeoPixel_Late PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp) target_include_directories(adafruit_NeoPixel_Late PUBLIC Adafruit_NeoPixel) -link_arduino_library(Late_Source_Library adafruit_NeoPixel_Late ${board_id}) +link_arduino_library(Late_Source_Library adafruit_NeoPixel_Late) diff --git a/examples/platform-library/CMakeLists.txt b/examples/platform-library/CMakeLists.txt index c6fe6ef..905ac21 100644 --- a/examples/platform-library/CMakeLists.txt +++ b/examples/platform-library/CMakeLists.txt @@ -1,9 +1,11 @@ cmake_minimum_required(VERSION 3.8.2) -project(Platform_Library) -get_board_id(board_id nano atmega328) +#[[project(Platform_Library) +get_board_id(board_id nano atmega328)]] -add_arduino_executable(Platform_Library ${board_id} platformLibrary.cpp) +arduino_cmake_project(Platform_Library BOARD_NAME nano BOARD_CPU atmega328) -link_platform_library(Platform_Library Wire ${board_id}) -link_platform_library(Platform_Library SPI ${board_id}) +add_arduino_executable(Platform_Library platformLibrary.cpp) + +link_platform_library(Platform_Library Wire) +link_platform_library(Platform_Library SPI) diff --git a/examples/servo-knob-example/CMakeLists.txt b/examples/servo-knob-example/CMakeLists.txt index 87c4280..311dac4 100644 --- a/examples/servo-knob-example/CMakeLists.txt +++ b/examples/servo-knob-example/CMakeLists.txt @@ -1,8 +1,9 @@ cmake_minimum_required(VERSION 3.8.2) -project(Knob_Example) +#[[project(Knob_Example) +get_board_id(board_id nano atmega328)]] -get_board_id(board_id nano atmega328) +arduino_cmake_project(Knob_Example BOARD_NAME nano BOARD_CPU atmega328) -find_arduino_library(servo_example_lib Servo ${board_id}) +find_arduino_library(servo_example_lib Servo) add_arduino_library_example(Knob_Example servo_example_lib Servo Knob) diff --git a/examples/sketch/CMakeLists.txt b/examples/sketch/CMakeLists.txt index 32ae6c7..647aea4 100644 --- a/examples/sketch/CMakeLists.txt +++ b/examples/sketch/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 3.8.2) -project(Sketch) -get_board_id(board_id nano atmega328) +#[[project(Sketch) +get_board_id(board_id nano atmega328)]] -add_arduino_executable(Sketch ${board_id}) +arduino_cmake_project(Sketch BOARD_NAME nano BOARD_CPU atmega328) + +add_arduino_executable(Sketch) target_sketches(Sketch sketch1.ino sketch2.pde) From 557111f2189f526fbcf05f25ff8a521734eed2d6 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sat, 23 Feb 2019 15:56:55 +0200 Subject: [PATCH 07/12] Rephrased message upon missing library props file --- .../Libraries/LibrarySourcesArchitectureResolver.cmake | 3 --- cmake/Platform/Utilities/LibraryUtils.cmake | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/Platform/Libraries/LibrarySourcesArchitectureResolver.cmake b/cmake/Platform/Libraries/LibrarySourcesArchitectureResolver.cmake index 137882f..e01afde 100644 --- a/cmake/Platform/Libraries/LibrarySourcesArchitectureResolver.cmake +++ b/cmake/Platform/Libraries/LibrarySourcesArchitectureResolver.cmake @@ -41,9 +41,6 @@ function(resolve_library_architecture _library_sources _return_var) set(lib_props_file ${parsed_args_LIB_PROPS_FILE}) else () - # Warn user and assume library is arch-agnostic - message(STATUS "Library's properties file can't be found under its' root directory.\n\t" - "Assuming the library is architecture-agnostic (supports all architectures)") set(${_return_var} "${_library_sources}" PARENT_SCOPE) return() diff --git a/cmake/Platform/Utilities/LibraryUtils.cmake b/cmake/Platform/Utilities/LibraryUtils.cmake index ce3b912..b9f22dc 100644 --- a/cmake/Platform/Utilities/LibraryUtils.cmake +++ b/cmake/Platform/Utilities/LibraryUtils.cmake @@ -19,7 +19,8 @@ function(get_library_properties_file _library_root_directory _return_var) set(lib_props_file ${absolute_lib_root_dir}/${ARDUINO_CMAKE_LIBRARY_PROPERTIES_FILE_NAME}) if (NOT EXISTS ${lib_props_file}) - message(STATUS "Library's properties file doesn't exist under the given root directory.\n\t" + message(STATUS "Library's properties file doesn't exist under the given root directory, " + "assuming it's architecture-agnostic (supports all architectures)\n\t" "Root directory: ${absolute_lib_root_dir}") return() endif () From fe7d11641ee3c42bfcb92090fc018dbdabf17d12 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sat, 23 Feb 2019 15:59:24 +0200 Subject: [PATCH 08/12] Removed leftovers from global-board changes --- examples/3rd-party-library/CMakeLists.txt | 3 --- examples/arduino-library/CMakeLists.txt | 2 -- examples/blink-example/CMakeLists.txt | 2 -- examples/header-only-library/CMakeLists.txt | 2 -- examples/misc/libraries/late-sources-library/CMakeLists.txt | 2 -- examples/platform-library/CMakeLists.txt | 2 -- examples/servo-knob-example/CMakeLists.txt | 2 -- examples/sketch/CMakeLists.txt | 2 -- 8 files changed, 17 deletions(-) diff --git a/examples/3rd-party-library/CMakeLists.txt b/examples/3rd-party-library/CMakeLists.txt index 146e4d7..f9888f6 100644 --- a/examples/3rd-party-library/CMakeLists.txt +++ b/examples/3rd-party-library/CMakeLists.txt @@ -1,8 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(3rd_Party_Arduino_Library) -get_board_id(board_id nano atmega328)]] - arduino_cmake_project(3rd_Party_Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) # First, declare and create our executable - It'll use 4 sources diff --git a/examples/arduino-library/CMakeLists.txt b/examples/arduino-library/CMakeLists.txt index a4e4f52..ad4bc25 100644 --- a/examples/arduino-library/CMakeLists.txt +++ b/examples/arduino-library/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Arduino_Library) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/blink-example/CMakeLists.txt b/examples/blink-example/CMakeLists.txt index b82b92e..2ea104d 100644 --- a/examples/blink-example/CMakeLists.txt +++ b/examples/blink-example/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Blink_Example) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Blink_Example BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/header-only-library/CMakeLists.txt b/examples/header-only-library/CMakeLists.txt index e6bc08f..e0f4693 100644 --- a/examples/header-only-library/CMakeLists.txt +++ b/examples/header-only-library/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Header_Only_Lib) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Header_Only_Lib BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/misc/libraries/late-sources-library/CMakeLists.txt b/examples/misc/libraries/late-sources-library/CMakeLists.txt index 8988a39..7f37e0f 100644 --- a/examples/misc/libraries/late-sources-library/CMakeLists.txt +++ b/examples/misc/libraries/late-sources-library/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Late_Source_Library) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Late_Source_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/platform-library/CMakeLists.txt b/examples/platform-library/CMakeLists.txt index 905ac21..618098b 100644 --- a/examples/platform-library/CMakeLists.txt +++ b/examples/platform-library/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Platform_Library) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Platform_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/servo-knob-example/CMakeLists.txt b/examples/servo-knob-example/CMakeLists.txt index 311dac4..6ced3d4 100644 --- a/examples/servo-knob-example/CMakeLists.txt +++ b/examples/servo-knob-example/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Knob_Example) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Knob_Example BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/sketch/CMakeLists.txt b/examples/sketch/CMakeLists.txt index 647aea4..c651f1a 100644 --- a/examples/sketch/CMakeLists.txt +++ b/examples/sketch/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.8.2) -#[[project(Sketch) -get_board_id(board_id nano atmega328)]] arduino_cmake_project(Sketch BOARD_NAME nano BOARD_CPU atmega328) From 0ebb7d9648641319dcd525132e9202bb1535bbb1 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sun, 24 Feb 2019 20:54:57 +0200 Subject: [PATCH 09/12] Implemented global CoreLib mechanism It maintains the concept where a single, unique target exists for each board ID. --- cmake/Platform/Other/TargetFlagsManager.cmake | 6 +-- cmake/Platform/Project/BoardSetup.cmake | 2 +- cmake/Platform/Project/CoreLibSetup.cmake | 14 ++++++ cmake/Platform/Project/Project.cmake | 3 +- cmake/Platform/Project/ProjectSetup.cmake | 17 +++++++ cmake/Platform/Project/Setup.cmake | 9 ---- .../Targets/ArduinoCMakeLibraryTarget.cmake | 5 +- .../Targets/ArduinoLibraryTarget.cmake | 14 +----- cmake/Platform/Targets/CoreLibTarget.cmake | 47 +++++++------------ cmake/Platform/Targets/ExecutableTarget.cmake | 5 +- .../Targets/PlatformLibraryTarget.cmake | 4 +- cmake/Platform/Utilities/StringUtils.cmake | 4 +- 12 files changed, 63 insertions(+), 67 deletions(-) create mode 100644 cmake/Platform/Project/CoreLibSetup.cmake create mode 100644 cmake/Platform/Project/ProjectSetup.cmake delete mode 100644 cmake/Platform/Project/Setup.cmake diff --git a/cmake/Platform/Other/TargetFlagsManager.cmake b/cmake/Platform/Other/TargetFlagsManager.cmake index 76f1ce2..537d4d5 100644 --- a/cmake/Platform/Other/TargetFlagsManager.cmake +++ b/cmake/Platform/Other/TargetFlagsManager.cmake @@ -9,7 +9,7 @@ function(_set_target_language_flags _target_name _language _scope) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_target_name} TYPE) - parse_compiler_recipe_flags(${ARDUINO_CMAKE_PROJECT_BOARD} compiler_recipe_flags LANGUAGE "${_language}") + parse_compiler_recipe_flags(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} compiler_recipe_flags LANGUAGE "${_language}") target_compile_options(${_target_name} ${_scope} $<$:${compiler_recipe_flags}>) @@ -52,7 +52,7 @@ function(set_target_linker_flags _target_name) # Infer target's type and act differently if it's an interface-library get_target_property(target_type ${_target_name} TYPE) - parse_linker_recpie_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} linker_recipe_flags) + parse_linker_recpie_pattern(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} linker_recipe_flags) string(REPLACE ";" " " cmake_compliant_linker_flags "${linker_recipe_flags}") @@ -84,7 +84,7 @@ endfunction() function(set_upload_target_flags _target_name _upload_port _return_var) # Parse and append recipe flags - parse_upload_recipe_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} "${_upload_port}" upload_recipe_flags) + parse_upload_recipe_pattern(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} "${_upload_port}" upload_recipe_flags) list(APPEND upload_flags "${upload_recipe_flags}") set(target_binary_base_path "${CMAKE_CURRENT_BINARY_DIR}/${_target_name}") diff --git a/cmake/Platform/Project/BoardSetup.cmake b/cmake/Platform/Project/BoardSetup.cmake index 1e722fd..aadf687 100644 --- a/cmake/Platform/Project/BoardSetup.cmake +++ b/cmake/Platform/Project/BoardSetup.cmake @@ -8,7 +8,7 @@ function(setup_project_board) get_board_id(board_id ${parsed_args_BOARD_NAME} ${parsed_args_BOARD_CPU}) - set(ARDUINO_CMAKE_PROJECT_BOARD ${board_id} CACHE STRING "Project-Wide board ID") + set(PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD ${board_id} CACHE STRING "Project-Global board ID") endif () diff --git a/cmake/Platform/Project/CoreLibSetup.cmake b/cmake/Platform/Project/CoreLibSetup.cmake new file mode 100644 index 0000000..05a152b --- /dev/null +++ b/cmake/Platform/Project/CoreLibSetup.cmake @@ -0,0 +1,14 @@ +function(setup_project_core_lib) + + # Guard against redefiniton of the Core Lib target + if (NOT TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) + + add_arduino_core_lib(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} target_name) + + # Define a global way to access Core Lib's target name + set(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET ${target_name} + CACHE STRING "Project-Global CoreLib target name") + + endif () + +endfunction() diff --git a/cmake/Platform/Project/Project.cmake b/cmake/Platform/Project/Project.cmake index 3e4985b..5e1cbe3 100644 --- a/cmake/Platform/Project/Project.cmake +++ b/cmake/Platform/Project/Project.cmake @@ -1,2 +1,3 @@ include(BoardSetup) -include(Setup) +include(CoreLibSetup) +include(ProjectSetup) diff --git a/cmake/Platform/Project/ProjectSetup.cmake b/cmake/Platform/Project/ProjectSetup.cmake new file mode 100644 index 0000000..51fcd33 --- /dev/null +++ b/cmake/Platform/Project/ProjectSetup.cmake @@ -0,0 +1,17 @@ +function(arduino_cmake_project _project_name) + + # Define internal variable to store the project's name, twice: + # 1. Define in parent scope as if it were defined by the CMakeLists.txt file that called this function + # 2. Define as a standard local variable so that functions called below also can use this variable + # It helps ensure each "sub-project" can actually exists separately from the others, + # as is the case with the examples of the framework. + # All of this is done because CMake's `project()` function doesn't maintain scope properly, + # thus a custom one is needed. + set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} PARENT_SCOPE) + set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name}) + + setup_project_board(${ARGN}) + + setup_project_core_lib() + +endfunction() diff --git a/cmake/Platform/Project/Setup.cmake b/cmake/Platform/Project/Setup.cmake deleted file mode 100644 index c3ec332..0000000 --- a/cmake/Platform/Project/Setup.cmake +++ /dev/null @@ -1,9 +0,0 @@ -function(arduino_cmake_project _project_name) - - project(${_project_name}) - - set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} CACHE STRING "Current project name") - - setup_project_board(${ARGN}) - -endfunction() diff --git a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake index 86b8ff6..9bb0b04 100644 --- a/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake @@ -40,8 +40,7 @@ endfunction() # _target_name - Name of the target to link against. # _library_name - Name of the library target to link. # [PRIVATE|PUBLIC|INTERFACE] - Optional link scope for the internally linked Core-Lib. -# [BOARD_CORE_TARGET] - Optional target name of the Core Lib to use. -# Use when the target is a library. +# [BOARD_CORE_TARGET] - Optional target name of the Core Lib to use. Use when the target is a library. #=============================================================================# function(_link_arduino_cmake_library _target_name _library_name) @@ -56,7 +55,7 @@ function(_link_arduino_cmake_library _target_name _library_name) if (parsed_args_BOARD_CORE_TARGET) set(core_target ${parsed_args_BOARD_CORE_TARGET}) else () - set(core_target ${${_target_name}_CORE_LIB_TARGET}) + set(core_target ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) endif () get_target_property(core_lib_includes ${core_target} INCLUDE_DIRECTORIES) diff --git a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake index 2627c15..be472cd 100644 --- a/cmake/Platform/Targets/ArduinoLibraryTarget.cmake +++ b/cmake/Platform/Targets/ArduinoLibraryTarget.cmake @@ -14,7 +14,6 @@ function(add_arduino_library _target_name) get_sources_root_directory("${parsed_sources}" library_root_dir) get_library_properties_file(${library_root_dir} library_properties_file) - if (library_properties_file) # Properties file has been found resolve_library_architecture("${parsed_sources}" arch_resolved_sources LIB_PROPS_FILE ${library_properties_file}) @@ -25,9 +24,7 @@ function(add_arduino_library _target_name) _add_arduino_cmake_library(${_target_name} "${arch_resolved_sources}") else() # No sources have been provided at this stage, simply create a library target - _add_arduino_cmake_library(${_target_name} "") - endif() find_dependent_platform_libraries("${arch_resolved_sources}" lib_platform_libs) @@ -67,15 +64,6 @@ function(link_arduino_library _target_name _library_target_name) message(FATAL_ERROR "Library target doesn't exist - It must be created first!") endif () - - # Get the name of the Core-Lib target associated with the targets' 'board_id' - generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) - - if (NOT TARGET ${core_lib_target}) - message(FATAL_ERROR "Core Library target doesn't exist. " - "This is bad and should be reported") - endif () - # Infer scope if (parsed_args_HEADER_ONLY) set(scope INTERFACE) @@ -85,6 +73,6 @@ function(link_arduino_library _target_name _library_target_name) _link_arduino_cmake_library(${_target_name} ${_library_target_name} ${scope} - BOARD_CORE_TARGET ${core_lib_target}) + BOARD_CORE_TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) endfunction() diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index 2dc33fd..e54db50 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -73,46 +73,35 @@ endfunction() #=============================================================================# # Adds/Creates a static library target for Arduino's core library (Core-Lib), # required by every arduino target. -# _target_name - Name of the Application/Executable target created earlier. # _board_id - Board to create the core library for. # Note that each board has a unique version of the library. +# _return_var - Name of variable in parent-scope holding the return value. +# Returns - Generated Core-lib's target name. #=============================================================================# -function(add_arduino_core_lib _target_name) - - generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) - - if (TARGET ${core_lib_target}) # Core-lib target already created for the given board - if (TARGET ${_target_name}) # Executable/Firmware target also exists - target_link_libraries(${_target_name} PUBLIC ${core_lib_target}) - endif () +function(add_arduino_core_lib _board_id _return_var) - else () # Core-Lib target needs to be created + generate_core_lib_target_name(${_board_id} core_lib_target) - _get_board_core(${ARDUINO_CMAKE_PROJECT_BOARD} board_core) # Get board's core - _get_board_variant(${ARDUINO_CMAKE_PROJECT_BOARD} board_variant) # Get board's variant + _get_board_core(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_core) # Get board's core + _get_board_variant(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_variant) # Get board's variant - # Find sources in core directory and add the library target - find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) + # Find sources in core directory and add the library target + find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) - if (CMAKE_HOST_UNIX) - if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN) - list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*") - endif () + if (CMAKE_HOST_UNIX) + if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN) + list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*") endif () + endif () - add_library(${core_lib_target} STATIC "${core_sources}") - - # Include platform's core and variant directories - target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") - target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") + add_library(${core_lib_target} STATIC "${core_sources}") - _set_core_lib_flags(${core_lib_target}) + # Include platform's core and variant directories + target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") + target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") - # Link Core-Lib to executable target - if (TARGET ${_target_name}) - target_link_libraries(${_target_name} PUBLIC "${core_lib_target}") - endif () + _set_core_lib_flags(${core_lib_target}) - endif () + set(${_return_var} ${core_lib_target} PARENT_SCOPE) endfunction() diff --git a/cmake/Platform/Targets/ExecutableTarget.cmake b/cmake/Platform/Targets/ExecutableTarget.cmake index e9b8fc7..95b3c9e 100644 --- a/cmake/Platform/Targets/ExecutableTarget.cmake +++ b/cmake/Platform/Targets/ExecutableTarget.cmake @@ -11,8 +11,7 @@ function(add_arduino_executable _target_name) add_executable(${_target_name} "${sources}") - # Always add board's core lib - add_arduino_core_lib(${_target_name}) + target_link_libraries(${_target_name} PRIVATE ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) # Add compiler and linker flags set_executable_target_flags(${_target_name}) @@ -38,7 +37,7 @@ function(add_arduino_executable _target_name) VERBATIM) # Required for avr-size - get_board_property(${ARDUINO_CMAKE_PROJECT_BOARD} build.mcu board_mcu) + get_board_property(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} build.mcu board_mcu) set(avr_size_script "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake") diff --git a/cmake/Platform/Targets/PlatformLibraryTarget.cmake b/cmake/Platform/Targets/PlatformLibraryTarget.cmake index 53b2007..c0b9049 100644 --- a/cmake/Platform/Targets/PlatformLibraryTarget.cmake +++ b/cmake/Platform/Targets/PlatformLibraryTarget.cmake @@ -55,11 +55,9 @@ function(link_platform_library _target_name _platform_library_name) _add_platform_library(${_platform_library_name}) - generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target) - _link_arduino_cmake_library(${_target_name} ${_platform_library_name} ${scope} - BOARD_CORE_TARGET ${core_lib_target}) + BOARD_CORE_TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) else () target_link_libraries(${_target_name} ${scope} ${_platform_library_name}) diff --git a/cmake/Platform/Utilities/StringUtils.cmake b/cmake/Platform/Utilities/StringUtils.cmake index 795ef26..c4b599f 100644 --- a/cmake/Platform/Utilities/StringUtils.cmake +++ b/cmake/Platform/Utilities/StringUtils.cmake @@ -63,9 +63,9 @@ function(generate_core_lib_target_name _board_id _return_var) string(REPLACE "." "_" board_id "${_board_id}") - set(core_lib_target_name "${board_id}_core_lib") + string(TOLOWER "${board_id}" board_id) - string(TOLOWER "${core_lib_target_name}" core_lib_target_name) + set(core_lib_target_name "${board_id}_Core_Lib") set(${_return_var} ${core_lib_target_name} PARENT_SCOPE) From fb85d62f0f9106f757910f520e0c34f548b80c9c Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sun, 24 Feb 2019 21:00:25 +0200 Subject: [PATCH 10/12] Returned `project()` calls to examples just in case Although not mandatory under the circumstances of the framework's 'Examples' root-project, it's required for every project users will use. It's best to simply add the call rather than hide it and confuse them. --- examples/3rd-party-library/CMakeLists.txt | 2 ++ examples/arduino-library/CMakeLists.txt | 1 + examples/blink-example/CMakeLists.txt | 1 + examples/header-only-library/CMakeLists.txt | 1 + examples/hello-world/CMakeLists.txt | 2 +- examples/misc/libraries/late-sources-library/CMakeLists.txt | 1 + examples/platform-library/CMakeLists.txt | 1 + examples/servo-knob-example/CMakeLists.txt | 1 + examples/sketch/CMakeLists.txt | 1 + 9 files changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/3rd-party-library/CMakeLists.txt b/examples/3rd-party-library/CMakeLists.txt index f9888f6..0e4d67f 100644 --- a/examples/3rd-party-library/CMakeLists.txt +++ b/examples/3rd-party-library/CMakeLists.txt @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.8.2) +project(3rd_Party_Arduino_Library) + arduino_cmake_project(3rd_Party_Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) # First, declare and create our executable - It'll use 4 sources diff --git a/examples/arduino-library/CMakeLists.txt b/examples/arduino-library/CMakeLists.txt index ad4bc25..911dbbe 100644 --- a/examples/arduino-library/CMakeLists.txt +++ b/examples/arduino-library/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Arduino_Library) arduino_cmake_project(Arduino_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/blink-example/CMakeLists.txt b/examples/blink-example/CMakeLists.txt index 2ea104d..f806616 100644 --- a/examples/blink-example/CMakeLists.txt +++ b/examples/blink-example/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Blink_Example) arduino_cmake_project(Blink_Example BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/header-only-library/CMakeLists.txt b/examples/header-only-library/CMakeLists.txt index e0f4693..5d8a34a 100644 --- a/examples/header-only-library/CMakeLists.txt +++ b/examples/header-only-library/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Header_Only_Lib) arduino_cmake_project(Header_Only_Lib BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/hello-world/CMakeLists.txt b/examples/hello-world/CMakeLists.txt index 61961fb..219a084 100644 --- a/examples/hello-world/CMakeLists.txt +++ b/examples/hello-world/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) -#project(Hello_World) +project(Hello_World) #get_board_id(board_id nano atmega328) arduino_cmake_project(Hello_World BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/misc/libraries/late-sources-library/CMakeLists.txt b/examples/misc/libraries/late-sources-library/CMakeLists.txt index 7f37e0f..14b009c 100644 --- a/examples/misc/libraries/late-sources-library/CMakeLists.txt +++ b/examples/misc/libraries/late-sources-library/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Late_Source_Library) arduino_cmake_project(Late_Source_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/platform-library/CMakeLists.txt b/examples/platform-library/CMakeLists.txt index 618098b..2c9e395 100644 --- a/examples/platform-library/CMakeLists.txt +++ b/examples/platform-library/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Platform_Library) arduino_cmake_project(Platform_Library BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/servo-knob-example/CMakeLists.txt b/examples/servo-knob-example/CMakeLists.txt index 6ced3d4..ee5c0c1 100644 --- a/examples/servo-knob-example/CMakeLists.txt +++ b/examples/servo-knob-example/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Knob_Example) arduino_cmake_project(Knob_Example BOARD_NAME nano BOARD_CPU atmega328) diff --git a/examples/sketch/CMakeLists.txt b/examples/sketch/CMakeLists.txt index c651f1a..3ca58a5 100644 --- a/examples/sketch/CMakeLists.txt +++ b/examples/sketch/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.8.2) +project(Sketch) arduino_cmake_project(Sketch BOARD_NAME nano BOARD_CPU atmega328) From a25cb5d3106e5e65aea8c291b453ca7a40bf2c6d Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sun, 24 Feb 2019 21:43:45 +0200 Subject: [PATCH 11/12] Cleaned project setup module a bit --- cmake/Platform/Project/BoardSetup.cmake | 4 ++-- cmake/Platform/Project/CoreLibSetup.cmake | 8 ++++---- cmake/Platform/Project/ProjectSetup.cmake | 13 +++++-------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/cmake/Platform/Project/BoardSetup.cmake b/cmake/Platform/Project/BoardSetup.cmake index aadf687..2994540 100644 --- a/cmake/Platform/Project/BoardSetup.cmake +++ b/cmake/Platform/Project/BoardSetup.cmake @@ -1,4 +1,4 @@ -function(setup_project_board) +function(setup_project_board _project_name) cmake_parse_arguments(parsed_args "" "BOARD_NAME;BOARD_CPU" "" ${ARGV}) @@ -8,7 +8,7 @@ function(setup_project_board) get_board_id(board_id ${parsed_args_BOARD_NAME} ${parsed_args_BOARD_CPU}) - set(PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD ${board_id} CACHE STRING "Project-Global board ID") + set(PROJECT_${_project_name}_BOARD ${board_id} CACHE STRING "Project-Global board ID") endif () diff --git a/cmake/Platform/Project/CoreLibSetup.cmake b/cmake/Platform/Project/CoreLibSetup.cmake index 05a152b..efa1bf0 100644 --- a/cmake/Platform/Project/CoreLibSetup.cmake +++ b/cmake/Platform/Project/CoreLibSetup.cmake @@ -1,12 +1,12 @@ -function(setup_project_core_lib) +function(setup_project_core_lib _project_name) # Guard against redefiniton of the Core Lib target - if (NOT TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET}) + if (NOT TARGET ${${PROJECT_${_project_name}_BOARD}_CORELIB_TARGET}) - add_arduino_core_lib(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} target_name) + add_arduino_core_lib(${PROJECT_${_project_name}_BOARD} target_name) # Define a global way to access Core Lib's target name - set(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET ${target_name} + set(${PROJECT_${_project_name}_BOARD}_CORELIB_TARGET ${target_name} CACHE STRING "Project-Global CoreLib target name") endif () diff --git a/cmake/Platform/Project/ProjectSetup.cmake b/cmake/Platform/Project/ProjectSetup.cmake index 51fcd33..fa9edf0 100644 --- a/cmake/Platform/Project/ProjectSetup.cmake +++ b/cmake/Platform/Project/ProjectSetup.cmake @@ -1,17 +1,14 @@ function(arduino_cmake_project _project_name) - # Define internal variable to store the project's name, twice: - # 1. Define in parent scope as if it were defined by the CMakeLists.txt file that called this function - # 2. Define as a standard local variable so that functions called below also can use this variable - # It helps ensure each "sub-project" can actually exists separately from the others, + # Store the project's name in parent scope as if it were defined by the CMakeLists.txt file + # that called this function. It helps ensure each "sub-project" can actually exists separately from the others, # as is the case with the examples of the framework. - # All of this is done because CMake's `project()` function doesn't maintain scope properly, + # This is done because CMake's `project()` function doesn't maintain scope properly, # thus a custom one is needed. set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} PARENT_SCOPE) - set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name}) - setup_project_board(${ARGN}) + setup_project_board(${ARGN} ${_project_name}) - setup_project_core_lib() + setup_project_core_lib(${_project_name}) endfunction() From 408450f568a067ede31ae477a41dc679ebf66722 Mon Sep 17 00:00:00 2001 From: Timor Gruber Date: Sun, 24 Feb 2019 23:43:46 +0200 Subject: [PATCH 12/12] Fixed regression bug, returned 'board_id' to TargetFlags module --- .../Libraries/LibraryFlagsManager.cmake | 7 ++-- cmake/Platform/Other/TargetFlagsManager.cmake | 33 +++++++++---------- cmake/Platform/Project/ProjectSetup.cmake | 2 +- cmake/Platform/Targets/CoreLibTarget.cmake | 13 ++++---- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/cmake/Platform/Libraries/LibraryFlagsManager.cmake b/cmake/Platform/Libraries/LibraryFlagsManager.cmake index 64b2137..36be98b 100644 --- a/cmake/Platform/Libraries/LibraryFlagsManager.cmake +++ b/cmake/Platform/Libraries/LibraryFlagsManager.cmake @@ -8,12 +8,9 @@ function(set_library_flags _library_target) parse_scope_argument(scope "${ARGN}" DEFAULT_SCOPE PUBLIC) - # Infer target's type and act differently if it's an interface-library - get_target_property(target_type ${_library_target} TYPE) - - set_target_compile_flags(${_library_target} ${scope}) + set_target_compile_flags(${_library_target} ${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} ${scope}) # Set linker flags - set_target_linker_flags(${_library_target}) + set_target_linker_flags(${_library_target} ${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}) endfunction() diff --git a/cmake/Platform/Other/TargetFlagsManager.cmake b/cmake/Platform/Other/TargetFlagsManager.cmake index 537d4d5..9b8fed7 100644 --- a/cmake/Platform/Other/TargetFlagsManager.cmake +++ b/cmake/Platform/Other/TargetFlagsManager.cmake @@ -3,13 +3,11 @@ # _target_name - Name of the target (Executable or Library) to set flags on. # _language - Language for which flags are set (such as C/C++). # _scope - Flags' scope relative to outer targets (targets using the given target). +# _board_id - Board ID asociated with the target. #=============================================================================# -function(_set_target_language_flags _target_name _language _scope) +function(_set_target_language_flags _target_name _board_id _language _scope) - # Infer target's type and act differently if it's an interface-library - get_target_property(target_type ${_target_name} TYPE) - - parse_compiler_recipe_flags(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} compiler_recipe_flags LANGUAGE "${_language}") + parse_compiler_recipe_flags(${_board_id} compiler_recipe_flags LANGUAGE "${_language}") target_compile_options(${_target_name} ${_scope} $<$:${compiler_recipe_flags}>) @@ -17,27 +15,28 @@ endfunction() #=============================================================================# # Sets compiler flags on the given target, according also to the given board ID. -# _target_name - Name of the target (Executable or Library) to set flags on. +# _target_name - Name of the target (Executable or Library) to set flags on +# _board_id - Board ID asociated with the target.. #=============================================================================# -function(set_target_compile_flags _target_name) +function(set_target_compile_flags _target_name _board_id) cmake_parse_arguments(parsed_args "" "LANGUAGE" "" ${ARGN}) parse_scope_argument(scope "${ARGN}" DEFAULT_SCOPE PUBLIC) if (parsed_args_LANGUAGE) - _set_target_language_flags(${_target_name} ${parsed_args_LANGUAGE} ${scope}) + _set_target_language_flags(${_target_name} ${_board_id} ${parsed_args_LANGUAGE} ${scope}) else () # No specific language requested - Use all get_cmake_compliant_language_name(asm lang) - _set_target_language_flags(${_target_name} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) get_cmake_compliant_language_name(c lang) - _set_target_language_flags(${_target_name} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) get_cmake_compliant_language_name(cpp lang) - _set_target_language_flags(${_target_name} ${lang} ${scope}) + _set_target_language_flags(${_target_name} ${_board_id} ${lang} ${scope}) endif () @@ -46,13 +45,11 @@ endfunction() #=============================================================================# # Sets linker flags on the given target, according also to the given board ID. # _target_name - Name of the target (Executable or Library) to set flags on. +# _board_id - Board ID asociated with the target. #=============================================================================# -function(set_target_linker_flags _target_name) - - # Infer target's type and act differently if it's an interface-library - get_target_property(target_type ${_target_name} TYPE) +function(set_target_linker_flags _target_name _board_id) - parse_linker_recpie_pattern(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} linker_recipe_flags) + parse_linker_recpie_pattern(${_board_id} linker_recipe_flags) string(REPLACE ";" " " cmake_compliant_linker_flags "${linker_recipe_flags}") @@ -67,8 +64,8 @@ endfunction() #=============================================================================# function(set_executable_target_flags _target_name) - set_target_compile_flags(${_target_name}) - set_target_linker_flags(${_target_name}) + set_target_compile_flags(${_target_name} ${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}) + set_target_linker_flags(${_target_name} ${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}) target_link_libraries(${_target_name} PUBLIC m) # Add math library diff --git a/cmake/Platform/Project/ProjectSetup.cmake b/cmake/Platform/Project/ProjectSetup.cmake index fa9edf0..732a688 100644 --- a/cmake/Platform/Project/ProjectSetup.cmake +++ b/cmake/Platform/Project/ProjectSetup.cmake @@ -7,7 +7,7 @@ function(arduino_cmake_project _project_name) # thus a custom one is needed. set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} PARENT_SCOPE) - setup_project_board(${ARGN} ${_project_name}) + setup_project_board(${_project_name} ${ARGN}) setup_project_core_lib(${_project_name}) diff --git a/cmake/Platform/Targets/CoreLibTarget.cmake b/cmake/Platform/Targets/CoreLibTarget.cmake index e54db50..8951d91 100644 --- a/cmake/Platform/Targets/CoreLibTarget.cmake +++ b/cmake/Platform/Targets/CoreLibTarget.cmake @@ -62,11 +62,12 @@ endfunction() # Sets compiler and linker flags on the given Core-Lib target. # Changes are kept even outside the scope of the function since they apply on a target. # _core_target_name - Name of the Core-Lib target. +# _board_id - Board ID asociated with the target. #=============================================================================# -function(_set_core_lib_flags _core_target_name) +function(_set_core_lib_flags _core_target_name _board_id) - set_target_compile_flags(${_core_target_name} PUBLIC) - set_target_linker_flags(${_core_target_name}) + set_target_compile_flags(${_core_target_name} ${_board_id} PUBLIC) + set_target_linker_flags(${_core_target_name} ${_board_id}) endfunction() @@ -82,8 +83,8 @@ function(add_arduino_core_lib _board_id _return_var) generate_core_lib_target_name(${_board_id} core_lib_target) - _get_board_core(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_core) # Get board's core - _get_board_variant(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_variant) # Get board's variant + _get_board_core(${_board_id} board_core) # Get board's core + _get_board_variant(${_board_id} board_variant) # Get board's variant # Find sources in core directory and add the library target find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources) @@ -100,7 +101,7 @@ function(add_arduino_core_lib _board_id _return_var) target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}") target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}") - _set_core_lib_flags(${core_lib_target}) + _set_core_lib_flags(${core_lib_target} ${_board_id}) set(${_return_var} ${core_lib_target} PARENT_SCOPE)