将 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的主要内容,如果未能解决你的问题,请参考以下文章

向 CMake 添加命令行选项

LLVM的安装

传递编译器选项 cmake

Windows安装部署yahoo的cmak运行时报错:输入行太长,命令语法不正确

为 cmake 指定库以从命令行链接到

MAC: CMake compile CloudCompare error:By not providing "FindQt5PrintSupport.cmake" in CMAK