【问题标题】:CMake exclude submodule targetsCMake 排除子模块目标
【发布时间】:2020-01-13 17:31:41
【问题描述】:

我在我的项目中导入 glfw 作为子模块,遵循here 描述的模式

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 不起作用。

【问题讨论】:

    标签: cmake target glfw


    【解决方案1】:

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

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

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

    ## 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()
    

    【讨论】:

      【解决方案2】:

      From the looks of it,您只需要通过在 CACHE 中设置这些选项来告诉 CMake 不要构建它们。将此添加到您的 CMakeLists.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 中显示此条目。

      【讨论】:

      • 我在add_subdirectory(glfw EXCLUDE_FROM_ALL) 之后添加了这些行,但没有用,仍然出现在项目构建中,cmake 为该目标保留名称“docs”
      • 你必须将它们放在add_subdirectory()之前,否则直到处理完子目录后才会读取它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多