Skip to content
This repository was archived by the owner on Apr 17, 2023. It is now read-only.

Commit 0ebb7d9

Browse files
committed
Implemented global CoreLib mechanism
It maintains the concept where a single, unique target exists for each board ID.
1 parent fe7d116 commit 0ebb7d9

12 files changed

+63
-67
lines changed

cmake/Platform/Other/TargetFlagsManager.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function(_set_target_language_flags _target_name _language _scope)
99
# Infer target's type and act differently if it's an interface-library
1010
get_target_property(target_type ${_target_name} TYPE)
1111

12-
parse_compiler_recipe_flags(${ARDUINO_CMAKE_PROJECT_BOARD} compiler_recipe_flags LANGUAGE "${_language}")
12+
parse_compiler_recipe_flags(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} compiler_recipe_flags LANGUAGE "${_language}")
1313

1414
target_compile_options(${_target_name} ${_scope} $<$<COMPILE_LANGUAGE:${_language}>:${compiler_recipe_flags}>)
1515

@@ -52,7 +52,7 @@ function(set_target_linker_flags _target_name)
5252
# Infer target's type and act differently if it's an interface-library
5353
get_target_property(target_type ${_target_name} TYPE)
5454

55-
parse_linker_recpie_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} linker_recipe_flags)
55+
parse_linker_recpie_pattern(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} linker_recipe_flags)
5656

5757
string(REPLACE ";" " " cmake_compliant_linker_flags "${linker_recipe_flags}")
5858

@@ -84,7 +84,7 @@ endfunction()
8484
function(set_upload_target_flags _target_name _upload_port _return_var)
8585

8686
# Parse and append recipe flags
87-
parse_upload_recipe_pattern(${ARDUINO_CMAKE_PROJECT_BOARD} "${_upload_port}" upload_recipe_flags)
87+
parse_upload_recipe_pattern(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} "${_upload_port}" upload_recipe_flags)
8888
list(APPEND upload_flags "${upload_recipe_flags}")
8989

9090
set(target_binary_base_path "${CMAKE_CURRENT_BINARY_DIR}/${_target_name}")

cmake/Platform/Project/BoardSetup.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function(setup_project_board)
88

99
get_board_id(board_id ${parsed_args_BOARD_NAME} ${parsed_args_BOARD_CPU})
1010

11-
set(ARDUINO_CMAKE_PROJECT_BOARD ${board_id} CACHE STRING "Project-Wide board ID")
11+
set(PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD ${board_id} CACHE STRING "Project-Global board ID")
1212

1313
endif ()
1414

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function(setup_project_core_lib)
2+
3+
# Guard against redefiniton of the Core Lib target
4+
if (NOT TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET})
5+
6+
add_arduino_core_lib(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} target_name)
7+
8+
# Define a global way to access Core Lib's target name
9+
set(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET ${target_name}
10+
CACHE STRING "Project-Global CoreLib target name")
11+
12+
endif ()
13+
14+
endfunction()
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
include(BoardSetup)
2-
include(Setup)
2+
include(CoreLibSetup)
3+
include(ProjectSetup)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function(arduino_cmake_project _project_name)
2+
3+
# Define internal variable to store the project's name, twice:
4+
# 1. Define in parent scope as if it were defined by the CMakeLists.txt file that called this function
5+
# 2. Define as a standard local variable so that functions called below also can use this variable
6+
# It helps ensure each "sub-project" can actually exists separately from the others,
7+
# as is the case with the examples of the framework.
8+
# All of this is done because CMake's `project()` function doesn't maintain scope properly,
9+
# thus a custom one is needed.
10+
set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name} PARENT_SCOPE)
11+
set(ARDUINO_CMAKE_PROJECT_NAME ${_project_name})
12+
13+
setup_project_board(${ARGN})
14+
15+
setup_project_core_lib()
16+
17+
endfunction()

cmake/Platform/Project/Setup.cmake

Lines changed: 0 additions & 9 deletions
This file was deleted.

cmake/Platform/Targets/ArduinoCMakeLibraryTarget.cmake

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ endfunction()
4040
# _target_name - Name of the target to link against.
4141
# _library_name - Name of the library target to link.
4242
# [PRIVATE|PUBLIC|INTERFACE] - Optional link scope for the internally linked Core-Lib.
43-
# [BOARD_CORE_TARGET] - Optional target name of the Core Lib to use.
44-
# Use when the target is a library.
43+
# [BOARD_CORE_TARGET] - Optional target name of the Core Lib to use. Use when the target is a library.
4544
#=============================================================================#
4645
function(_link_arduino_cmake_library _target_name _library_name)
4746

@@ -56,7 +55,7 @@ function(_link_arduino_cmake_library _target_name _library_name)
5655
if (parsed_args_BOARD_CORE_TARGET)
5756
set(core_target ${parsed_args_BOARD_CORE_TARGET})
5857
else ()
59-
set(core_target ${${_target_name}_CORE_LIB_TARGET})
58+
set(core_target ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET})
6059
endif ()
6160

6261
get_target_property(core_lib_includes ${core_target} INCLUDE_DIRECTORIES)

cmake/Platform/Targets/ArduinoLibraryTarget.cmake

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ function(add_arduino_library _target_name)
1414
get_sources_root_directory("${parsed_sources}" library_root_dir)
1515

1616
get_library_properties_file(${library_root_dir} library_properties_file)
17-
1817
if (library_properties_file) # Properties file has been found
1918
resolve_library_architecture("${parsed_sources}" arch_resolved_sources
2019
LIB_PROPS_FILE ${library_properties_file})
@@ -25,9 +24,7 @@ function(add_arduino_library _target_name)
2524
_add_arduino_cmake_library(${_target_name} "${arch_resolved_sources}")
2625

2726
else() # No sources have been provided at this stage, simply create a library target
28-
2927
_add_arduino_cmake_library(${_target_name} "")
30-
3128
endif()
3229

3330
find_dependent_platform_libraries("${arch_resolved_sources}" lib_platform_libs)
@@ -67,15 +64,6 @@ function(link_arduino_library _target_name _library_target_name)
6764
message(FATAL_ERROR "Library target doesn't exist - It must be created first!")
6865
endif ()
6966

70-
71-
# Get the name of the Core-Lib target associated with the targets' 'board_id'
72-
generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target)
73-
74-
if (NOT TARGET ${core_lib_target})
75-
message(FATAL_ERROR "Core Library target doesn't exist. "
76-
"This is bad and should be reported")
77-
endif ()
78-
7967
# Infer scope
8068
if (parsed_args_HEADER_ONLY)
8169
set(scope INTERFACE)
@@ -85,6 +73,6 @@ function(link_arduino_library _target_name _library_target_name)
8573

8674
_link_arduino_cmake_library(${_target_name} ${_library_target_name}
8775
${scope}
88-
BOARD_CORE_TARGET ${core_lib_target})
76+
BOARD_CORE_TARGET ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET})
8977

9078
endfunction()

cmake/Platform/Targets/CoreLibTarget.cmake

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -73,46 +73,35 @@ endfunction()
7373
#=============================================================================#
7474
# Adds/Creates a static library target for Arduino's core library (Core-Lib),
7575
# required by every arduino target.
76-
# _target_name - Name of the Application/Executable target created earlier.
7776
# _board_id - Board to create the core library for.
7877
# Note that each board has a unique version of the library.
78+
# _return_var - Name of variable in parent-scope holding the return value.
79+
# Returns - Generated Core-lib's target name.
7980
#=============================================================================#
80-
function(add_arduino_core_lib _target_name)
81-
82-
generate_core_lib_target_name(${ARDUINO_CMAKE_PROJECT_BOARD} core_lib_target)
83-
84-
if (TARGET ${core_lib_target}) # Core-lib target already created for the given board
85-
if (TARGET ${_target_name}) # Executable/Firmware target also exists
86-
target_link_libraries(${_target_name} PUBLIC ${core_lib_target})
87-
endif ()
81+
function(add_arduino_core_lib _board_id _return_var)
8882

89-
else () # Core-Lib target needs to be created
83+
generate_core_lib_target_name(${_board_id} core_lib_target)
9084

91-
_get_board_core(${ARDUINO_CMAKE_PROJECT_BOARD} board_core) # Get board's core
92-
_get_board_variant(${ARDUINO_CMAKE_PROJECT_BOARD} board_variant) # Get board's variant
85+
_get_board_core(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_core) # Get board's core
86+
_get_board_variant(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} board_variant) # Get board's variant
9387

94-
# Find sources in core directory and add the library target
95-
find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources)
88+
# Find sources in core directory and add the library target
89+
find_source_files("${ARDUINO_CMAKE_CORE_${board_core}_PATH}" core_sources)
9690

97-
if (CMAKE_HOST_UNIX)
98-
if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN)
99-
list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*")
100-
endif ()
91+
if (CMAKE_HOST_UNIX)
92+
if (CMAKE_HOST_UBUNTU OR CMAKE_HOST_DEBIAN)
93+
list(FILTER core_sources EXCLUDE REGEX "[Mm]ain\\.c.*")
10194
endif ()
95+
endif ()
10296

103-
add_library(${core_lib_target} STATIC "${core_sources}")
104-
105-
# Include platform's core and variant directories
106-
target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}")
107-
target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}")
97+
add_library(${core_lib_target} STATIC "${core_sources}")
10898

109-
_set_core_lib_flags(${core_lib_target})
99+
# Include platform's core and variant directories
100+
target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_CORE_${board_core}_PATH}")
101+
target_include_directories(${core_lib_target} PUBLIC "${ARDUINO_CMAKE_VARIANT_${board_variant}_PATH}")
110102

111-
# Link Core-Lib to executable target
112-
if (TARGET ${_target_name})
113-
target_link_libraries(${_target_name} PUBLIC "${core_lib_target}")
114-
endif ()
103+
_set_core_lib_flags(${core_lib_target})
115104

116-
endif ()
105+
set(${_return_var} ${core_lib_target} PARENT_SCOPE)
117106

118107
endfunction()

cmake/Platform/Targets/ExecutableTarget.cmake

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ function(add_arduino_executable _target_name)
1111

1212
add_executable(${_target_name} "${sources}")
1313

14-
# Always add board's core lib
15-
add_arduino_core_lib(${_target_name})
14+
target_link_libraries(${_target_name} PRIVATE ${${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD}_CORELIB_TARGET})
1615

1716
# Add compiler and linker flags
1817
set_executable_target_flags(${_target_name})
@@ -38,7 +37,7 @@ function(add_arduino_executable _target_name)
3837
VERBATIM)
3938

4039
# Required for avr-size
41-
get_board_property(${ARDUINO_CMAKE_PROJECT_BOARD} build.mcu board_mcu)
40+
get_board_property(${PROJECT_${ARDUINO_CMAKE_PROJECT_NAME}_BOARD} build.mcu board_mcu)
4241

4342
set(avr_size_script "${ARDUINO_CMAKE_TOOLCHAIN_DIR}/Platform/Other/FirmwareSizeCalculator.cmake")
4443

0 commit comments

Comments
 (0)