Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake ExternalProject\u添加自动生成项目防止在重建时配置_Cmake_Configure_Autogen - Fatal编程技术网

Cmake ExternalProject\u添加自动生成项目防止在重建时配置

Cmake ExternalProject\u添加自动生成项目防止在重建时配置,cmake,configure,autogen,Cmake,Configure,Autogen,我在linux上有一个CMake项目,我正在使用ExternalProject构建Google Protobuf。它工作得很好,但是任何后续的构建仍然在外部项目中调用configure步骤(这很烦人,因为protobuf是一个步骤相当长的autogen项目)。我使用了UPDATE\u DISCONNECTED参数,这样它就不会重新克隆,这对某些人有帮助,但您可能会认为,如果它不重新克隆,就不需要重新配置或重新构建/安装。如何让CMake只构建一次,而跳过后续的构建(即从构建目录中创建下一个mak

我在linux上有一个CMake项目,我正在使用
ExternalProject
构建Google Protobuf。它工作得很好,但是任何后续的构建仍然在外部项目中调用configure步骤(这很烦人,因为protobuf是一个步骤相当长的autogen项目)。我使用了
UPDATE\u 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}
)   

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

  • 优点:避免不必要的重建
  • Pro:避免意外更新外部库
  • Con:如果外部存储库已更新,则不会重建(这是必需的)
  • 缺点:写这样一个脚本需要额外的工作

顺便说一句:在我的项目中,我们做得很艰难。但是我们不希望对外部libs进行任何意外的更新。

目前看来,仍然使用ExternalProject的解决方案是将配置步骤移到下载步骤

像这样的。注意,目标的名称是它希望下载创建的目录。这可能只适用于某些操作系统,因为使用了&&joiner:我对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 ""
)

遇到这个问题的人可以发表评论并对这个问题报告竖起大拇指吗:我意识到cmake并不是很灵活。易于构建使用它的项目。做一个很麻烦。