将 CMake 选项从命令行移动到*** CMakeLists.txt
Posted
技术标签:
【中文标题】将 CMake 选项从命令行移动到*** CMakeLists.txt【英文标题】:moving CMake options from the command line into the top-level CMakeLists.txt 【发布时间】:2015-10-29 17:55:39 【问题描述】:我正在使用命令行构建 DCMTK,使用以下命令:
cmake -DBUILD_APPS=BOOL:OFF ../latest_dcmtk
我想将 BUILD_APPS 设置从命令行移动到*** CMakeLists.txt 配置文件中。无论我如何尝试在***配置文件中设置 BUILD_APPS 选项,除非我从命令行显式设置 BUILD_APPS 选项,否则我永远不会得到正确的行为。
有没有办法从*** CMakeLists.txt 文件中显式设置命令行选项?
我从 DCMTK 资源中借用了这个,但它不起作用:
SET (BUILD_APPS OFF CACHE BOOL "" FORCE)
MESSAGE ("-- BUILD_APPS is set to " $BUILD_APPS)
当我查看由上面的 SET 命令生成的 CMakeCache.txt 文件时,我看到选项设置正确:
./CMakeCache.txt:BUILD_APPS:BOOL=OFF
很遗憾,该选项不起作用。
【问题讨论】:
请提供minimal reproducible example 因为 DCMTK 是一个体面的开源项目,我无法将代码精简为一个最小的示例。充其量,我可以提供*** CMake 配置文件。即使我给了你那个文件,你也需要一台 Mac 来构建等效的项目。 该示例只需要包含一个精简的 CMakeLists.txt 文件,并且该选项不起作用 使用命令option(BUILD_APPS "" OFF)
或set(BUILD_APPS OFF CACHE BOOL "")
(不需要FORCE)设置的选项等效于使用cmake
命令行选项-DBUILD_APPS=BOOL:OFF
设置的选项。如果第二种方法有效,但第一种方法无效,那么CMakeLists.txt
做了一些非常特别的事情。
可以肯定的是,我再次尝试了它,-D
确实强制缓存条目。所以使用-D
命令行选项和set(... FORCE)
应该没有区别。我同意有些事情很奇怪,并建议在主 CMakeLists.txt
的顶部添加 variable_watch(BUILD_APPS)
以查找隐藏/覆盖变量的代码部分。有关更多详细信息,请参见例如here.
【参考方案1】:
一般来说,使用 CMake 有两点需要牢记:
-
CMake 是一种脚本语言,因此所有代码都是按顺序处理的
CMake 的变量缓存用于在两次运行之间保持值
所以我同意@Tsyvarev 和@usr1234567 的观点,这很可能是一个订购问题:
在您/代码检查if (BUILD_APPS)
之前,您必须执行set(BUILD_APPS OFF CACHE BOOL "" FORCE)
您必须检查在您的主 CMakeLists.txt
隐藏您的缓存变量之后没有正常变量 set(BUILD_APPS ...)
CMakeCache.txt
文件中的任何内容都只是代码处理完成后这些变量的状态(在主 CMakeLists.txt
的末尾)
我又试了一次,-D
确实强制缓存条目。所以使用-D
命令行选项和set(... CACHE ... FORCE)
应该没有区别。只是你不能组合使用它们(后者总是会覆盖任何命令行给定选项)。
请尝试在主CMakeLists.txt
顶部添加variable_watch(BUILD_APPS)
以查找隐藏/覆盖变量的代码部分。
参考文献
What's the CMake syntax to set and use variables? CMake: In which Order are Files parsed (Cache, Toolchain, …)?【讨论】:
以上是关于将 CMake 选项从命令行移动到*** CMakeLists.txt的主要内容,如果未能解决你的问题,请参考以下文章
Windows安装部署yahoo的cmak运行时报错:输入行太长,命令语法不正确
MAC: CMake compile CloudCompare error:By not providing "FindQt5PrintSupport.cmake" in CMAK