ExternalProject_Add autogen项目阻止在重建时进行配置

时间:2017-09-23 18:24:24

标签: cmake configure autogen

我在linux上有一个CMake项目,我正在使用ExternalProject来构建Google Protobuf。它工作得很好,但是任何后续版本仍然会调用外部项目中的配置步骤(这很烦人,因为protobuf是一个具有相当长步骤的自动项目)。我使用UPDATE_DISCONNECTED参数,所以它不会重新克隆哪个有帮助,但你会认为如果它没有重新克隆,它将不需要重新配置或重新构建/安装。我怎样才能让CMake一次构建它并跳过后续构建(即我的构建目录中的下一个make)?

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.11)
project(pbuf_test)

include(${PROJECT_SOURCE_DIR}/cmake/protogen.cmake)

set(PBUF_DIR ${PROJECT_BINARY_DIR}/protobuf)

include(ExternalProject)
ExternalProject_Add(protobuf
    PREFIX ${PROTOBUF_DIR}
    GIT_REPOSITORY https://github.com/google/protobuf.git
    GIT_TAG v3.4.1
    UPDATE_DISCONNECTED 1
    BUILD_IN_SOURCE 1
    CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${PBUF_DIR}
)

set(PBUF_INCLUDE_DIR ${PBUF_DIR}/include)
set(PBUF_LIBRARY ${PBUF_DIR}/lib/libprotobuf.so)
set(PBUF_PROTOC ${PBUF_DIR}/bin/protoc)

file(GLOB PBUF_FILES "${PROJECT_SOURCE_DIR}/msg/*.proto")
custom_protobuf_generate_cpp(PBUF_SRCS PBUF_HDRS ${PBUF_FILES})

include_directories(
    ${PROJECT_BINARY_DIR}
    ${PBUF_INCLUDE_DIR}
)

add_executable(${PROJECT_NAME} main.cpp ${PBUF_SRCS} ${PBUF_HDRS})
add_dependencies(${PROJECT_NAME} protobuf)
target_link_libraries(${PROJECT_NAME}
    ${PBUF_LIBRARY}
)   

Full example project here

2 个答案:

答案 0 :(得分:0)

我知道的唯一方法是将外部项目的步骤转移到由add_command调用的脚本中。然后在项目和外部项目的输出/ lib / binary之间添加依赖项。

  • Pro:避免不必要的重建
  • Pro:避免外部lib的意外更新
  • Con:如果外部存储库已更新(并且这是必需的),则不会重建
  • Con:编写此类脚本的其他工作
顺便说一句:在我的项目中,我们是艰难的。但我们不希望任何外部库的意外更新。

答案 1 :(得分:0)

目前似乎仍在使用ExternalProject的解决方案是将configure步骤移至download步骤。

类似这样的事情。请注意,目标名称是希望下载创建的目录。由于使用了&&连接器,因此这可能仅在某些操作系统上有效:我对cmake有点陌生。

ExternalProject_Add(protobuf
    PREFIX ${PROTOBUF_DIR}
    DOWNLOAD_COMMAND git clone https://github.com/google/protobuf.git protobuf &&
        cd protobuf &&
        git checkout v3.4.1 &&
        ./autogen.sh &&
        ./configure --prefix=${PBUF_DIR}
    UPDATE_COMMAND git pull
    UPDATE_DISCONNECTED 1
    BUILD_IN_SOURCE 1
    CONFIGURE_COMMAND ""
)