【问题标题】:Avoiding extra ExternalProject downloads避免额外的 ExternalProject 下载
【发布时间】:2016-12-24 10:04:23
【问题描述】:

假设我有以下具有这些依赖项的项目设置:

MainProject
├─ Dependency_1
│  └─ Dependency_2
└─ Dependency_2

这些依赖关系在MainProjectDependency_1ExternalProject 中处理。

问题是Dependency_2 会被下载两次:Dependency_1 会自己下载一个副本,MainProject 会自己下载一个副本。

这不利于高效的构建过程,有没有一种方法可以让我为两个项目下载一次Dependency_2


有人建议这个问题是duplicate of this one。这个问题与我的略有不同,因为我不能假设这些库将通过 ExternalProject 安装到主机系统。我还想要一个仅限 CMake 的解决方案,这个问题不需要。

【问题讨论】:

  • 这个项目应该很方便:github.com/ruslo/hunter
  • 您的问题可能与stackoverflow.com/questions/38059659/…重复
  • @usr1234567 我想要一个仅限 CMake 的解决方案。此外,该问题提到了已安装的库,不应假定我的问题中的依赖项已安装在主机系统上。
  • 您当前的ExternalProject 命令是什么?我首先会尝试放置一个通用的 DOWNLOAD_DIR 和 BUILD_DIR
  • @Antonio 这是list of the ones I use for a project of mine。想象一下PortAudio 就像Dependency_2tritium 就像Dependency_1Khronos 就像MainProject

标签: build cmake installation dependencies external-project


【解决方案1】:

从主 CMakeLists.txt 中,设置一个环境变量,其中包含用于下载和构建外部项目的公共根路径,例如:

set (ENV EXTERNAL_PROJ_DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/externalProjects")

用作下载和构建依赖项的根文件夹。您可以在主项目中设置(和使用)它,并从您的第一个依赖项(也依赖于您的第二个依赖项的那个)中读取此值。

在实践中看到它应用于您的 cmets 中链接的项目,您将设置 EXTERNAL_PROJ_DOWNLOAD_DIR IN Khronos,然后在您将拥有的 Khronos 和 tritium 项目中链接到 PortAudio:

find_package(PortAudio)
if (${PORTAUDIO_FOUND})
    include_directories(${PORTAUDIO_INCLUDE_DIRS})
else ()
    ExternalProject_Add(
        PortAudio
        GIT_REPOSITORY      "https://github.com/syb0rg/PortAudio2.git"
        SOURCE_DIR          "$ENV{EXTERNAL_PROJ_DOWNLOAD_DIR}/PortAudio"
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     ""
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(PortAudio SOURCE_DIR)
    ExternalProject_Get_Property(PortAudio BINARY_DIR)
    set(PORTAUDIO_SOURCE_DIR ${SOURCE_DIR})
    set(PORTAUDIO_BINARY_DIR ${BINARY_DIR})
    set(PORTAUDIO_LIBRARIES ${PORTAUDIO_SOURCE_DIR}/libportaudio_static.a)
    set(DEPENDENCIES ${DEPENDENCIES} PortAudio)
    include_directories(${PORTAUDIO_SOURCE_DIR}/include)
endif ()
SET(LIBS ${LIBS} ${PORTAUDIO_LIBRARIES})

如果您想激活源外构建,也可以使用set (ENV EXTERNAL_PROJ_BINARY_DIR "${CMAKE_BINARY_DIR}/externalProjects")

我建议使用环境变量,因为我不知道从 Khronos 设置的缓存变量是否会在氚中可见......

请参阅 setenv 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2018-02-10
    • 2020-02-10
    • 2012-01-26
    • 2016-12-21
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多