diff --git a/cmake/linker/ld/linker_libraries.cmake b/cmake/linker/ld/linker_libraries.cmake index 489f1f3859b..999420164aa 100644 --- a/cmake/linker/ld/linker_libraries.cmake +++ b/cmake/linker/ld/linker_libraries.cmake @@ -2,21 +2,17 @@ # # SPDX-License-Identifier: Apache-2.0 -# Do not specify default link libraries when targeting host (native build). -if(NOT CONFIG_NATIVE_BUILD) - set_linker_property(NO_CREATE PROPERTY c_library "-lc") - set_linker_property(NO_CREATE PROPERTY rt_library "-lgcc") - set_linker_property(NO_CREATE PROPERTY c++_library "-lstdc++") - set_linker_property(NO_CREATE PROPERTY math_library "-lm") - # Keeping default include dir empty. The linker will then select libraries - # from its default search path. The toolchain may adjust the value to a - # specific location, for example gcc infrastructure will set the value based - # on output from --print-libgcc-file-name. - set_linker_property(NO_CREATE PROPERTY lib_include_dir "") -endif() +set_linker_property(NO_CREATE PROPERTY c_library "-lc") +set_linker_property(NO_CREATE PROPERTY rt_library "-lgcc") +set_linker_property(NO_CREATE PROPERTY c++_library "-lstdc++") +set_linker_property(NO_CREATE PROPERTY math_library "-lm") +# Keeping default include dir empty. The linker will then select libraries +# from its default search path. The toolchain may adjust the value to a +# specific location, for example gcc infrastructure will set the value based +# on output from --print-libgcc-file-name. +set_linker_property(NO_CREATE PROPERTY lib_include_dir "") if(CONFIG_CPP - AND NOT CONFIG_NATIVE_LIBRARY # When new link principle is fully introduced, then the below condition can # be removed, and instead the external module c++ should use: # set_property(TARGET linker PROPERTY c++_library "") diff --git a/cmake/linker/linker_libraries_native.cmake b/cmake/linker/linker_libraries_native.cmake new file mode 100644 index 00000000000..f3e852bc629 --- /dev/null +++ b/cmake/linker/linker_libraries_native.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +# When doing native builds, then we default to host libraries. +# No reason for loading linker libraries properties in this case, however we do +# define link order because that allows the build system to hook in alternative +# C library implementations, such as minimal libc or picolibc. + +# Empty on purpose as we default to host libraries selected by the linker. +set_linker_property(PROPERTY c_library "") +set_linker_property(PROPERTY rt_library "") +set_linker_property(PROPERTY c++_library "") + +# Although library properties are empty per default, then we still define link +# order as this allows to update libraries in use elsewhere. +if(CONFIG_CPP) + set_property(TARGET linker PROPERTY link_order_library "c++") +endif() + +set_property(TARGET linker APPEND PROPERTY link_order_library "c;rt") diff --git a/cmake/linker/lld/linker_libraries.cmake b/cmake/linker/lld/linker_libraries.cmake index 69690d2a051..8275d779337 100644 --- a/cmake/linker/lld/linker_libraries.cmake +++ b/cmake/linker/lld/linker_libraries.cmake @@ -8,7 +8,6 @@ set_linker_property(NO_CREATE TARGET linker PROPERTY rt_library "") set_linker_property(TARGET linker PROPERTY c++_library "-lc++;-lc++abi") if(CONFIG_CPP - AND NOT CONFIG_NATIVE_LIBRARY # When new link principle is fully introduced, then the below condition can # be removed, and instead the external module c++ should use: # set_property(TARGET linker PROPERTY c++_library "") diff --git a/cmake/target_toolchain_flags.cmake b/cmake/target_toolchain_flags.cmake index 716cc8f55e7..7783b72941f 100644 --- a/cmake/target_toolchain_flags.cmake +++ b/cmake/target_toolchain_flags.cmake @@ -41,4 +41,9 @@ include(${CMAKE_CURRENT_LIST_DIR}/linker/linker_libraries_template.cmake) # (gcc, host-gcc etc.) include(${TOOLCHAIN_ROOT}/cmake/compiler/${COMPILER}/compiler_flags.cmake OPTIONAL) include(${TOOLCHAIN_ROOT}/cmake/linker/${LINKER}/linker_flags.cmake OPTIONAL) -include(${TOOLCHAIN_ROOT}/cmake/linker/${LINKER}/linker_libraries.cmake OPTIONAL) + +if(CONFIG_NATIVE_LIBRARY) + include(${TOOLCHAIN_ROOT}/cmake/linker/linker_libraries_native.cmake) +else() + include(${TOOLCHAIN_ROOT}/cmake/linker/${LINKER}/linker_libraries.cmake OPTIONAL) +endif()