CMake中所有CMAKE_前缀变量是否自动定义?含CMAKE_EXPORT_COMPILE_COMMANDS
核心结论
不是所有CMAKE_前缀的变量都会被CMake运行时隐式定义,你的判断逻辑失效的原因可以从内置变量的规则和正确实现方式两部分说明:
1. 内置CMAKE_变量的定义规则
CMake的CMAKE_前缀内置变量分为两类:
- 带默认值的内置变量:比如你用到的
CMAKE_EXPORT_COMPILE_COMMANDS,在支持该特性的CMake版本(3.5+)中,即使你没有主动设置,CMake也会在启动后隐式将其定义为默认值FALSE,因此你写的if(NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS)判断永远不会触发,这就是你现有逻辑不符合预期的直接原因。 - 无默认值的内置变量:比如
CMAKE_CXX_STANDARD_REQUIRED这类,你不主动设置的话不会被隐式定义。
2. 实现「仅当变量未通过命令行设置时赋值」的正确写法
你需要区分「CMake隐式定义的普通变量」和「用户通过命令行传入的缓存变量」:所有用户通过-D <VAR>=<VALUE>传入的变量都会被写入CMake缓存,因此只要判断缓存中是否存在该变量即可满足你的需求,正确代码如下:
# 仅当用户未通过命令行设置CMAKE_EXPORT_COMPILE_COMMANDS时,赋值为ON if(NOT DEFINED CACHE{CMAKE_EXPORT_COMPILE_COMMANDS}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "Export compile commands for clangd/IDE integration" FORCE) endif()
内容的提问来源于stack exchange,提问作者Philip Oakley
相关产品推荐
相关产品推荐

