参数化自定义CMake工具链
Parameterizing custom CMake toolchain
我正在编写用于交叉编译的CMake工具链文件。
我有几个工具链,差别很小。我想为cmake创建一个单独的文件,描述所有工具链,并让用户从命令行指定它们:cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -DTOOLCHAIN_NAME=<name>
然而,似乎TOOLCHAIN_NAME
有时会变成一个空字符串。
以下是工具链文件的示例:
set(tools /opt/toolchains/Custom/toolchains/toolchain)
set(sdk /opt/toolchains/Custom/platforms/)
message(STATUS "toolchain_name ${TOOLCHAIN_NAME}")
if(NOT TOOLCHAIN_NAME)
message(SEND_ERROR "Please specify toolchain name in -DTOOLCHAIN_NAME parameter")
endif()
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
# further processing
然后我打电话给CMake:
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake -DTOOLCHAIN_NAME=proc-os-gnueabi-gcc_6_3
并获得以下错误输出:
-- toolchain name proc-os-gnueabi-gcc_6_3
-- toolchain name proc-os-gnueabi-gcc_6_3
-- The C compiler identification is GNU 6.3.1
-- The CXX compiler identification is GNU 6.3.1
-- Check for working C compiler: /opt/toolchains/.../bin/arm-os-gnueabi-gcc
CMake Error at /home/user/project/cmake/toolchain.cmake:59 (message):
Please specify toolchain name in -DTOOLCHAIN_NAME parameter
Call Stack (most recent call first):
/home/user/project/build/CMakeFiles/3.15.4/CMakeSystem.cmake:6 (include)
/home/user/project/build/CMakeFiles/CMakeTmp/CMakeLists.txt:2 (project)
CMake Error at /usr/local/share/cmake-3.15/Modules/CMakeTestCCompiler.cmake:44 (try_compile):
Failed to configure test project build system.
Call Stack (most recent call first):
CMakeLists.txt:15 (project)
-- Configuring incomplete, errors occurred!
See also "/home/user/project/build/CMakeFiles/CMakeOutput.log".
See also "/home/user/project/build/CMakeFiles/CMakeError.log".
CMakeOutput.log和CMakeError.log包含消息,表示编译器找不到某些库。
如果我打开生成的文件/home/user/project/build/CMakeFiles/3.15.4/CMakeSystem.cmake
,我可以看到以下
set(CMAKE_HOST_SYSTEM "Linux-4.2.0-27-generic")
set(CMAKE_HOST_SYSTEM_NAME "Linux")
set(CMAKE_HOST_SYSTEM_VERSION "4.2.0-27-generic")
set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64")
include("/home/user/project/cmake/toolchain.cmake")
set(CMAKE_SYSTEM "Generic")
set(CMAKE_SYSTEM_NAME "Generic")
set(CMAKE_SYSTEM_VERSION "")
set(CMAKE_SYSTEM_PROCESSOR "ARM")
set(CMAKE_CROSSCOMPILING "TRUE")
set(CMAKE_SYSTEM_LOADED 1)
根据CMake手册,其-D
参数用于指定缓存条目。
我从上面的输出中得出结论,CMake至少处理了3次所提供的工具链文件。在前两次运行中,有适当的缓存条目,而在第三次运行时,它们不存在。
那么,如何避免工具链文件的代码重复呢?
UPD。看完这个问题后,我尝试了几种CMake命令行参数的排列:在工具链之后但在选项之前指定源路径,在选项之后指定,用-S
和-B
选项显式指定源路径和构建路径。没有任何帮助。
我从上面的输出中得出结论,CMake至少处理了3次所提供的工具链文件。前两次有适当的缓存条目,第三次运行时没有。
是的,这是一个很好的观察结果。从技术上讲,只有project()
调用时的第一个工具链调用才能保证看到CACHE条目(在project()
调用之前用-D
参数到cmake
或用set()
命令创建(。
在不同的工具链调用之间传递CACHE条目的一种方法是将它们存储在环境变量中:
以下示例使用MY_TOOLCHAIN_NAME
环境变量作为TOOLCHAIN_NAME
CMake变量的存储。
if(DEFINED ENV{MY_TOOLCHAIN_NAME})
# Environment variable is set.
if (TOOLCHAIN_NAME)
# CMake variable is set too.
# It is up to your which one to use.
# Uncomment line below for prefer environment variable to CMake one.
# set(TOOLCHAIN_NAME $ENV{MY_TOOLCHAIN_NAME})
else ()
# CMake variable is not set. Use environment one.
set(TOOLCHAIN_NAME $ENV{MY_TOOLCHAIN_NAME})
endif()
else()
# Environment variable is not set.
if (TOOLCHAIN_NAME)
# But CMake variable is set.
# Store it into the environment and use it.
set(ENV{MY_TOOLCHAIN_NAME} ${TOOLCHAIN_NAME})
else()
# Neither environment nor CMake variable is set.
message(SEND_ERROR "Please specify toolchain name in -DTOOLCHAIN_NAME parameter")
endif()
endif()
如果你有几个";调谐";变量,您可以为上述所有步骤编写一个宏,并为您需要的每个变量应用(调用(此宏。
- 参数化自定义CMake工具链
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- CMake 工具链文件:嵌入式开发的适当值"CMAKE_SYSTEM_PROCESSOR"
- cmake在构建过程中使用另一个工具检测标志
- 将 cmake 链接到 Visual Studio 的 cmake 工具
- 错误:必须设置CMake工具才能生成.在工具包选项中配置CMake工具
- 如何在cmake工具链文件中设置编译功能,以便已知的自定义编译器使用target_compile_features
- 链接库作为 CMAKE 中工具链文件中标志的一部分
- 如何获取cmake工具链文件中的项目根目录,这可能吗
- 我可以通过设置工具链文件来替换调用 cmake -G<generator> 选项和调用 vcvarsall.bat吗?
- 将Java包移植到C++并使用Cmake作为构建工具
- 如何让 CMAKE 使用 MSYS2 (MINGW) 下的 GNU 工具堆栈
- 与 CLION、CMAKE、WSL 和自定义 Angstrom 工具链交叉编译 - "CLION TEST"期间的问题
- 发现Cmake是通过SDK工具安装的
- CMake 与Microsoft可视化C++构建工具
- 使Visual Studio的CMake工具在构建解决方案时运行INSTALL
- 如何为 VxWorks 创建 CMake 交叉编译工具链?
- 扩展安装工具扩展以在 setup.py 中使用 CMake
- 包括通过CMAKE工具链正确版本的STL标题
- 如何使用 CMake 设置 VS 平台工具集属性