CMake 排除子模块目标



>我按照此处描述的模式将 glfw 作为子模块导入我的项目中

find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
# Update submodules as needed
option(GIT_SUBMODULE "Check submodules during build" ON)
if(GIT_SUBMODULE)
message(STATUS "Submodule update")
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE GIT_SUBMOD_RESULT)
if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}, please checkout submodules")
endif()
endif()
endif()
## Check for GLFW
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/glfw/CMakeLists.txt")
message(FATAL_ERROR "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.")
else()
add_subdirectory(glfw EXCLUDE_FROM_ALL)
endif()

如您所见,我将该项目包含在add_subdirectory().这有效地添加了 glfw 目标,我可以将其与我的目标链接,但它也包括所有 glfw 目标(文档、示例等(。

当然,我以错误的方式包含该项目,我不知道。

有没有办法从子模块包含并排除其他目标?

显然EXCLUDE_FROM_ALL不起作用。

您可以从命令行覆盖 GLFWCMakeLists.txt文件中定义的选项。这将关闭额外的构建:

cmake -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF ..

如果要通过编辑顶级 CMake 文件来覆盖默认的 GLFW 选项,可以按照 Biscuits 建议@Cinder操作,但在add_subdirectory()调用之前放置set()命令:

## Check for GLFW
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/glfw/CMakeLists.txt")
message(FATAL_ERROR "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.")
else()
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build GLFW without examples")
set(GLFW_BUILD_TESTS OFF CACHE BOOL "Build GLFW without tests")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "Build GLFW without docs")
add_subdirectory(glfw EXCLUDE_FROM_ALL)
endif()

从外观上看,您只需要告诉 CMake 不要通过在 CACHE 中设置这些选项来构建它们。 将其添加到您的 CMakeList 中.txt

set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build GLFW without examples")
set(GLFW_BUILD_TESTS OFF CACHE BOOL "Build GLFW without tests")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "Build GLFW without docs")

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

最新更新