2017-02-08 4 views
0

Ich habe ein Projekt, das eine externe Bibliothek verwendet. Die CMakeLists.txt Projekt sieht wie folgt aus:CMake: externes Projekt neu erstellen

cmake_minimum_required(VERSION 3.6.0) 

project(my-project) 

set(CMAKE_CXX_STANDARD 14) 

include(ExternalProject) 
find_package(Git REQUIRED) 

ExternalProject_Add(library 
     PREFIX ${my-project_SOURCE_DIR}/lib/library 
     GIT_REPOSITORY https://github.com/vendor/library 
     GIT_TAG master 
     UPDATE_COMMAND "" 
     INSTALL_COMMAND "" 
     ) 

link_directories(${my-project_SOURCE_DIR}/lib/library/src/library-build/src) 

add_subdirectory(src) 

Und src/CMakeLists.txt wie folgt aus:

include_directories(../lib/library/src/library/include) 

add_executable(my-project 
     main.cpp 
     ) 

add_dependencies(my-project library) 

target_link_libraries(my-project liblibrary.a) 

Es zieht die Bibliothek von Git und baut es zum ersten Mal ohne Probleme.

Ich möchte Quellcode der Bibliothek bearbeiten und die Bibliothek .a-Datei automatisch neu kompiliert werden. Was ist der sauberste Weg, um das zu erreichen? Es ignoriert derzeit alle Aktualisierungen des Quellcodes, da es bereits eine .a-Datei der Bibliothek enthält.

Wenn ich versuche,

add_subdirectory(lib/library/src/library/src) 

meiner Haupt CMakeLists.txt hinzuzufügen, erhalte ich folgende Fehlermeldung:

CMake Fehler bei lib/library/src/library/src/CMakeLists.txt: 55 (add_library): add_library kann kein Ziel "library" erstellen, da bereits ein anderes Ziel mit demselben Namen existiert. Das vorhandene Ziel ist ein benutzerdefiniertes Ziel, das im Quellverzeichnis "/ cygdrive/c/Code/my-project" erstellt wurde. Weitere Informationen finden Sie in der Dokumentation für die Richtlinie CMP0002.

Ich denke, es durch den Aufruf

add_library(gram STATIC ${SOURCE_FILES}) 

in der Bibliothek CMakeLists.txt verursacht wird und dann

ExternalProject_Add(library ...) 

im Projekt CMakeLists.txt aufrufen.

Irgendwelche Ideen?

+0

Enthalten Sie entweder die andere Bibliothek (mit 'add_subdirectory()') oder über 'ExternalProject_add()'. Die Fehlermeldung sollte klar verständlich sein. –

+0

Wie Sie sehen können, verwende ich bereits 'ExternalProject_add()' und es funktioniert nicht wie gewünscht. 'add_subdirectory()' alleine klont die Bibliothek nicht aus CVS. –

Antwort

0

Als Ihr Hauptziel ExternalProject_Add für die Verwendung ist die Abhängigkeit von einer externen Quelle zu laden, ohne dass die Konfiguration und Gebäuden es, könnten Sie die CMAKE_COMMAND, CONFIGURE_COMMAND und BUILD_COMMAND als leere Zeichenfolge definieren. Genau wie Sie bereits für die UPDATE_COMMAND und INSTALL_COMMAND getan haben. Auf diese Weise wird ExternalProject_Add das Repository nur einmal klonen.

Um den Namenskonflikt zu überwinden, verwenden Sie einfach einen anderen für das erste Argument von ExternalProject_Add, z. library_src:

ExternalProject_Add(library_src 
    PREFIX ${my-project_SOURCE_DIR}/lib/library 
    GIT_REPOSITORY https://github.com/vendor/library 
    GIT_TAG master 
    UPDATE_COMMAND "" 
    CONFIGURE_COMMAND "" 
    CMAKE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(library_src SOURCE_DIR) 
add_subdirectory(${SOURCE_DIR}) 

Der zweite Befehl (ExternalProject_Get_Property) Sie für die gegebene externe Projekt die genannten Eigenschaften geben. Die Ausgabevariablen haben denselben Namen wie die Eigenschaften. Auf diese Weise sind Sie immun gegen Änderungen im Verhalten von ExternalProject_Add, wo es den tatsächlichen Quellbaum platziert.

Verwandte Themen