ExternalProject_Add autogen 项目阻止在重建时进行配置
ExternalProject_Add autogen project prevent configure on rebuild
我在 linux 上有一个 CMake 项目,我正在使用 ExternalProject
构建 Google Protobuf。它工作得很好,但是任何后续构建仍然会调用外部项目中的配置步骤(这很烦人,因为 protobuf 是一个具有相当长步骤的 autogen 项目)。我使用了 UPDATE_DISCONNECTED
参数,所以它不会重新克隆,这对某些人有帮助,但你会认为如果它没有重新克隆,就不需要重新配置或 re-build/install .我怎样才能让 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_command
调用的脚本中。然后在你的项目和外部项目的 output/lib/binary 之间添加依赖关系。
- 专业:避免不必要的重建
- 专业版:避免意外更新外部库
- 缺点:在外部存储库更新的情况下不重建(这是必需的)
- 缺点:编写此类脚本的额外工作
顺便说一句:在我的项目中,我们以艰难的方式进行。但我们不希望任何意外的外部库更新。
目前仍然使用 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 ""
)
我在 linux 上有一个 CMake 项目,我正在使用 ExternalProject
构建 Google Protobuf。它工作得很好,但是任何后续构建仍然会调用外部项目中的配置步骤(这很烦人,因为 protobuf 是一个具有相当长步骤的 autogen 项目)。我使用了 UPDATE_DISCONNECTED
参数,所以它不会重新克隆,这对某些人有帮助,但你会认为如果它没有重新克隆,就不需要重新配置或 re-build/install .我怎样才能让 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_command
调用的脚本中。然后在你的项目和外部项目的 output/lib/binary 之间添加依赖关系。
- 专业:避免不必要的重建
- 专业版:避免意外更新外部库
- 缺点:在外部存储库更新的情况下不重建(这是必需的)
- 缺点:编写此类脚本的额外工作
顺便说一句:在我的项目中,我们以艰难的方式进行。但我们不希望任何意外的外部库更新。
目前仍然使用 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 ""
)