cmake - 使用 CMake 构建和缓存与主要目标隔离的外部项目依赖项
问题描述
我有一个如下所示的目录结构:
- src/
- *.h & *.cpp files
- third_party/
- webrtc/
- CMakeLists.txt
- CMakeLists.txt
使用third_party/webrtc/CMakeLists.txt
和ExternalProject_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
?
解决方案
推荐阅读
- reactjs - 全球可用的 spfx Web 部件共享点在线
- textfield - 选择器视图 - 文本字段未更新
- flutter - 如何使 GridView 组件居中
- reactjs - NavLink 未在反应应用程序中添加“活动”类属性
- c# - 如何将值添加到类中的字符串数组?
- php - 在 PHP 中将纯文本 URL 转换为 HTML 超链接
- kubernetes - Kubernetes 架构中的 etcd 复制
- java - 如何在java中获取给定月份的第一个日期和最后一个日期?
- java - 使用多个线程填充静态数组
- mysql - 计算 A 列中的所有值,但仅计算 B 列中的某些值