2016-03-16 2 views
1

J'ai actuellement un projet appelé LIBS avec une structure comme celle-ci:Cmake: Exportation des objectifs du sous-projet au projet principal

├── Lib1 
│ ├── CMakeLists.txt 
│ ├── lib1-class.cpp 
│ └── lib1-class.h 
├── lib2 
│ └── CMakeLists.txt 
│ ├── lib2-class.cpp 
│ ├── lib2-class.h 
├── cmake 
│ └── LIBSConfig.cmake.in 
├── CMakeLists.txt               

dans le fichier principal de CMake, j'ai:

install(
     TARGETS 
     lib1 
     lib2 
     DESTINATION 
     ${PROJECT_DIRNAME_lib} 
     EXPORT 
     ${PROJECT_NAME}Exports 
) 

install(
     EXPORT 
     ${PROJECT_NAME}Exports 
     DESTINATION 
     ${PROJECT_DIRNAME_lib} 
) 

comme Je veux les exporter dans un paquet qui est détectable par find_package().

Mon problème est que je produis lib1 et lib2 dans leurs répertoires respectifs et lors de leur installation, Cmake me dit que

Error:install TARGETS given target "lib1" which does not exist in this directory. 

Comme suggéré here, je crois comprendre que je devrais utiliser Export() et lib1 et lib2 , ont quelque chose de la forme:

export(TARGETS lib1 FILE lib1Exports.cmake) 

et dans le projet LIBS, quelque chose comme ceci: 012 Cependant, il n'aime pas que j'utilise le même nom pour cette bibliothèque qui est ajoutée à partir du projet parent. Par contre, cela ne me plaît pas. Il me dit:

Error:add_library cannot create imported target "lib1" because another target with the same name already exists. 

si la bibliothèque est disponible et je peux lui associerez, etc. si je devais créer une autre cible dans le répertoire parent, mais je ne peux pas l'installer.

J'ai trouvé exactement le même problème dans un rapport de bug here mais je crois que cmake gère les choses différemment maintenant et je ne le fais pas correctement. Alors, est-ce que je me trompe? Je voudrais éviter d'utiliser des paquets externes si possible.

Mise à jour: la solution acceptée ne fonctionne que dans les cas où il n'y a pas de dépendance entre lib1, lib2. Dans ce cas, il faut utiliser la solution fournie à la question this.

Répondre

2

Comme indiqué dans la commande bugreport you refer à install() doit être émise à partir du même répertoire où la cible est créée. Comme vous avez des cibles de bibliothèques créées dans différents répertoires, vous devez leur attribuer différents noms d'exportation et, par conséquent, différents fichiers d'exportation.

Mais vous êtes libre d'inclure les fichiers d'exportation dans le script LIBSConfig.cmake:

CMake/LIBSConfig.cmake:

get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) 
include(${SELF_DIR}/LIBS-lib1.cmake) 
include(${SELF_DIR}/LIBS-lib2.cmake) 

lib1/CMakeLists.txt:

add_library(lib1 ...) 
install(TARGET lib1 EXPORT lib1-export ...) 

lib2/CMakeLists.txt:

add_library(lib2 ...) 
install(TARGET lib2 EXPORT lib2-export ...) 

CMakeLists.txt:

add_subdirectory(lib1) 
add_subdirectory(lib2) 

install(EXPORT lib1-export FILENAME LIBS-lib1.cmake DESTINATION lib/LIBS) 
install(EXPORT lib2-export FILENAME LIBS-lib2.cmake DESTINATION lib/LIBS) 
install(FILES cmake/LIBSConfig.cmake DESTINATION lib/LIBS) 

Notez que export les exportations de commande construisent arbre. Il n'est généralement pas adapté pour find_package, qui est normalement utilisé pour trouver installé fichiers.

+0

Je voulais utiliser export() dans l'arbre de construction. C'est après avoir eu toutes les cibles de construction dans le projet principal que j'ai voulu les installer() comme un paquet unifié afin que les gens puissent trouver find_Package (LIBS). Votre méthode installe réellement ces cibles directement, donc je n'aurai pas à m'inquiéter à ce sujet. – ShS

+0

Il y a un léger problème avec cette méthode. Si lib1 dépend de lib2, au niveau de la construction, nous pouvons nous en occuper par add_dependency (lib1 lib2) mais si nous incluons les fichiers d'export, si nous ne les incluons pas dans le bon ordre, nous ne serons pas en mesure de satisfaire le dépendance. Comment puis-je inclure les informations de dépendance de lib1 dans le fichier d'exportation? – ShS

+0

J'ai demandé cela dans une question séparée ici: http://stackoverflow.com/questions/36103012/cmake-dependency-management-in-a-multi-library-package-export N'hésitez pas à jeter un oeil! – ShS