From 1f01325ee53752aedcb62e38806d9be69bfa9010 Mon Sep 17 00:00:00 2001 From: Mark Ruvald Pedersen Date: Thu, 25 Apr 2019 15:46:11 +0200 Subject: [PATCH] cmake: Toolchain abstraction: use LINKER, introduce toolchain_ld_base toolchain_ld_base() represents flags that are fundamental to linking or otherwise does not belong in any further specified linker flag category. No functional change expected. This is motivated by the wish to abstract Zephyr's usage of toolchains, permitting non-intrusive porting to other (commercial) toolchains. Signed-off-by: Mark Ruvald Pedersen --- CMakeLists.txt | 5 ++--- cmake/compiler/gcc/target.cmake | 1 - cmake/linker/ld/target.cmake | 6 ++++++ cmake/linker/ld/target_base.cmake | 12 ++++++++++++ cmake/target_toolchain.cmake | 7 +++++-- 5 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 cmake/linker/ld/target_base.cmake 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. #