我想要使用的外部项目具有以下结构:
- ExternalProject
- Subproject A <- this i care for
- Subproject B
它们都在可供下载的同一档案中。问题是子项目B有更多的依赖关系,我不想在我的项目中,也与我正在做的事情无关。子项目可以自行构建,所以现在我只是将子项目A 从存档中取出并放入我的主项目中,这项工作正常,但我不想部署我的项目的外部项目,但允许用户在运行cmake时自己下载外部项目。可悲的是,每个子项目都没有自己的存档,所以我可以下载完整的外部项目。
我想要的是告诉CMAKE下载并解压缩整个存档ExternalProject,然后只将子项目A添加到我的项目中。我阅读了有关ExternalProject_add的所有文档,但它主要允许详细配置项目的构建参数。也许我只是在寻找错误的关键字,我的问题很容易回答 - 或者说这是不可能的。
如果有人能指出我正确的做法,我会非常感激。
实际项目: 上述档案有两个子文件夹&#34; octomap&#34;和&#34; octovis&#34;。 octomap是我想要构建的,而如果不满足依赖关系,octovis会产生很多错误。
ExternalProject_Add(octomap-1.6.5
URL https://github.com/OctoMap/octomap/archive/v1.6.5.tar.gz
URL_MD5 de09b1189a03ac8cbe4f813951e86605
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/octomap/
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
)
答案 0 :(得分:3)
您可以明确定义所有命令。例如,您有一个目录结构:
FooBar/
- CMakeLists.txt
- Foo/
- - CMakeLists.txt # You wanna build
- Bar/
- - CMakeLists.txt # You wanna ignore
硬编码路径示例:
set(ext_dir "${CMAKE_BINARY_DIR}/third-party-activities/ExternalProject/")
set(foobar_dir "${ext_dir}/FooBar")
ExternalProject_Add(
FooBar
URL "your-url-here"
SOURCE_DIR "${foobar_dir}/Source"
CONFIGURE_COMMAND
"${CMAKE_COMMAND}"
"-H${foobar_dir}/Source/Foo"
"-B${foobar_dir}/Builds"
"-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
BUILD_COMMAND
"${CMAKE_COMMAND}" --build "${foobar_dir}/Builds"
INSTALL_COMMAND
"${CMAKE_COMMAND}" --build "${foobar_dir}/Builds" --target install
)
请注意,修补这样的父项目要容易得多:
# FooBar/CMakeLists.txt
option(BUILD_BAR_SUBPROJECT "Build targets from subproject Bar" ON)
...
add_subdirectory(Foo)
if(BUILD_BAR_SUBPROJECT)
add_subdirectory(Bar)
endif()
...现在你不需要那么多地破解ExternalProject_Add:
ExternalProject_Add(
FooBar
URL "your-url-here"
CMAKE_ARGS -DBUILD_BAR_SUBPROJECT=OFF "-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
)