首页 > 解决方案 > 使用 CMake 构建和缓存与主要目标隔离的外部项目依赖项

问题描述

我有一个如下所示的目录结构:

- src/
   - *.h & *.cpp files
- third_party/
    - webrtc/
        - CMakeLists.txt
- CMakeLists.txt

使用third_party/webrtc/CMakeLists.txtExternalProject_Add几个ExternalProject_Add_Step命令来下载和构建 webrtc。它还设置了两个指向库和包含目录的变量。

ExternalProject_Add(
        webrtc
        GIT_REPOSITORY https://chromium.googlesource.com/chromium/tools/depot_tools.git
        GIT_TAG ${DEPOT_TOOLS_GIT_REVISION}
        PREFIX ${CMAKE_CURRENT_BINARY_DIR}/depot_tools
        CONFIGURE_COMMAND ""
        UPDATE_COMMAND ""
        PATCH_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
)

ExternalProject_Add_Step(webrtc step-1 ...)
.
.
.
ExternalProject_Add_Step(webrtc step-N ...)

# The result of all the above steps is the libwebrtc.a library
set(WEBRTC_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/webrtc/src/dist/obj/libwebrtc.a)
set(WEBRTC_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/webrtc/src/include)

根级别CMakeLists.txt使我的项目依赖于外部 webrtc 项目,如下所示:

include(third_party/webrtc/CMakeLists.txt)
add_dependencies(MyGameServer webrtc)
include_directories(SYSTEM ${WEBRTC_INCLUDE})
target_link_libraries(MyGameServer PRIVATE ${WEBRTC_LIBRARY})

我从根目录像这样在本地构建MyGameServer,并且事情按预期工作:

cmake -B build
make -C build MyGameServer

由于 webrtc 的依赖性,第一次构建速度非常慢,但后续构建速度很快。这个工作流程一切都很好。

当我使用上述方法组装 Docker 映像时,就会出现问题。如前所述,webrtc 的构建速度很慢,所以我想避免在每次组装 Docker 映像时都这样做。谢天谢地,我很少更新 webrtc 相对于MyGameServer目标的源代码,所以我想利用 Docker 层缓存并webrtc在目标之前构建依赖关系MyGameServer。为了消除在我自己的源代码更改时重新构建 webrtc Docker 层的需要,我需要构建依赖项,而无需访问根目录CMakeLists.txt(它经常与我的源代码一起更改)。

现在我想我可以这样做:

cmake -B build third_party/webrtc
make -C build webrtc
** copy root CMakeLists.txt & src/ into Docker image **
cmake -B build

并期望 webrtc 依赖项已经被构建、缓存和等待,但我最终得到了一个错误:

CMake 错误:源“/CMakeLists.txt”与用于生成缓存的源“/third_party/webrtc/CMakeLists.txt”不匹配。使用不同的源目录重新运行 cmake。

我怀疑我可能完全错误地解决了这个问题,因为我对 CMake 有点陌生。

MyGameServer鉴于上述情况,在目标之前构建此依赖项以使其立即缓存和可用(当我最终构建时MyGameServer)并且不需要访问根目录的明智方法是什么CMakeLists.txt

标签: cmake

解决方案


推荐阅读