diff --git a/CMakeLists.txt b/CMakeLists.txt index 4030738bea6..60242d92557 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -221,9 +221,8 @@ zephyr_compile_options( $<$:-D_ASMLANGUAGE> ) -zephyr_ld_options( - ${TOOLCHAIN_LD_FLAGS} -) +# @Intent: Set fundamental linker specific flags +toolchain_ld_base() if(NOT CONFIG_NATIVE_APPLICATION) zephyr_ld_options( diff --git a/cmake/compiler/gcc/target.cmake b/cmake/compiler/gcc/target.cmake index 4ee53d88c87..3131adf7277 100644 --- a/cmake/compiler/gcc/target.cmake +++ b/cmake/compiler/gcc/target.cmake @@ -9,7 +9,6 @@ find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATH ${TOOLCHAIN_HOME} NO_ find_program(CMAKE_OBJCOPY ${CROSS_COMPILE}objcopy PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_OBJDUMP ${CROSS_COMPILE}objdump PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_AS ${CROSS_COMPILE}as PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) -find_program(CMAKE_LINKER ${CROSS_COMPILE}ld PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_AR ${CROSS_COMPILE}ar PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_RANLIB ${CROSS_COMPILE}ranlib PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_READELF ${CROSS_COMPILE}readelf PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) diff --git a/cmake/linker/ld/target.cmake b/cmake/linker/ld/target.cmake index e69de29bb2d..a504feca070 100644 --- a/cmake/linker/ld/target.cmake +++ b/cmake/linker/ld/target.cmake @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 + +find_program(CMAKE_LINKER ${CROSS_COMPILE}ld PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) + +# Load toolchain_ld-family macros +include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_base.cmake) diff --git a/cmake/linker/ld/target_base.cmake b/cmake/linker/ld/target_base.cmake new file mode 100644 index 00000000000..bc0b29edcdd --- /dev/null +++ b/cmake/linker/ld/target_base.cmake @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 + +# See root CMakeLists.txt for description and expectations of these macros + +macro(toolchain_ld_base) + + # TOOLCHAIN_LD_FLAGS comes from compiler/gcc/target.cmake + zephyr_ld_options( + ${TOOLCHAIN_LD_FLAGS} + ) + +endmacro() diff --git a/cmake/target_toolchain.cmake b/cmake/target_toolchain.cmake index c9e4546dbd0..a5a43987a11 100644 --- a/cmake/target_toolchain.cmake +++ b/cmake/target_toolchain.cmake @@ -42,9 +42,12 @@ endif() unset(CMAKE_C_COMPILER) unset(CMAKE_C_COMPILER CACHE) -# Configure the toolchain based on what toolchain technology is used -# (gcc, host-gcc etc.) +# A toolchain consist of a compiler and a linker. +# In Zephyr, toolchains require a port under cmake/toolchain/. +# Each toolchain port must set COMPILER and LINKER. +# E.g. toolchain/llvm may pick {clang, ld} or {clang, lld}. include(${ZEPHYR_BASE}/cmake/compiler/${COMPILER}/target.cmake OPTIONAL) +include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target.cmake OPTIONAL) # Uniquely identify the toolchain wrt. it's capabilities. #