2010-08-23 6 views
21

Est-il possible d'utiliser install (TARGETS ...) avec des cibles définies dans les répertoires ajoutés avec add_subdirectory?install (TARGETS ...) et add_subdirectory

Mon cas d'utilisation est, que je veux construire, par exemple, un rpm pour gtest. le projet gtest arrive à avoir un CMakeLists.txt sans aucune instruction d'installation. Je veux construire le paquet sans ajouter ces instructions au CMakeLists.txt de gtest.

J'ai cette structure de répertoire résultant:

+ gtest-1.5.0/... 
+ CMakeLists.txt 

Les CMakeLists de gtest-1.5.0 définit les bibliothèques comme ceci:

cxx_static_library(gtest "${cxx_strict}" src/gtest-all.cc) 
cxx_static_library(gtest_main "${cxx_strict}" src/gtest_main.cc) 
target_link_libraries(gtest_main gtest) 

maintenant je veux ajouter quelque chose comme ça à mes CMakeLists. txt:

add_subdirectory(gtest-1.5.0) 
install(TARGETS gtest gtest_main ARCHIVE DESTINATION lib) 

mais cmake déclare à juste titre:

CMake Error at CMakeLists.txt:10 (install): 
    install TARGETS given target "gtest" which does not exist in this 
    directory. 

Existe-t-il un moyen de faire cela sans patcher gtest-1.5.0?

Répondre

8

Vous pouvez essayer d'installer des fichiers plutôt que d'installer des cibles. L'inconvénient est que vous devrez gérer les versions partagées et statiques.

install(FILES gtest-1.5.0/gtest_main.so DESTINATION lib)

+0

ok .. cela pourrait fonctionner, mais je ne comprends pas, pourquoi je peux utiliser les noms définis dans TARGET_LINK_LIBRARIES et non pas dans l'installation des commandes! – Gizmomogwai

+2

La commande Install ne regarde que le répertoire en cours pour savoir si une cible existe, contrairement à target_link_libraries qui analyse toutes les cibles. – RobertJMaynard

+0

Ok ... merci pour l'explication, j'ai pensé quelque chose comme ça, mais je n'étais pas sûr (pourriez-vous éditer votre installation (commande FILES, car install (FILES ne prend pas le paramètre ARCHIVE). – Gizmomogwai