是否可以使用add_subdirectory设置cmake变量?

Mai*_*ein 5 cmake

我目前正在使用add_subdirectory(${CMAKE_SOURCE_DIR}/ext/glfw)glfw添加到我的项目中.

问题是,一旦我做cmake .. &&使它总是构建所有的例子,我不希望这发生.

在glfw的cmake文件中有

option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
Run Code Online (Sandbox Code Playgroud)

是否可以OFF从我的CMakeLists.txt 设置此变量?

kdo*_*pen 7

简单地做两个

set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build the GLFW example programs")
Run Code Online (Sandbox Code Playgroud)

add_subdirectory命令或之前

cmake -DGLFW_BUILD_EXAMPLES:BOOL=OFF ..
Run Code Online (Sandbox Code Playgroud)

在命令行上

例如,给出以下两个CMake脚本

cmake_minimum_required(VERSION 2.8)
project(test)

set(OVERRIDE FALSE CACHE BOOL "")

if(OVERRIDE)
    message(STATUS "Overriding option")
    set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build the GLFW example programs")
endif()

message(STATUS "OPT BEFORE =${GLFW_BUILD_EXAMPLES}")
add_subdirectory(subdir)
message(STATUS "OPT AFTER=${GLFW_BUILD_EXAMPLES}")
Run Code Online (Sandbox Code Playgroud)

和subdir/CMakeLists.txt

option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON)
Run Code Online (Sandbox Code Playgroud)

您会看到以下内容(在构建目录中运行时)

如果没有命令行选项,该option()命令将设置变量

$ rm -rf *
$ cmake ..
...
-- OPT BEFORE =
-- OPT AFTER=ON
-- Configuring done
-- Generating done
Run Code Online (Sandbox Code Playgroud)

打开set()覆盖,命令会覆盖该option()命令

$ rm -rf *
$ cmake .. -DOVERRIDE=ON
...
-- Overriding option
-- OPT BEFORE =OFF
-- OPT AFTER=OFF
-- Configuring done
-- Generating done
Run Code Online (Sandbox Code Playgroud)

您也可以option()直接在命令行上覆盖.

$ rm -rf *
$ cmake .. -DGLFW_BUILD_EXAMPLES=OFF
...
-- OPT BEFORE =OFF
-- OPT AFTER=OFF
-- Configuring done
-- Generating done
Run Code Online (Sandbox Code Playgroud)

请注意,我rm -rf *每次都在构建目录中执行此操作.值的值GLFW_BUILD_EXAMPLES缓存在一个名为的文件中CMakeCache.txt.CMake将始终使用在a setoption命令中设置的任何内容之前找到的值.

  • 删除构建目录中CMakeCache.txt中的缓存变量 (4认同)