J'ai un projet A qui exporte une bibliothèque statique en tant que cible:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Maintenant, je veux utiliser le projet A en tant que projet externe du projet B et inclure ses cibles construites:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Le problème est que le fichier d'inclusion n'existe pas encore lorsque CMakeLists du projet B est exécuté.
Existe-t-il un moyen de rendre l'inclusion dépendante du projet externe en cours de construction?
Mise à jour : j'ai écrit un court didacticiel CMake by Example basé sur ceci et d'autres problèmes courants que j'ai rencontrés.
la source
ExternalProject_Add
se comporter commeadd_subdirectory
et d'exposer toutes les cibles. La solution que vous avez décrite ci-dessus est probablement toujours la plus propre.ExternalProject
. Est-ce la cohérence, ou plus canonique, ou autre chose? Je suis sûr qu'il me manque quelque chose de fondamental ici.Ce message a une réponse raisonnable:
CMakeLists.txt.in
:CMakeLists.txt
:Cependant, cela semble assez piraté. Je voudrais proposer une solution alternative - utiliser les sous-modules Git.
Ensuite,
MyProject/dependencies/gtest/CMakeList.txt
vous pouvez faire quelque chose comme:Je n'ai pas encore essayé cela de manière approfondie, mais cela semble plus propre.
Edit: Il y a un inconvénient à cette approche: le sous-répertoire peut exécuter des
install()
commandes que vous ne voulez pas. Cet article a une approche pour les désactiver, mais il était bogué et n'a pas fonctionné pour moi.Edit 2: Si vous l'utilisez,
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
il semble que lesinstall()
commandes du sous-répertoire ne sont pas utilisées par défaut.la source
GIT_TAG
pendant le clonage, vous pourriez perdre la répétabilité de la construction car dans 2 ans, quelqu'un exécutant le script de construction obtiendra un version différente de ce que vous avez fait. La documentation de CMake le recommande également.Edit: CMake a maintenant un support intégré pour cela. Voir la nouvelle réponse .
Vous pouvez également forcer la génération de la cible dépendante dans un processus de création secondaire
Voir ma réponse sur un sujet connexe.
la source
cmake
ExternalProject_Add
peut en effet être utilisé, mais ce que je n'ai pas aimé à ce sujet - c'est qu'il effectue quelque chose pendant la construction, un sondage continu, etc. Je préférerais construire le projet pendant la phase de construction, rien d'autre. J'ai essayé de passer outreExternalProject_Add
à plusieurs reprises, malheureusement sans succès.Ensuite, j'ai essayé également d'ajouter un sous-module git, mais cela fait glisser tout le dépôt git, alors que dans certains cas, je n'ai besoin que d'un sous-ensemble du dépôt git entier. Ce que j'ai vérifié - il est en effet possible d'effectuer un contrôle git clairsemé, mais cela nécessite une fonction séparée, que j'ai écrite ci-dessous.
J'ai ajouté deux appels de fonction ci-dessous juste pour illustrer comment utiliser la fonction.
Quelqu'un peut ne pas aimer extraire le master / trunk, car celui-ci peut être cassé - il est alors toujours possible de spécifier une balise spécifique.
L'extraction ne sera effectuée qu'une seule fois, jusqu'à ce que vous effaciez le dossier de cache.
la source
Je cherchais une solution similaire. Les réponses ici et le tutoriel en haut sont informatifs. J'ai étudié les articles / blogs référencés ici pour réussir le mien. Je poste CMakeLists.txt complet a fonctionné pour moi. Je suppose que ce serait utile comme modèle de base pour les débutants.
"CMakeLists.txt"
la source