build - 避免额外的 ExternalProject 下载

标签 build cmake installation dependencies external-project

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

MainProject
├─ Dependency_1
│  └─ Dependency_2
└─ Dependency_2

这些依赖关系在 MainProject 中处理。和 Dependency_1ExternalProject .

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

这不利于高效的构建过程,有什么方法可以下载Dependency_2两个项目一次?

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

最佳答案

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

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

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

在实践中看到它应用于您评论中链接的项目,您将设置 EXTERNAL_PROJ_DOWNLOAD_DIR在 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 .

关于build - 避免额外的 ExternalProject 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001854/

相关文章:

angular - Ionic Cordova 构建始终使用最新版本的 androidx.appcompat :appcompatn and failed

flutter - Flutter/pubspec.yaml 中的版本号问题

c++ - Bii 代码似乎损坏了我的 cmake

java - 错误: JAVA_HOME is not set and could not be found. 如何在Hadoop中永久设置JAVA_HOME?

c++ - 如何了解 C++ 链接/依赖项?

c++ - CMake - 自动解析预编译头的依赖关系?

python - SWIG 输入类型(C++ 到 Python)

windows - JetBrains PyCharm : Length of PATH is bigger than 8192 bytes

installation - 如何在 InstallShield 构建时定义设置文件名

build - 无论有没有分析方面的内容,如何使用gradle构建项目?