从父CMakeLists.txt覆盖CMake中的默认选项(...)值

时间:2010-09-22 06:13:59

标签: c++ build build-process cmake

我正在尝试在源代码树中包含多个第三方库,只需对其构建系统进行最少的更改,以便于升级。他们都像我一样使用CMake,所以在我自己的CMakeLists.txt中我可以使用add_subdirectory(extern/foo)作为libfoo。

但是foo CMakeLists.txt编译测试工具,构建文档,我不需要的共享库,等等。 libfoo作者有远见控制这些via选项 - 例如option(FOO_BUILD_SHARED "Build libfoo shared library" ON) - 这意味着我可以通过CMake命令行设置它们。但我希望默认情况下关闭它,并通过命令行覆盖。

我在set(FOO_BUILD_SHARED OFF)之前尝试过add_subdirectory(extern/foo)。这样做的结果是在第二次和后续的构建尝试期间不尝试构建共享库,而不是在第一次构建尝试期间构建共享库,这是我真正需要加速的。

这可能吗,还是我需要为这些项目维护分叉的CMakeLists.txt?

2 个答案:

答案 0 :(得分:68)

尝试在CACHE中设置变量

SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")

注意:您需要指定变量类型和描述,以便CMake知道如何在GUI中显示此条目。

答案 1 :(得分:0)

这个问题虽然很老,但是Google却把我带到了这里。

SET(<variable name> <value> CACHE BOOL "" FORCE)的问题在于它将设置选项项目的范围。如果要使用子项目(即库),并且要使用BUILD_STATIC_LIBS为子项目(ParentLibrary)设置SET(... CACHE BOOL "" FORCE),则会为所有子项目设置值项目。

我正在使用以下项目结构:

|CMakeLists.txt (root)
|- dependencies
   | CMakeLists.txt (dependencies)
   |- ParentLibrary
      | CMakeLists.txt (parent)
|- lib
   | CMakeLists.txt (lib)

现在我有CMakeLists.txt (dependencies)了,像这样:

# Copy the option you want to change from ParentLibrary here
option (BUILD_SHARED_LIBS "Build shared libraries" ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(ParentLibrary)

优点是我不必修改ParentLibrary,并且只能为该项目设置选项。

有必要从option显式复制ParentLibrary命令,否则在执行CMake配置时,最初将首先由set命令设置变量的值,然后由值将被option命令覆盖,因为高速缓存中没有值。第二次执行CMake配置时,option命令将被忽略,因为高速缓存中已经有一个值,并且将使用set命令中的值。这将导致一些奇怪的行为,即两次CMake运行之间的配置会有所不同。