cmake-toolchains(7)

简介

CMake 使用一组实用工具链来执行编译、链接库、创建归档文件以及其他驱动构建的任务。可用的工具链实用程序由启用的语言决定。在常规构建中,CMake 会基于系统自省和默认设置自动确定宿主构建的工具链。在交叉编译场景中,可以通过指定工具链文件来提供有关编译器和实用程序路径的信息。

3.19 版本新增:可以使用 cmake-presets(7) 来指定工具链文件。

语言

语言由 project() 命令启用。特定于语言的内置变量,例如 CMAKE_CXX_COMPILERCMAKE_CXX_COMPILER_ID 等,均通过调用 project() 命令来设置。如果顶层 CMakeLists 文件中没有 project 命令,则会隐式生成一个。默认启用的语言是 CCXX

project(C_Only C)

特殊值 NONE 也可与 project() 命令一起使用,以启用不包含任何语言。

project(MyProject NONE)

enable_language() 命令可用于在 project() 命令之后启用语言。

enable_language(CXX)

当启用某种语言时,CMake 会查找该语言的编译器,并确定一些信息,例如编译器的供应商和版本、目标体系结构和位宽、相应实用程序的位置等。

ENABLED_LANGUAGES 全局属性包含了当前启用的语言。

变量与属性

有几个变量与已启用的工具链语言组件相关:

CMAKE_<LANG>_COMPILER

用于 <LANG> 的编译器的完整路径。

CMAKE_<LANG>_COMPILER_ID

CMake 使用的编译器标识符。

CMAKE_<LANG>_COMPILER_VERSION

编译器的版本。

CMAKE_<LANG>_FLAGS

这些变量及其配置特定的等效变量包含了在编译特定语言的文件时将添加到编译命令中的标志。

CMake 需要一种方式来确定使用哪个编译器来调用链接器。这由 target 源码文件的 LANGUAGE 属性决定,如果是静态库,则由相关依赖库的 LANGUAGE 决定。CMake 的选择可以通过 LINKER_LANGUAGE 目标属性来覆盖。

工具链特性

CMake 提供了 try_compile() 命令以及诸如 CheckSourceCompilesCheckCXXSymbolExistsCheckIncludeFile 等模块,用于测试各种工具链特性的能力和可用性。这些 API 以某种方式测试工具链并缓存结果,以便下一次运行 CMake 时无需再次执行测试。

某些工具链特性在 CMake 中有内置处理,不需要编译测试。例如,如果编译器支持该特性,POSITION_INDEPENDENT_CODE 允许指定目标应作为位置无关代码构建。如果编译器支持,<LANG>_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN 目标属性会添加用于隐藏可见性的标志。

交叉编译

如果调用 cmake(1) 时使用了命令行参数 --toolchain path/to/file-DCMAKE_TOOLCHAIN_FILE=path/to/file,则该文件会被提前加载以设置编译器的值。当 CMake 处于交叉编译模式时,CMAKE_CROSSCOMPILING 变量会被设置为 true。

请注意,在工具链文件中使用 CMAKE_SOURCE_DIRCMAKE_BINARY_DIR 变量通常是不合适的。工具链文件在这些变量于不同位置使用时(例如作为 try_compile() 调用的一部分时)可能具有不同值的上下文中被使用。大多数情况下,如果需要在工具链文件中评估路径,更合适的变量是 CMAKE_CURRENT_LIST_DIR,因为它总是具有明确且可预测的值。

面向 Linux 的交叉编译

典型的 Linux 交叉编译工具链包含如下内容:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)

set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

其中:

CMAKE_SYSTEM_NAME

是构建目标平台的 CMake 标识符。

CMAKE_SYSTEM_PROCESSOR

是目标体系结构的 CMake 标识符。

CMAKE_SYSROOT

是可选的,如果 sysroot 可用,则可以指定此项。

CMAKE_STAGING_PREFIX

也是可选的。它可用于指定宿主机上的安装路径。CMAKE_INSTALL_PREFIX 始终是运行时安装位置,即使在交叉编译时也是如此。

CMAKE_<LANG>_COMPILER

变量可以设置为完整路径,或者是要在标准位置搜索的编译器名称。对于那些不支持在没有自定义标志或脚本的情况下链接二进制文件的工具链,可以将 CMAKE_TRY_COMPILE_TARGET_TYPE 变量设置为 STATIC_LIBRARY,以告知 CMake 在检查期间不要尝试链接可执行文件。

在所有情况下,CMake 的 find_* 命令默认会查找 sysroot 和 CMAKE_FIND_ROOT_PATH 条目,以及查找宿主系统根前缀。虽然这可以根据具体情况进行控制,但在交叉编译时,排除查找宿主机或目标机的特定构件有时非常有用。通常,包含文件、库和包应该在目标系统前缀中找到,而必须作为构建一部分运行的可执行文件则应该仅在宿主机中找到,而不应在目标机中找到。这就是 CMAKE_FIND_ROOT_PATH_MODE_* 变量的作用。

面向 Cray Linux 环境的交叉编译

在 Cray Linux 环境中面向计算节点进行交叉编译,无需单独的工具链文件。在 CMake 命令行上指定 -DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment 将确保配置适当的构建设置和搜索路径。该平台将从当前环境变量中获取其配置,并配置项目以使用 Cray 编程环境的 PrgEnv-* 模块中的编译器封装器(如果存在且已加载)。

Cray 编程环境的默认配置仅支持静态库。可以通过将 CRAYPE_LINK_TYPE 环境变量设置为 dynamic 来覆盖此配置并启用共享库。

如果在不指定 CMAKE_SYSTEM_NAME 的情况下运行 CMake,则会以宿主模式运行配置步骤,假设是标准的 Linux 环境。如果不进行覆盖,将最终使用 PrgEnv-* 编译器封装器,如果针对的是登录节点或计算节点,这很可能不是预期的行为。例外情况是,如果您直接在 NID 上进行构建,而不是从登录节点进行交叉编译。如果尝试为登录节点构建软件,则需要先卸载当前加载的 PrgEnv-* 模块,或者显式告诉 CMake 使用 /usr/bin 中的系统编译器,而不是 Cray 封装器。如果需要面向计算节点,只需如上所述指定 CMAKE_SYSTEM_NAME 即可。

使用 Clang 进行交叉编译

像 Clang 这样的一些编译器本质上就是交叉编译器。可以在编译时设置 CMAKE_<LANG>_COMPILER_TARGET 来将值传递给这些受支持的编译器。

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(triple arm-linux-gnueabihf)

set(CMAKE_C_COMPILER clang)
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_CXX_COMPILER_TARGET ${triple})

同样,一些编译器不自带链接器等补充实用程序,但提供了一种指定编译器驱动程序将使用的外部工具链位置的方法。可以在工具链文件中设置 CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN 变量,以将路径传递给编译器驱动程序。

面向 QNX 的交叉编译

与 Clang 编译器一样,QNX QCC 编译本质上也是交叉编译。可以在编译时设置 CMAKE_<LANG>_COMPILER_TARGET 来将值传递给这些受支持的编译器。

set(CMAKE_SYSTEM_NAME QNX)

set(arch gcc_ntoaarch64)

set(CMAKE_C_COMPILER qcc)
set(CMAKE_C_COMPILER_TARGET ${arch})
set(CMAKE_CXX_COMPILER q++)
set(CMAKE_CXX_COMPILER_TARGET ${arch})

set(CMAKE_SYSROOT $ENV{QNX_TARGET})

面向 Windows CE 的交叉编译

面向 Windows CE 进行交叉编译需要系统中安装相应的 SDK。这些 SDK 通常安装在 C:/Program Files (x86)/Windows CE Tools/SDKs 下。

用于配置面向 Windows CE 的 Visual Studio 生成器 的工具链文件可能如下所示:

set(CMAKE_SYSTEM_NAME WindowsCE)

set(CMAKE_SYSTEM_VERSION 8.0)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_GENERATOR_TOOLSET CE800) # Can be omitted for 8.0
set(CMAKE_GENERATOR_PLATFORM SDK_AM335X_SK_WEC2013_V310)

CMAKE_GENERATOR_PLATFORM 告知生成器使用哪个 SDK。此外,CMAKE_SYSTEM_VERSION 告知生成器使用哪个版本的 Windows CE。目前原生支持 8.0 版本(Windows Embedded Compact 2013)。其他版本可能需要将 CMAKE_GENERATOR_TOOLSET 设置为正确的值。

面向 Windows 10 通用应用的交叉编译

用于配置面向 Windows 10 通用应用的 Visual Studio 生成器 的工具链文件可能如下所示:

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 10.0)

Windows 10 通用应用既面向 Windows Store 又面向 Windows Phone。请将 CMAKE_SYSTEM_VERSION 变量指定为 10.0 或更高版本。

CMake 会如 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 变量的文档所述选择 Windows SDK。

面向 Windows Phone 的交叉编译

用于配置面向 Windows Phone 的 Visual Studio 生成器 的工具链文件可能如下所示:

set(CMAKE_SYSTEM_NAME WindowsPhone)
set(CMAKE_SYSTEM_VERSION 8.1)

面向 Windows Store 的交叉编译

用于配置面向 Windows Store 的 Visual Studio 生成器 的工具链文件可能如下所示:

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

面向 ADSP SHARC/Blackfin 的交叉编译

面向 ADSP SHARC 或 Blackfin 进行交叉编译,可以通过将 CMAKE_SYSTEM_NAME 变量设置为 ADSP,并将 CMAKE_SYSTEM_PROCESSOR 变量设置为“部件编号”(不含 ADSP- 前缀,例如 21594SC589 等)来进行配置。此值不区分大小写。

CMake 会自动在其默认安装位置搜索 CCES 或 VDSP++ 安装,并选择找到的最新版本。如果两者都安装了,将优先选择 CCES 而非 VDSP++。可以通过 CMAKE_ADSP_ROOT 变量或 ADSP_ROOT 环境变量设置自定义安装路径。

编译器(cc21kccblkfn)是根据所提供的 CMAKE_SYSTEM_PROCESSOR 值自动选择的。

面向 Android 的交叉编译

工具链文件可以通过将 CMAKE_SYSTEM_NAME 变量设置为 Android 来配置面向 Android 的交叉编译。进一步的配置特定于所使用的 Android 开发环境。

对于 Visual Studio 生成器,CMake 要求安装 NVIDIA Nsight Tegra Visual Studio Edition适用于 Android 的 Visual Studio 工具。请参阅这些章节以获取进一步的配置详情。

对于 Makefile 生成器Ninja 生成器,CMake 要求具备以下环境之一:

CMake 使用以下步骤来选择环境之一:

  • 如果设置了 CMAKE_ANDROID_NDK 变量,将使用指定位置的 NDK。

  • 否则,如果设置了 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 变量,将使用指定位置的独立工具链。

  • 否则,如果 CMAKE_SYSROOT 变量被设置为 <ndk>/platforms/android-<api>/arch-<arch> 格式的目录,则 <ndk> 部分将用作 CMAKE_ANDROID_NDK 的值,并将使用该 NDK。

  • 否则,如果 CMAKE_SYSROOT 变量被设置为 <standalone-toolchain>/sysroot 格式的目录,则 <standalone-toolchain> 部分将用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,并将使用该独立工具链。

  • 否则,如果设置了 cmake 变量 ANDROID_NDK,它将被用作 CMAKE_ANDROID_NDK 的值,并将使用该 NDK。

  • 否则,如果设置了 cmake 变量 ANDROID_STANDALONE_TOOLCHAIN,它将被用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,并将使用该独立工具链。

  • 否则,如果设置了环境变量 ANDROID_NDK_ROOTANDROID_NDK,它将被用作 CMAKE_ANDROID_NDK 的值,并将使用该 NDK。

  • 否则,如果设置了环境变量 ANDROID_STANDALONE_TOOLCHAIN,它将被用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,并将使用该独立工具链。

  • 否则,将发布错误诊断信息,说明找不到 NDK 或独立工具链。

3.20 版本新增:如果选择了 Android NDK,其版本号将在 CMAKE_ANDROID_NDK_VERSION 变量中报告。

使用 NDK 进行 Android 交叉编译

工具链文件可以配置 Makefile 生成器Ninja 生成器Visual Studio 生成器 以针对 Android 进行交叉编译。

使用以下变量配置 Android NDK 的使用:

CMAKE_SYSTEM_NAME

设置为 Android。必须指定此项以启用 Android 交叉编译。

CMAKE_SYSTEM_VERSION

设置为 Android API 级别。如果未指定,其值确定如下:

  • 如果设置了 CMAKE_ANDROID_API 变量,则其值用作 API 级别。

  • 如果设置了 CMAKE_SYSROOT 变量,则从包含 sysroot 的 NDK 目录结构中检测 API 级别。

  • 否则,将使用 NDK 中可用的最新 API 级别。

CMAKE_ANDROID_ARCH_ABI

设置为 Android ABI(架构)。如果未指定,此变量将默认为列表 armeabiarmeabi-v7aarm64-v8a 中第一个受支持的 ABI。CMAKE_ANDROID_ARCH 变量将自动根据 CMAKE_ANDROID_ARCH_ABI 计算得出。另请参阅 CMAKE_ANDROID_ARM_MODECMAKE_ANDROID_ARM_NEON 变量。

CMAKE_ANDROID_NDK

设置为 Android NDK 根目录的绝对路径。如果未指定,将根据上述说明为该变量选择默认值。

CMAKE_ANDROID_NDK_DEPRECATED_HEADERS

设置为真值以使用已弃用的每个 API 级别的标头,而不是统一标头。如果未指定,则默认为假,除非使用的 NDK 不提供统一标头。

CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION

在 NDK r19 或更高版本上,此变量必须未设置或设置为 clang。在 NDK r18 或更低版本上,将其设置为要选择为编译器的 NDK 工具链版本。如果未指定,则默认为可用的最新 GCC 工具链。

CMAKE_ANDROID_STL_TYPE

设置为指定要使用的 C++ 标准库。如果未指定,将根据变量文档所述选择一个默认值。

以下变量将自动计算并提供:

CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

NDK 工具链中 binutils 的绝对路径前缀。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX

NDK 工具链中 binutils 的宿主平台后缀。

例如,工具链文件可能包含:

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21) # API level
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_ANDROID_NDK /path/to/android-ndk)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

或者,也可以在不使用工具链文件的情况下指定这些值。

$ cmake ../src \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=21 \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=/path/to/android-ndk \
  -DCMAKE_ANDROID_STL_TYPE=gnustl_static

使用独立工具链进行 Android 交叉编译

工具链文件可以配置 Makefile 生成器Ninja 生成器,以使用独立工具链针对 Android 进行交叉编译。

使用以下变量配置 Android 独立工具链的使用:

CMAKE_SYSTEM_NAME

设置为 Android。必须指定此项以启用 Android 交叉编译。

CMAKE_ANDROID_STANDALONE_TOOLCHAIN

设置为独立工具链根目录的绝对路径。必须存在 ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/sysroot 目录。如果未指定,将根据上述说明为该变量选择默认值。

CMAKE_ANDROID_ARM_MODE

当独立工具链针对 ARM 时,可选择将此项设置为 ON 以针对 32 位 ARM 而非 16 位 Thumb。有关详细信息,请参阅变量文档。

CMAKE_ANDROID_ARM_NEON

当独立工具链针对 ARM v7 时,可选择将此项设置为 ON 以针对 ARM NEON 设备。有关详细信息,请参阅变量文档。

以下变量将自动计算并提供:

CMAKE_SYSTEM_VERSION

从独立工具链检测到的 Android API 级别。

CMAKE_ANDROID_ARCH_ABI

从独立工具链检测到的 Android ABI。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

独立工具链中 binutils 的绝对路径前缀。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX

独立工具链中 binutils 的宿主平台后缀。

例如,工具链文件可能包含:

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_ANDROID_STANDALONE_TOOLCHAIN /path/to/android-toolchain)

或者,也可以在不使用工具链文件的情况下指定这些值。

$ cmake ../src \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/path/to/android-toolchain

使用 NVIDIA Nsight Tegra Visual Studio Edition 进行 Android 交叉编译

用于配置 Visual Studio 生成器 之一以使用 NVIDIA Nsight Tegra 针对 Android 进行构建的工具链文件可能如下所示:

set(CMAKE_SYSTEM_NAME Android)

可以设置 CMAKE_GENERATOR_TOOLSET 以选择 Nsight Tegra“工具链版本”值。

另请参阅目标属性:

面向 iOS、tvOS、visionOS 或 watchOS 的交叉编译

对于面向 iOS、tvOS、visionOS 或 watchOS 的交叉编译,推荐使用 Xcode 生成器。也可以使用 Unix MakefilesNinja 生成器,但它们要求项目自行处理目标 CPU 选择和代码签名等更多领域。

通过将 CMAKE_SYSTEM_NAME 变量设置为下表中的值,可以针对任何 Apple 设备平台进行构建。默认情况下,选择最新的设备 SDK。对于所有 Apple 平台,可以通过设置 CMAKE_OSX_SYSROOT 变量来选择不同的 SDK(例如模拟器),尽管这通常没有必要(请参阅下方的 在设备与模拟器之间切换)。可通过运行 xcodebuild -showsdks 获取可用 SDK 的列表。

操作系统

CMAKE_SYSTEM_NAME

设备 SDK(默认)

模拟器 SDK

Catalyst SDK

iOS

iOS

iphoneos

iphonesimulator

macosx

tvOS

tvOS

appletvos

appletvsimulator

不适用

visionOS

visionOS

xros

xrsimulator

不适用

watchOS

watchOS

watchos

watchsimulator

不适用

例如,要为 iOS 创建 CMake 配置,使用以下命令即可:

cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS

CMAKE_OSX_ARCHITECTURES 变量可用于设置设备和模拟器的架构。CMAKE_OSX_DEPLOYMENT_TARGET 变量可用于设置 iOS/tvOS/visionOS/watchOS 的部署目标。

下一个示例为 iOS 库安装了包含五种架构的通用二进制文件。它在适当的地方添加了相关的 -miphoneos-version-min=9.3-mios-simulator-version-min=9.3 编译器标志。请注意,示例中使用的 CMAKE_IOS_INSTALL_COMBINED 变量现已弃用,因此不再推荐使用此方法。

$ cmake -S. -B_builds -GXcode \
    -DCMAKE_SYSTEM_NAME=iOS \
    "-DCMAKE_OSX_ARCHITECTURES=armv7;armv7s;arm64;i386;x86_64" \
    -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
    -DCMAKE_INSTALL_PREFIX=`pwd`/_install \
    -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
    -DCMAKE_IOS_INSTALL_COMBINED=YES

示例

# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(foo)
add_library(foo foo.cpp)
install(TARGETS foo DESTINATION lib)

安装

$ cmake --build _builds --config Release --target install

检查库

$ lipo -info _install/lib/libfoo.a
Architectures in the fat file: _install/lib/libfoo.a are: i386 armv7 armv7s x86_64 arm64
$ otool -l _install/lib/libfoo.a | grep -A2 LC_VERSION_MIN_IPHONEOS
      cmd LC_VERSION_MIN_IPHONEOS
  cmdsize 16
  version 9.3

代码签名

某些嵌入式 Apple 平台的构建构件需要强制代码签名。如果正在使用 Xcode 生成器且需要或希望进行代码签名,则可以通过 CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM CMake 变量指定开发团队 ID。此团队 ID 随后将包含在生成的 Xcode 项目中。默认情况下,CMake 会避免在内部配置阶段(即编译器标识和特性检测)进行代码签名。

在设备与模拟器之间切换

在为任何嵌入式平台进行配置时,可以选择针对真实设备或模拟器进行构建。两者都有各自独立的 SDK,但 CMake 仅支持在配置阶段指定单个 SDK。这意味着开发人员必须在配置时选择其一。使用 Xcode 生成器时,这限制较少,因为 Xcode 仍然允许构建用于设备或模拟器,即使配置仅针对其中之一执行。在 Xcode IDE 中,构建是针对所选的“目标”平台执行的。从命令行构建时,可以通过向底层构建工具(xcodebuild)传递 -sdk 选项来直接指定所需的 sdk。例如:

$ cmake --build ... -- -sdk iphonesimulator

请注意,配置期间所做的检查是针对配置时 SDK 执行的,可能并不适用于其他 SDK。诸如 find_package()find_library() 等命令仅存储并使用已配置 SDK/平台的信息,因此如果希望在设备和模拟器构建之间切换,它们可能会出现问题。您可以遵循以下规则使设备+模拟器的配置工作:

  • 使用显式的 -l 链接器标志,例如 target_link_libraries(foo PUBLIC "-lz")

  • 使用显式的 -framework 链接器标志,例如 target_link_libraries(foo PUBLIC "-framework CoreFoundation")

  • 仅将 find_package() 用于通过 CMAKE_IOS_INSTALL_COMBINED 特性安装的库。

面向 Emscripten 的交叉编译

版本 4.2 中添加。

工具链文件可以通过将 CMAKE_SYSTEM_NAME 变量设置为 Emscripten 来配置面向 Emscripten 的交叉编译。例如,工具链文件可能包含:

set(CMAKE_SYSTEM_NAME Emscripten)
set(CMAKE_C_COMPILER /path/to/emcc)
set(CMAKE_CXX_COMPILER /path/to/em++)

使用瑞萨(Renesas)编译器进行交叉编译

对于使用瑞萨编译器进行交叉编译,至少指定:

CMAKE_SYSTEM_NAME

设置为 Generic。必须指定此项以启用交叉编译。

CMAKE_C_COMPILER

设置为瑞萨 C 编译器的路径,例如 ccrxccrlccrh

CMAKE_C_FLAGS

设置为编译器所需的 -isa=-cpu= 标志。

请参阅以下章节中的工具链文件示例。

瑞萨 CC-RX

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrx.exe")
set(CMAKE_ASM_COMPILER "ccrx.exe") # if using ASM language
set(CMAKE_C_FLAGS "-isa=rxv3") # specify the version of target RX CPU
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=<your linker option here>")

瑞萨 CC-RL

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrl.exe")
set(CMAKE_ASM_COMPILER "ccrl.exe") # if using ASM language
set(CMAKE_C_FLAGS "-cpu=S3") # specify the version of target RL CPU
# To avoid test executable runs out of const section's size.
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# Specifying device file and section layout linker options through compiler driver.
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=-device=dr5f10y14.dvf -lnkopt=-auto_section_layout")

瑞萨 CC-RH

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrh.exe")
set(CMAKE_ASM_COMPILER "ccrh.exe") # if using ASM language
set(CMAKE_C_FLAGS "-Xcommon=rh850") # specify the version of target RH850 CPU
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=<your linker option here>")