2017-09-23 75 views
3

我有一個Linux上的CMake項目,我使用ExternalProject來構建Google Protobuf。它很好用,但是任何後續的構建仍然會調用外部項目中的配置步驟(這很煩人,因爲protobuf是一個具有相當長步驟的autogen項目)。我使用了UPDATE_DISCONNECTED這個參數,所以它不會重新克隆哪一個有幫助,但是你會認爲如果它沒有重新克隆,它不需要重新配置或重新構建/安裝。我怎樣才能讓CMake一次性構建它並跳過後續的構建(即我的下一個make來自構建目錄)?ExternalProject_Add autogen項目防止重新配置

這裏是我的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

回答

0

我所知道的唯一的辦法是移動步驟來建立外部項目進入由add_command調用的腳本。然後在項目和外部項目的輸出/ lib /二進制文件之間添加依賴關係。

  • 優點:避免了不必要的重建
  • 優點:避免了外部的lib意想不到的更新
  • 缺點:如果不重建外部存儲庫進行更新(這是必需的)
  • 缺點:附加編寫這樣一個腳本的工作

順便說一句:在我的項目中,我們這樣做很難。但我們不希望任何外部庫的意外更新。