【发布时间】: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.