【问题标题】:CMAKE : Build only one directory of an downloaded external projectCMAKE : 只构建下载的外部项目的一个目录
【发布时间】:2014-07-02 09:35:25
【问题描述】:

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

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

- ExternalProject
    - Subproject A  <- this i care for
    - Subproject B

所有内容都在同一个存档中,可供下载。问题是子项目 B 在我的项目中有更多我不想要的依赖项,而且它与我正在做的事情无关。子项目可以自行构建,所以现在我只是将 Subproject A 从存档中取出并将其放入运行良好的主项目中,但我不想部署外部项目使用我的项目,但允许用户在运行 cmake 时自行下载外部项目。遗憾的是,每个子项目都没有自己的存档,所以我只能下载完整的外部项目。

我想要告诉 CMAKE 下载并解压整个存档 ExternalProject,然后只将子项目 A 添加到我的项目中。我阅读了有关 ExternalProject_add 的所有文档,但它主要允许对项目的构建参数进行详细配置。也许我只是在寻找错误的关键字,而我的问题很容易回答——或者​​根本不可能。

如果有人能指出我正确的方法,我将非常感激。

实际项目: 提到的存档有两个子文件夹“octomap”和“octovis”。 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}"
)

【问题讨论】:

    标签: cmake subdirectory


    【解决方案1】:

    您可以明确定义所有命令。例如你有一个目录结构:

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

    【讨论】:

    • +1 - 我认为这在这种特殊情况下有效,因为项目的结构使得子目录不依赖于顶级范围内的任何设置功能。通常情况可能并非如此,您必须在 CONFIGURE_COMMAND 中传递一个 CMake -D 选项来禁用任何不需要的子模块(并不总是一个选项),或者最坏的情况 - 修补项目的 CMakeLists.txt 以禁用不需要的部分.
    • 非常感谢!这让我走上了正轨。关于 CMAKE 选择构建的内容,这已经很完美了。我现在唯一的问题是 EXTERNAL_INSTALL_DIR 现在似乎被忽略了。在我的旧 CMAKE 中,它使库最终出现在我的 CMAKE_CURRENT_BINARY_DIR/external/lib 中,它们现在保留在项目自己的库文件夹中。似乎完全忽略了“-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}”。为什么会这样?也许参数的顺序是错误的,所以 INSTALL_COMMAND 会覆盖它或者像那样?
    • @ruslo But I'm sure John don't want to modify external archive - 我同意。这是最后一种情况。尽管像您更新的答案一样微不足道和有用的东西会对项目的维护者提出很好的更改请求...提示提示 JohnTheCompilator :-)
    • 再次感谢您的所有回答。我会再次查看EXTERNAL_INSTALL_DIR,一定是站在我这边,我把别的东西搞砸了!弗雷泽:是的,我会花时间让他们知道这一点。我认为他们没想到该项目会被广泛使用,因此他们甚至可能没有考虑过这样的选择,但提供它确实很有帮助。 ruslo:感谢您的回答和更新以及您的时间。非常非常有用的东西!
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2019-01-10
    • 2022-07-06
    • 2013-02-16
    • 2014-10-06
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多