【问题标题】:Override option in CMake subprojectCMake 子项目中的覆盖选项
【发布时间】:2012-12-13 06:03:13
【问题描述】:

我正在尝试重用我不想更改其来源的第三方项目的CMakeLists.txt(确切地说是expat)。我已使用 add_subdirectory 将该项目添加为顶层的子项目。

这可行,但现在我想在顶层CMakeLists.txt 中设置一些子项目的options 的值。我该怎么做?

【问题讨论】:

标签: cmake project option


【解决方案1】:

请参阅the similar question 并获得好的答案。

简答:

SET(SOME_EXPAT_OPTION OFF CACHE BOOL "Use some expat option")

【讨论】:

  • 由于某种原因,这不适用于我的情况下的 Visual Studio 生成器(CMake 3.4.0),但适用于 Makefiles 生成器。其他答案建议使用适用于 Visual Studio 和 Makefiles 生成器的 option
  • 我们如何从命令行执行它?我有一组用于 LLVM 调用 cmake 的选项,但一个子项目似乎需要一个额外的选项。
  • @ronkot 就像在您的链接答案中一样,我想补充一点,有时需要在描述字符串之后添加 FORCE 作为附加参数。
【解决方案2】:

如果子项目使用option(不是set)进行配置设置,那么您可以在添加子目录之前使用option指定值:

option(LIB_OPTION1 "" OFF)
option(LIB_OPTION2 "" ON)
add_subdirectory(${CMAKE_SOURCE_DIRECTORY}/lib)

【讨论】:

  • 如果子项目不使用option,而是使用set,有没有办法在不使用缓存的情况下覆盖set的现有使用?
【解决方案3】:

您可以在调用ADD_SUBDIRECTORY 之前使用所需的设置(ON 或OFF)定义选项。这将优先于 expat 的 CMakeLists.txt 中的 OPTION 命令,因为 OPTION 的最后一个参数只是一个 默认 值(如果该设置已经存在,则忽略该值)。

【讨论】:

  • 我试过了,但没有效果。我认为诀窍是在@kullero 的回答中使用CACHE
  • @thehouse 我很确定OPTION 命令缓存了它的效果,我刚刚尝试过,它可以工作。当然,该值可能不在缓存中,但对于SET 命令也是如此,除非您使用FORCE。我不得不承认SET 方式更通用,因为OPTION 只允许布尔值,但最终这就是你所要求的。
  • 对不起,我误解了您的原始答案。我以为您的意思是使用SET 定义选项。我明白你现在的意思了。
【解决方案4】:

SET 命令具有“PARENT_SCOPE”选项:

If PARENT_SCOPE is present, the variable will be set in the scope above the current
scope. Each new directory or function creates a new scope. This command will set the 
value of a variable into the parent directory or calling function (whichever is 
applicable to the case at hand). PARENT_SCOPE cannot be combined with CACHE.

(见:http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:set

【讨论】:

  • 这不与我所追求的相反吗?我试图在父作用域中获取一个变量来影响子作用域。
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2016-11-29
  • 1970-01-01
相关资源
最近更新 更多