避免额外的ExternalProject下载

时间:2016-08-17 16:27:54

标签: build cmake installation dependencies external-project

我们说我有以下项目设置与这些依赖项:

MainProject
├─ Dependency_1
│  └─ Dependency_2
└─ Dependency_2

这些依赖项在MainProjectDependency_1 ExternalProject处理。

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

这对于高效的构建过程没有影响,有没有办法可以为这两个项目下载Dependency_2一次?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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