如何检查 cmake 内部变量?

     2023-02-23     151

关键词:

【中文标题】如何检查 cmake 内部变量?【英文标题】:How can I inspect cmake internal variables? 【发布时间】:2014-02-13 19:15:53 【问题描述】:

作为我们构建过程的一部分,我们需要记录机器和编译器的详细信息。由于可以通过设置 CMAKE_CXX_COMPILER 从系统默认值更改编译器,我认为检测编译器最安全的方法是询问 cmake 自己它正在使用什么。

这是我们用于项目的工具链文件的(重要部分):

SET(CMAKE_CXX_FLAGS "-std=c++11")
SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_OSX_ARCHITECTURES "x86_64" )
SET(CMAKE_CXX_COMPILER /usr/bin/clang++)
SET(CMAKE_C_COMPILER /usr/bin/clang)

所以现在我创建了一个 CMakeLists.txt 文件,与我们用于主项目的文件分开,如下所示:

cmake_minimum_required(VERSION 2.8)
execute_process(COMMAND $CMAKE_CXX_COMPILER --version
   OUTPUT_VARIABLE cxx_version)
FILE(WRITE "/tmp/compiler.txt" "Compiler: $CMAKE_CXX_COMPILER is $cxx_version")

当我在这个 CMakeLists.txt 上运行 cmake 并将它传递给工具链文件时,我有一个相当安全的方法来确定哪个编译器用于主项目。也就是说,虽然有些马虎的开发人员可能会在主项目的命令行中添加“-DCMAKE_CXX_COMPILER”(然后 /tmp/compiler.txt 会出错),但开发人员更有可能编辑工具链文件(然后 /tmp/compiler.txt 将包含正确的信息)。

问题是,我还想检查是否启用了 c++11,但是在我的 CMakeLists.txt 文件中,我无法检查任何 CMAKE 变量的设置。如果我这样做:

MESSAGE(STATUS "CMAKE_OSX_ARCHITECTURES are $CMAKE_OSX_ARCHITECTURES")
MESSAGE(STATUS "CMAKE_BUILD_TYPE is $CMAKE_BUILD_TYPE")
MESSAGE(STATUS "CMAKE_CXX_FLAGS are $CMAKE_CXX_FLAGS")

消息说所有这些值都是空的。如果我将一些我自己的值添加到我的工具链文件中并在我的 CMakeLists.txt 中打印出它们的值,它们是正确的,所以我知道正在处理工具链文件。

我已经看到一些提示,可能 cmake 正在丢弃 CMAKE_CXX_FLAGS 的值,因为我的 CMakeLists.txt 没有编译任何东西。这可能吗?还是 cmake 只是以我的 CMakeLists.txt 看不到它们的方式内化其变量的值?

【问题讨论】:

在我的工具链文件中使用“CACHE STRING”解决了这个问题,虽然我不确定它是否是正确的解决方案......想法? 【参考方案1】:

需要将此变量写入缓存,example:

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11" CACHE STRING "some info" FORCE)

请注意,project 命令后标志更新:

message("release flags: $CMAKE_CXX_FLAGS_RELEASE")
cmake_minimum_required(VERSION 2.8.4)
project(foo CXX)
message("release flags: $CMAKE_CXX_FLAGS_RELEASE")

输出:

release flags:
-- The CXX compiler identification is GNU 4.8.2
-- Check for working CXX compiler: /usr/bin/c++.exe
-- Check for working CXX compiler: /usr/bin/c++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
release flags: -O3 -DNDEBUG
-- Configuring done
-- Generating done
-- Build files have been written to: ...

【讨论】:

AS3:如何从影片剪辑内部检查和重置主时间轴上的变量

】AS3:如何从影片剪辑内部检查和重置主时间轴上的变量【英文标题】:AS3:HowdoIcheckandresetvariableonthemaintimelinefrominsideamovieclip【发布时间】:2011-01-1513:48:57【问题描述】:我正在将旧的AS2文件转换为AS3(并尝试同时学习AS3)。影... 查看详情

如何将 cpplint.py 检查添加到 CMake 中?

】如何将cpplint.py检查添加到CMake中?【英文标题】:Howtoaddcpplint.pycheckintoCMake?【发布时间】:2021-02-0714:18:42【问题描述】:我是CMake的新手。在我之前的编译工具waf.它为我提供了一个cpplint.py脚本,可以检查cpp源文件的格式,如... 查看详情

如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?

】如何在CMakeGUI中显示FooConfig.cmake文件中的CMake变量?【英文标题】:HowtodisplayCMakevariablesfromFooConfig.cmakefileinCMakeGUI?【发布时间】:2020-02-1621:45:14【问题描述】:我最近开始使用现代CMake原则并在我的项目中包含配置文件。尽管我... 查看详情

如何知道 CMake 中的“OpenCV”等变量

】如何知道CMake中的“OpenCV”等变量【英文标题】:Howtoknowvariablesuchas\'OpenCV\'inCMake【发布时间】:2018-01-1606:58:51【问题描述】:我将OpenCV与gcc和cmake一起使用。并且找到了一个教程https://docs.opencv.org/3.4.0/db/df5/tutorial_linux_gcc_cmake.ht... 查看详情

如何去除 CMake 变量中的尾随空格?

】如何去除CMake变量中的尾随空格?【英文标题】:HowtostriptrailingwhitespaceinCMakevariable?【发布时间】:2017-01-2214:10:27【问题描述】:我们正在尝试改进CMake生成的makefile。对于Clang、GCC和ICC,我们要添加-march=native。这样做的块看起... 查看详情

cmake入门——简单cmakelists的编写(代码片段)

...平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码。与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来... 查看详情

如何在 Xcode 中调试内部类

】如何在Xcode中调试内部类【英文标题】:HowtodebuginsideclassesinXcode【发布时间】:2014-01-0800:41:01【问题描述】:我正在使用Xcode5.0.2调试一个简单的应用程序。当我尝试检查类的内容时,调试器似乎不知道如何显示该类。例如,我... 查看详情

cmakeset命令

1normalvariable、cachevariable、environmentvariable1.1什么是普通的cmake变量1.2什么是cmakecache变量1.3什么是cmake环境变量1.4普通的cmake变量、cmakecache变量和cmake环境变量有什么区别 2如何设置cmake的普通变量、cache变量和环境变量?  查看详情

cmake:从内部 .cmake 打印消息

】cmake:从内部.cmake打印消息【英文标题】:cmake:printmessagesfrominternal.cmake【发布时间】:2016-02-1808:57:58【问题描述】:我正在尝试调试在makepackage期间遇到的问题:CMakeErrorat/usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake:8... 查看详情

如何使用 CMake 在 Visual Studio 2017 RC1 中设置环境变量?

】如何使用CMake在VisualStudio2017RC1中设置环境变量?【英文标题】:HowtosetenvironmentvariablesinVisualStudio2017RC1usingCMake?【发布时间】:2017-04-2622:27:39【问题描述】:我正在使用VisualStudio2017RC1使用新的“打开文件夹”功能加载CMake项目(C+... 查看详情

cmake基础教程cmake生成debug和release两个版本程序(如何编译-g版本)(代码片段)

本文是历史经验总结,对你绝对有很大的帮助。这是cmake的一个神坑。可以通过设置变量CMAKE_BUILD_TYPE生成debug版和release版的程序。该变量可以的取值是DebugReleaseRelWithDebInfo和MinSizeRel。当这个变量值为Debug的时候,CMake会使用变量CMAK... 查看详情

如何实现对象内部插槽属性

】如何实现对象内部插槽属性【英文标题】:Howtoimplementobjectinternalslotproperty【发布时间】:2019-01-2401:27:24【问题描述】:我知道一些Javascript对象有一些内部插槽属性,用方括号[[]]包围,并且只能通过方法访问。例如:varstr=newSt... 查看详情

camke中关于变量的一些知识

...>_BINARY_DIR和<projectname>_SOURCE_DIR两个变量。采用的是内部编译 查看详情

如果存在,如何检查内部和外部存储

】如果存在,如何检查内部和外部存储【英文标题】:howtocheckinternalandexternalstorageifexist【发布时间】:2011-11-2820:09:35【问题描述】:我怎么知道android中是否有内部和外部存储?有谁知道如何检查内部和外部存储提前致谢【问题... 查看详情

如何使用构建器模拟内部变量(代码片段)

...ssion.builder().attributeA(input.getA()).build();s.attributeB("someValue");如何编写测试以验证SessionS是否设置了字段A和B?谢谢!答案基本上你可以验证两件事:input.getA():模拟你提供给你的代码的SomeInput实例,然后你可以在以后验证该模拟对... 查看详情

如何检查外部数组内部的内部数组? (加号 => 功能)

】如何检查外部数组内部的内部数组?(加号=>功能)【英文标题】:Howtocheckinnerarraysthatinsideofouterarray?(Plus=>function)【发布时间】:2019-03-2223:49:53【问题描述】:对不起,如果这些问题是JS的基础知识之一。问题1。我正在尝... 查看详情

java示例代码_:如何终止循环内部条件检查

java示例代码_:如何终止循环内部条件检查 查看详情

cmake知识整理(代码片段)

...建选项CMake文本内置命令CMake工程内置命令CMaketoolchainsCMake变量--信息描述部分CMake变量--动作行为部分CMake变量--系统描述部分CMake变量--构建控制部分CMake变量--编程语言部分CMake变量--CTest部分CMake变量--CPack部分CMake官方文档C 查看详情