From aed9ea79b5917cadd5df383c5b2bcd726268a958 Mon Sep 17 00:00:00 2001 From: Danny Oerndrup Date: Thu, 18 Jul 2019 15:06:51 +0200 Subject: [PATCH] cmake: Toolchain abstraction: Abstraction of binary tools, foundation. This forms the foundation for the abstraction of the binary tools, where the following steps are taken: - Move binary tool resolving, such as objcopy, objdump, readelf and so forth, out of compiler definitions and place in a dedicated binary tools folder with the binary tools supplier as subfolder, similar to the compiler and linker directories. - Create binary tool sets, gnu, host-gnu and llvm. - Each toolchain selects the required set of binary tools by setting BINTOOLS via its generic.cmake as it also does for compiler and linker. The intent here is to abstract Zephyr's dependence on toolchains, thus allowing for easier porting to other, perhaps commercial, toolchains and/or usecases. No functional change expected. Signed-off-by: Danny Oerndrup --- cmake/bintools/gnu/target.cmake | 14 ++++++++++++++ cmake/bintools/host-gnu/target.cmake | 11 +++++++++++ cmake/bintools/llvm/target.cmake | 15 +++++++++++++++ cmake/compiler/clang/target.cmake | 14 ++------------ cmake/compiler/gcc/target.cmake | 11 +---------- cmake/compiler/host-gcc/target.cmake | 9 +-------- cmake/compiler/xcc/target.cmake | 12 +----------- cmake/generic_toolchain.cmake | 1 + cmake/target_toolchain.cmake | 1 + cmake/toolchain/cross-compile/generic.cmake | 1 + cmake/toolchain/espressif/generic.cmake | 1 + cmake/toolchain/gnuarmemb/generic.cmake | 1 + cmake/toolchain/host/generic.cmake | 2 ++ cmake/toolchain/llvm/generic.cmake | 1 + cmake/toolchain/xcc/generic.cmake | 1 + cmake/toolchain/xtools/generic.cmake | 1 + cmake/toolchain/zephyr/0.10.0/generic.cmake | 1 + cmake/toolchain/zephyr/0.10.1/generic.cmake | 1 + 18 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 cmake/bintools/gnu/target.cmake create mode 100644 cmake/bintools/host-gnu/target.cmake create mode 100644 cmake/bintools/llvm/target.cmake diff --git a/cmake/bintools/gnu/target.cmake b/cmake/bintools/gnu/target.cmake new file mode 100644 index 00000000000..db4195be260 --- /dev/null +++ b/cmake/bintools/gnu/target.cmake @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Configures binary tools as GNU binutils + +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_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) +find_program(CMAKE_NM ${CROSS_COMPILE}nm PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) + +find_program(CMAKE_GDB ${CROSS_COMPILE}gdb PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) +find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME} ) diff --git a/cmake/bintools/host-gnu/target.cmake b/cmake/bintools/host-gnu/target.cmake new file mode 100644 index 00000000000..5b79e5b6fc1 --- /dev/null +++ b/cmake/bintools/host-gnu/target.cmake @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Configures binary tools as host GNU binutils + +find_program(CMAKE_OBJCOPY objcopy) +find_program(CMAKE_OBJDUMP objdump) +find_program(CMAKE_AR ar ) +find_program(CMAKE_RANLILB ranlib ) +find_program(CMAKE_READELF readelf) + +find_program(CMAKE_GDB gdb ) diff --git a/cmake/bintools/llvm/target.cmake b/cmake/bintools/llvm/target.cmake new file mode 100644 index 00000000000..d0c81e3b090 --- /dev/null +++ b/cmake/bintools/llvm/target.cmake @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Configures binary toos as llvm binary tool set + +if(DEFINED TOOLCHAIN_HOME) + set(find_program_clang_args PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) + set(find_program_binutils_args PATH ${TOOLCHAIN_HOME}) +endif() + +find_program(CMAKE_AR llvm-ar ${find_program_clang_args} ) +find_program(CMAKE_NM llvm-nm ${find_program_clang_args} ) +find_program(CMAKE_OBJDUMP llvm-objdump ${find_program_clang_args} ) +find_program(CMAKE_RANLIB llvm-ranlib ${find_program_clang_args} ) +find_program(CMAKE_OBJCOPY objcopy ${find_program_binutils_args}) +find_program(CMAKE_READELF readelf ${find_program_binutils_args}) diff --git a/cmake/compiler/clang/target.cmake b/cmake/compiler/clang/target.cmake index 2fd15bf177a..7bbccc7a832 100644 --- a/cmake/compiler/clang/target.cmake +++ b/cmake/compiler/clang/target.cmake @@ -13,20 +13,10 @@ endif() if(DEFINED TOOLCHAIN_HOME) set(find_program_clang_args PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) - set(find_program_binutils_args PATH ${TOOLCHAIN_HOME}) endif() - -find_program(CMAKE_C_COMPILER clang ${find_program_clang_args}) -find_program(CMAKE_CXX_COMPILER clang++ ${find_program_clang_args}) -find_program(CMAKE_AR llvm-ar ${find_program_clang_args}) -find_program(CMAKE_LINKER llvm-link ${find_program_clang_args}) -find_program(CMAKE_NM llvm-nm ${find_program_clang_args}) -find_program(CMAKE_OBJDUMP llvm-objdump ${find_program_clang_args}) -find_program(CMAKE_RANLIB llvm-ranlib ${find_program_clang_args}) - -find_program(CMAKE_OBJCOPY objcopy ${find_program_binutils_args}) -find_program(CMAKE_READELF readelf ${find_program_binutils_args}) +find_program(CMAKE_C_COMPILER clang ${find_program_clang_args}) +find_program(CMAKE_CXX_COMPILER clang++ ${find_program_clang_args}) if(NOT "${ARCH}" STREQUAL "posix") diff --git a/cmake/compiler/gcc/target.cmake b/cmake/compiler/gcc/target.cmake index 991a49c0946..b3f8edb2e38 100644 --- a/cmake/compiler/gcc/target.cmake +++ b/cmake/compiler/gcc/target.cmake @@ -5,16 +5,7 @@ set_ifndef(C++ g++) # Configures CMake for using GCC, this script is re-used by several # GCC-based toolchains -find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) -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_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) -find_program(CMAKE_GDB ${CROSS_COMPILE}gdb PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) -find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME} ) -find_program(CMAKE_NM ${CROSS_COMPILE}nm PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) +find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) if(CONFIG_CPLUSPLUS) set(cplusplus_compiler ${CROSS_COMPILE}${C++}) diff --git a/cmake/compiler/host-gcc/target.cmake b/cmake/compiler/host-gcc/target.cmake index 79dab0b2cc8..9a4ed555438 100644 --- a/cmake/compiler/host-gcc/target.cmake +++ b/cmake/compiler/host-gcc/target.cmake @@ -2,14 +2,7 @@ # Configures CMake for using GCC -find_program(CMAKE_C_COMPILER gcc ) -find_program(CMAKE_OBJCOPY objcopy) -find_program(CMAKE_OBJDUMP objdump) -#find_program(CMAKE_LINKER ld ) # Not in use yet -find_program(CMAKE_AR ar ) -find_program(CMAKE_RANLILB ranlib ) -find_program(CMAKE_READELF readelf) -find_program(CMAKE_GDB gdb ) +find_program(CMAKE_C_COMPILER gcc) # -march={pentium,lakemont,...} do not automagically imply -m32, so # adding it here. diff --git a/cmake/compiler/xcc/target.cmake b/cmake/compiler/xcc/target.cmake index 3bb4a9e8a7e..14c23b8cdbd 100644 --- a/cmake/compiler/xcc/target.cmake +++ b/cmake/compiler/xcc/target.cmake @@ -5,17 +5,7 @@ set_ifndef(C++ g++) # Configures CMake for using GCC, this script is re-used by several # GCC-based toolchains -find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) -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) -find_program(CMAKE_GDB ${CROSS_COMPILE}gdb PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) -find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME} ) -find_program(CMAKE_NM ${CROSS_COMPILE}nm PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) +find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) if(CONFIG_CPLUSPLUS) set(cplusplus_compiler ${CROSS_COMPILE}${C++}) diff --git a/cmake/generic_toolchain.cmake b/cmake/generic_toolchain.cmake index 90c06748994..c579ea76dc1 100644 --- a/cmake/generic_toolchain.cmake +++ b/cmake/generic_toolchain.cmake @@ -67,3 +67,4 @@ include(${TOOLCHAIN_ROOT}/cmake/toolchain/${ZEPHYR_TOOLCHAIN_VARIANT}/generic.cm # (gcc, host-gcc etc.) include(${TOOLCHAIN_ROOT}/cmake/compiler/${COMPILER}/generic.cmake OPTIONAL) include(${TOOLCHAIN_ROOT}/cmake/linker/${LINKER}/generic.cmake OPTIONAL) +include(${TOOLCHAIN_ROOT}/cmake/bintools/${BINTOOLS}/generic.cmake OPTIONAL) diff --git a/cmake/target_toolchain.cmake b/cmake/target_toolchain.cmake index 307c942a133..a117538d608 100644 --- a/cmake/target_toolchain.cmake +++ b/cmake/target_toolchain.cmake @@ -48,6 +48,7 @@ unset(CMAKE_C_COMPILER CACHE) # E.g. toolchain/llvm may pick {clang, ld} or {clang, lld}. include(${TOOLCHAIN_ROOT}/cmake/compiler/${COMPILER}/target.cmake OPTIONAL) include(${TOOLCHAIN_ROOT}/cmake/linker/${LINKER}/target.cmake OPTIONAL) +include(${TOOLCHAIN_ROOT}/cmake/bintools/${BINTOOLS}/target.cmake OPTIONAL) # Uniquely identify the toolchain wrt. it's capabilities. # diff --git a/cmake/toolchain/cross-compile/generic.cmake b/cmake/toolchain/cross-compile/generic.cmake index ebf9d04001d..ed90dc5bb99 100644 --- a/cmake/toolchain/cross-compile/generic.cmake +++ b/cmake/toolchain/cross-compile/generic.cmake @@ -26,3 +26,4 @@ assert(CROSS_COMPILE "CROSS_COMPILE is not set") set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) diff --git a/cmake/toolchain/espressif/generic.cmake b/cmake/toolchain/espressif/generic.cmake index daab9ff3ea3..df9ed248143 100644 --- a/cmake/toolchain/espressif/generic.cmake +++ b/cmake/toolchain/espressif/generic.cmake @@ -8,6 +8,7 @@ set(TOOLCHAIN_HOME ${ESPRESSIF_TOOLCHAIN_PATH}) set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) set(CROSS_COMPILE_TARGET xtensa-esp32-elf) set(SYSROOT_TARGET xtensa-esp32-elf) diff --git a/cmake/toolchain/gnuarmemb/generic.cmake b/cmake/toolchain/gnuarmemb/generic.cmake index 90a32744194..aacd4a9d6a3 100644 --- a/cmake/toolchain/gnuarmemb/generic.cmake +++ b/cmake/toolchain/gnuarmemb/generic.cmake @@ -20,6 +20,7 @@ set(TOOLCHAIN_HOME ${GNUARMEMB_TOOLCHAIN_PATH}) set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) set(CROSS_COMPILE_TARGET arm-none-eabi) set(SYSROOT_TARGET arm-none-eabi) diff --git a/cmake/toolchain/host/generic.cmake b/cmake/toolchain/host/generic.cmake index 9cf7ba94960..4bbf8201d7f 100644 --- a/cmake/toolchain/host/generic.cmake +++ b/cmake/toolchain/host/generic.cmake @@ -2,4 +2,6 @@ set(COMPILER host-gcc) set(LINKER ld) +set(BINTOOLS host-gnu) + set(TOOLCHAIN_HAS_NEWLIB OFF CACHE BOOL "True if toolchain supports newlib") diff --git a/cmake/toolchain/llvm/generic.cmake b/cmake/toolchain/llvm/generic.cmake index 5b8781d2c51..3ed4b933e44 100644 --- a/cmake/toolchain/llvm/generic.cmake +++ b/cmake/toolchain/llvm/generic.cmake @@ -14,6 +14,7 @@ endif() set(COMPILER clang) set(LINKER ld) # TODO: Use lld eventually rather than GNU ld +set(BINTOOLS llvm) if("${ARCH}" STREQUAL "arm") set(triple arm-none-eabi) diff --git a/cmake/toolchain/xcc/generic.cmake b/cmake/toolchain/xcc/generic.cmake index 6f519612e07..37e3c2994ef 100644 --- a/cmake/toolchain/xcc/generic.cmake +++ b/cmake/toolchain/xcc/generic.cmake @@ -12,6 +12,7 @@ set(TOOLCHAIN_HOME ${XTENSA_TOOLCHAIN_PATH}/XtDevTools/install/tools/$ENV{TOOLCH set(COMPILER xcc) set(LINKER ld) +set(BINTOOLS gnu) set(CROSS_COMPILE_TARGET xt) set(SYSROOT_TARGET xtensa-elf) diff --git a/cmake/toolchain/xtools/generic.cmake b/cmake/toolchain/xtools/generic.cmake index 0f00ba2c389..2b3c6b12b83 100644 --- a/cmake/toolchain/xtools/generic.cmake +++ b/cmake/toolchain/xtools/generic.cmake @@ -8,6 +8,7 @@ set(TOOLCHAIN_HOME ${XTOOLS_TOOLCHAIN_PATH}) set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) # Choose one of the toolchains in 'TOOLCHAIN_HOME' at random to use as # a 'generic' toolchain until we know for sure which toolchain we diff --git a/cmake/toolchain/zephyr/0.10.0/generic.cmake b/cmake/toolchain/zephyr/0.10.0/generic.cmake index 6968e5930a0..7d31614da9b 100644 --- a/cmake/toolchain/zephyr/0.10.0/generic.cmake +++ b/cmake/toolchain/zephyr/0.10.0/generic.cmake @@ -4,6 +4,7 @@ set(TOOLCHAIN_HOME ${ZEPHYR_SDK_INSTALL_DIR}) set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) set(CROSS_COMPILE_TARGET i586-${TOOLCHAIN_VENDOR}-elf) set(SYSROOT_TARGET i586-${TOOLCHAIN_VENDOR}-elf) diff --git a/cmake/toolchain/zephyr/0.10.1/generic.cmake b/cmake/toolchain/zephyr/0.10.1/generic.cmake index 6968e5930a0..7d31614da9b 100644 --- a/cmake/toolchain/zephyr/0.10.1/generic.cmake +++ b/cmake/toolchain/zephyr/0.10.1/generic.cmake @@ -4,6 +4,7 @@ set(TOOLCHAIN_HOME ${ZEPHYR_SDK_INSTALL_DIR}) set(COMPILER gcc) set(LINKER ld) +set(BINTOOLS gnu) set(CROSS_COMPILE_TARGET i586-${TOOLCHAIN_VENDOR}-elf) set(SYSROOT_TARGET i586-${TOOLCHAIN_VENDOR}-elf)