【问题标题】:moving CMake options from the command line into the top-level CMakeLists.txt将 CMake 选项从命令行移动到顶级 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

很遗憾,该选项不起作用。

【问题讨论】:

  • 因为 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.

标签: cmake dcmtk


【解决方案1】:

一般来说,使用 CMake 有两点需要牢记:

  1. CMake 是一种脚本语言,因此所有代码都是按顺序处理的
  2. 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) 以查找隐藏/覆盖变量的代码部分。

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2011-08-25
    • 2015-11-17
    相关资源
    最近更新 更多