作为构建过程的一部分,我们需要记录机器和编译器的细节。由于可以通过设置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会出错),但开发人员更有可能编辑工具链。 file(然后/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无法看到它们的方式内化其变量的值?
答案 0 :(得分:0)
您需要将此变量写入缓存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: ...