2017-09-23 3 views
3

J'ai un projet CMake sur Linux et j'utilise ExternalProject pour créer Google Protobuf. Cela fonctionne très bien, mais toutes les versions ultérieures appellent encore l'étape configure dans le projet externe (ce qui est gênant car protobuf est un projet autogen avec une étape plutôt longue). J'ai utilisé l'argument UPDATE_DISCONNECTED pour qu'il ne soit pas reclassé ce qui aide certains, mais on pourrait penser que s'il ne reclique pas, il n'aurait pas besoin de reconfigurer ou de recréer/installer. Comment puis-je obtenir CMake juste pour le construire une fois et sauter les builds suivants (c'est-à-dire mon prochain make à partir du répertoire de construction)?ExternalProject_Ajouter le projet autogen empêche de configurer sur la reconstruction

Voici mon 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

Répondre

0

La seule façon que je connaisse est de déplacer les étapes pour construire le projet externe dans un script appelé par add_command. Et ajoutez ensuite une dépendance entre votre projet et la sortie/lib/binary du projet externe.

  • Pro: Evite inutiles reconstructions
  • Pro: Evite mises à jour inattendues de la lib externe
  • Con: ne reconstruit pas dans le cas où le référentiel externe a été mis à jour (et cela est nécessaire)
  • Con: supplémentaires travailler pour écrire un tel script

BTW: Dans mon projet, nous le faisons à la dure. Mais nous ne voulons pas de mises à jour inattendues de bibliothèques externes.