在CMake子项目中覆盖选项

the*_*use 18 project cmake option

我正在尝试重复使用CMakeLists.txt我不想改变的第三方项目(expat,确切地说).我已将该项目添加为顶级子项目使用add_subdirectory.

这有效,但现在我想option在顶层设置一些子项目的值CMakeLists.txt.我该怎么做呢?

ron*_*kot 29

看到类似的问题 并给出了一个好的答案.

简而言之:

SET(SOME_EXPAT_OPTION OFF CACHE BOOL "Use some expat option")
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,在我的情况下(CMake 3.4.0),这对Visual Studio生成器不起作用,但对Makefile生成器工作正常.其他答案建议使用*选项*,适用于Visual Studio和Makefile生成器. (8认同)
  • @ronkot就像在您链接的答案中一样,我想补充一点,有时有必要在描述字符串之后添加“FORCE”作为附加参数。 (2认同)

Dre*_*kes 20

如果子项目使用option(而不是set)其配置设置,则可以option在添加子目录之前指定值:

option(LIB_OPTION1 "" OFF)
option(LIB_OPTION2 "" ON)
add_subdirectory(${CMAKE_SOURCE_DIRECTORY}/lib)
Run Code Online (Sandbox Code Playgroud)

  • 请注意`OPTION` https://cmake.org/cmake/help/v3.1/command/option.html`选项(LIB_OPTION2 ON)`的文档实际上默认将`LIB_OPTION2`设置为'OFF`,因为` ON`将被视为评论参数. (3认同)

Joh*_* S. 5

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