CMAKE:仅构建下载的外部项目的一个目录

时间:2014-07-02 09:35:25

标签: cmake subdirectory

CMAKE:我只想构建可下载外部项目的一部分

我想要使用的外部项目具有以下结构:

- 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}"
)

1 个答案:

答案 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}"
)