diff --git a/CMakeLists.txt b/CMakeLists.txt index 437b995..daeab1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,7 +265,7 @@ if(NOT MBED_IS_NATIVE_BUILD) # Create a distro for the microcontroller cmake target, ensuring its sources are only compiled once - mbed_create_distro(${MBED_TARGET_CMAKE_NAME}-obj ${MBED_TARGET_CMAKE_NAME} mbed-core-flags) + mbed_create_distro(${MBED_TARGET_CMAKE_NAME}-lib ${MBED_TARGET_CMAKE_NAME} mbed-core-flags) # Core Mbed OS libraries # mbed-baremetal contains baremetal sources + target sources + target compile flags. @@ -276,8 +276,8 @@ mbed_create_distro(mbed-os mbed-core-flags mbed-core-sources mbed-rtos-flags mbed-rtos-sources) # Now make the Mbed OS code depend on the target, ensuring everything has access to the uC's flags and objects. - target_link_libraries(mbed-baremetal PUBLIC ${MBED_TARGET_CMAKE_NAME}-obj) - target_link_libraries(mbed-os PUBLIC ${MBED_TARGET_CMAKE_NAME}-obj) + target_link_libraries(mbed-baremetal PUBLIC ${MBED_TARGET_CMAKE_NAME}-lib) + target_link_libraries(mbed-os PUBLIC ${MBED_TARGET_CMAKE_NAME}-lib) endif() # Ninja requires to be forced for response files diff --git a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/CMakeLists.txt b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/CMakeLists.txt index b4f2501..b829ac4 100644 --- a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/CMakeLists.txt +++ b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/CMakeLists.txt @@ -12,7 +12,7 @@ endif() target_include_directories(mbed-psa - INTERFACE + PUBLIC inc inc/psa ) @@ -22,5 +22,6 @@ src/psa_hrng.c ) -# For now, on devices with PSA, PSA functions are used by the HAL so PSA needs to be included in the core Mbed build. -target_link_libraries(mbed-core-flags INTERFACE mbed-psa) \ No newline at end of file +# Make sure that mbed-psa can include headers from Mbed OS and the target +# Must be private so that we do not commit to a baremetal or OS choice +target_link_libraries(mbed-psa PRIVATE mbed-core-flags ${MBED_TARGET_CMAKE_NAME}-lib) \ No newline at end of file diff --git a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/CMakeLists.txt b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/CMakeLists.txt index d1acd89..23fa1bb 100644 --- a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/CMakeLists.txt +++ b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/CMakeLists.txt @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 target_include_directories(mbed-psa - INTERFACE + PUBLIC inc inc/psa mbedtls @@ -19,7 +19,7 @@ ) target_sources(mbed-psa - INTERFACE + PRIVATE mbedtls/psa_crypto.c mbedtls/psa_crypto_se.c mbedtls/psa_crypto_driver_wrappers.c @@ -63,7 +63,7 @@ ) target_link_libraries(mbed-psa - INTERFACE + PUBLIC mbed-mbedtls mbed-storage-kvstore mbed-storage-tdbstore diff --git a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/CMakeLists.txt b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/CMakeLists.txt index f0b07fd..5b89954 100644 --- a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/CMakeLists.txt +++ b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_LATEST/CMakeLists.txt @@ -3,7 +3,7 @@ if("TFM_DUALCPU" IN_LIST MBED_TARGET_LABELS) target_sources(mbed-psa - INTERFACE + PRIVATE TARGET_TFM_DUALCPU/src/platform_multicore.c TARGET_TFM_DUALCPU/src/platform_ns_mailbox.c TARGET_TFM_DUALCPU/src/tfm_mbed_boot.c @@ -15,7 +15,7 @@ if("TFM_V8M" IN_LIST MBED_TARGET_LABELS) target_sources(mbed-psa - INTERFACE + PRIVATE TARGET_TFM_V8M/src/cmsis_nvic_virtual.c TARGET_TFM_V8M/src/tfm_mbed_boot.c TARGET_TFM_V8M/src/tfm_psa_ns_api.c @@ -23,14 +23,14 @@ endif() target_include_directories(mbed-psa - INTERFACE + PUBLIC include include/psa include/psa_manifest ) target_sources(mbed-psa - INTERFACE + PRIVATE src/os_wrapper_cmsis_rtos_v2.c src/tfm_crypto_ipc_api.c src/tfm_firmware_update_ipc_api.c diff --git a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V1_0/CMakeLists.txt b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V1_0/CMakeLists.txt index fc25761..fb9a86e 100644 --- a/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V1_0/CMakeLists.txt +++ b/platform/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V1_0/CMakeLists.txt @@ -3,7 +3,7 @@ if("TFM_DUALCPU" IN_LIST MBED_TARGET_LABELS) target_sources(mbed-psa - INTERFACE + PRIVATE TARGET_TFM_DUALCPU/src/platform_multicore.c TARGET_TFM_DUALCPU/src/platform_ns_mailbox.c TARGET_TFM_DUALCPU/src/tfm_mbed_boot.c @@ -15,7 +15,7 @@ if("TFM_V8M" IN_LIST MBED_TARGET_LABELS) target_sources(mbed-psa - INTERFACE + PRIVATE TARGET_TFM_V8M/src/cmsis_nvic_virtual.c TARGET_TFM_V8M/src/tfm_mbed_boot.c TARGET_TFM_V8M/src/tfm_ns_interface.c @@ -31,7 +31,7 @@ ) target_sources(mbed-psa - INTERFACE + PRIVATE src/tfm_crypto_ipc_api.c src/tfm_initial_attestation_ipc_api.c src/tfm_its_ipc_api.c diff --git a/tools/cmake/mbed_create_distro.cmake b/tools/cmake/mbed_create_distro.cmake index 194e516..dae61d9 100644 --- a/tools/cmake/mbed_create_distro.cmake +++ b/tools/cmake/mbed_create_distro.cmake @@ -44,50 +44,56 @@ #message("Distro: ${NAME}. REMAINING_MODULES: ${REMAINING_MODULES}") list(GET REMAINING_MODULES 0 CURR_MODULE) - - copy_append_property(INTERFACE_COMPILE_DEFINITIONS ${CURR_MODULE} ${NAME}) - copy_append_property(INTERFACE_COMPILE_OPTIONS ${CURR_MODULE} ${NAME}) - copy_append_property(INTERFACE_INCLUDE_DIRECTORIES ${CURR_MODULE} ${NAME}) - copy_append_property(INTERFACE_LINK_OPTIONS ${CURR_MODULE} ${NAME}) + list(REMOVE_AT REMAINING_MODULES 0) # Make sure that linking to the distro pulls in the compiled code from CURR_MODULE target_link_libraries(${NAME} PRIVATE ${CURR_MODULE}) - # CMake currently has a limitation that OBJECT libraries cannot link to other OBJECT libraries - # via the LINK_LIBRARIES property -- CMake will not link the objects in properly :/. - # see: https://cmake.org/pipermail/cmake/2019-May/069453.html - # also: https://gitlab.kitware.com/cmake/cmake/-/issues/18090 get_property(CURR_MODULE_TYPE TARGET ${CURR_MODULE} PROPERTY TYPE) - if("${CURR_MODULE_TYPE}" STREQUAL "OBJECT_LIBRARY") - target_sources(${NAME} INTERFACE $) - # Check if this object library has any other libraries exported through its INTERFACE_SOURCES. - # If it does, we need to propagate those too. - get_property(OBJ_INTERFACE_SOURCES TARGET ${NAME} PROPERTY INTERFACE_SOURCES) - foreach(INTERFACE_SOURCE ${OBJ_INTERFACE_SOURCES}) - if(INTERFACE_SOURCE MATCHES "\\$") - target_sources(${NAME} INTERFACE ${INTERFACE_SOURCE}) + if("${CURR_MODULE_TYPE}" STREQUAL "STATIC_LIBRARY") + # Don't need to do anything other than linking it + else() + copy_append_property(INTERFACE_COMPILE_DEFINITIONS ${CURR_MODULE} ${NAME}) + copy_append_property(INTERFACE_COMPILE_OPTIONS ${CURR_MODULE} ${NAME}) + copy_append_property(INTERFACE_INCLUDE_DIRECTORIES ${CURR_MODULE} ${NAME}) + copy_append_property(INTERFACE_LINK_OPTIONS ${CURR_MODULE} ${NAME}) + + # CMake currently has a limitation that OBJECT libraries cannot link to other OBJECT libraries + # via the LINK_LIBRARIES property -- CMake will not link the objects in properly :/. + # see: https://cmake.org/pipermail/cmake/2019-May/069453.html + # also: https://gitlab.kitware.com/cmake/cmake/-/issues/18090 + + if("${CURR_MODULE_TYPE}" STREQUAL "OBJECT_LIBRARY") + target_sources(${NAME} INTERFACE $) + + # Check if this object library has any other libraries exported through its INTERFACE_SOURCES. + # If it does, we need to propagate those too. + get_property(OBJ_INTERFACE_SOURCES TARGET ${NAME} PROPERTY INTERFACE_SOURCES) + foreach(INTERFACE_SOURCE ${OBJ_INTERFACE_SOURCES}) + if(INTERFACE_SOURCE MATCHES "\\$") + target_sources(${NAME} INTERFACE ${INTERFACE_SOURCE}) + endif() + endforeach() + endif() + + list(APPEND COMPLETED_MODULES ${CURR_MODULE}) + + # find sub-modules of this module + get_property(SUBMODULES TARGET ${CURR_MODULE} PROPERTY INTERFACE_LINK_LIBRARIES) + foreach(SUBMODULE ${SUBMODULES}) + if(NOT "${SUBMODULE}" MATCHES "::@") # remove CMake internal CMAKE_DIRECTORY_ID_SEP markers + # Remove LINK_ONLY genexes from target_link_libraries(... PRIVATE). We can ignore things wrapped in these + # because they will already have been handled by the target_link_libraries earlier on. + if(NOT "${SUBMODULE}" MATCHES "\\$") + if(NOT ${SUBMODULE} IN_LIST COMPLETED_MODULES) + list(APPEND REMAINING_MODULES ${SUBMODULE}) + endif() + endif() endif() endforeach() endif() - list(REMOVE_AT REMAINING_MODULES 0) - list(APPEND COMPLETED_MODULES ${CURR_MODULE}) - - # find sub-modules of this module - get_property(SUBMODULES TARGET ${CURR_MODULE} PROPERTY INTERFACE_LINK_LIBRARIES) - foreach(SUBMODULE ${SUBMODULES}) - if(NOT "${SUBMODULE}" MATCHES "::@") # remove CMake internal CMAKE_DIRECTORY_ID_SEP markers - # Remove LINK_ONLY genexes from target_link_libraries(... PRIVATE). We can ignore things wrapped in these - # because they will already have been handled by the target_link_libraries earlier on. - if(NOT "${SUBMODULE}" MATCHES "\\$") - if(NOT ${SUBMODULE} IN_LIST COMPLETED_MODULES) - list(APPEND REMAINING_MODULES ${SUBMODULE}) - endif() - endif() - endif() - endforeach() - endwhile() endfunction(mbed_create_distro) \ No newline at end of file