2017-09-13 5 views
0

J'ai un projet qui doit être installé à ${CMAKE_INSTALL_PREFIX} (fourni par l'utilisateur). Je joins un sous-projet avec add_subdirectory(subproject). Ce sous-projet installe le contenu à ${CMAKE_INSTALL_PREFIX}, mais je préfère l'installer à ${CMAKE_INSTALL_PREFIX}/subproject. Comment puis-je faire cela sans toucher au sous-projet?Modifier CMAKE_INSTALL_PREFIX pour les sous-répertoires

J'ai essayé: Mais il n'a eu aucun effet:

set(_INSTALL_PREFIX_BACKUP ${CMAKE_INSTALL_PREFIX}) 
set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/subproject) 
add_subdirectory(subproject) 
set(CMAKE_INSTALL_PREFIX ${_INSTALL_PREFIX_BACKUP}) 

J'ai aussi essayé ceci:

include(ExternalProject) 
ExternalProject_Add(subproject 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/subproject 
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/subproject" 
    INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/subproject" 
) 
+0

ne suis pas sûr de Windows, mais sur Linux installer à la fois principal et sous-projet dans le même répertoire ** ** (en utilisant même * CMAKE_INSTALL_PREFIX *) est OK. De plus, l'installation du sous-projet dans le sous-répertoire est quelque peu inhabituelle pour l'utilisateur. Vous pouvez penser à * CMAKE_INSTALL_PREFIX * en tant que répertoire par projet, mais ** par-environnement ** un. Un environnement peut contenir de nombreux projets installés, qui interfèrent les uns avec les autres. Encore une fois, c'est à propos de Linux. En ce qui concerne vos tentatives, l'utilisation de 'ExternalProject' devrait fonctionner. – Tsyvarev

Répondre

0

Voici la solution que j'ai trouvée. Dans le sous-projet:

if (SUBPROJECT_INSTALL_PREFIX) 
    set(_SUBPROJECT_INSTALL_PREFIX ${SUBPROJECT_INSTALL_PREFIX}/) 
else() 
    set(_SUBPROJECT_INSTALL_PREFIX .) 
endif() 

install(TARGETS ${PROJECT_NAME} 
     RUNTIME DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/bin 
     ARCHIVE DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib/static 
     LIBRARY DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib) 

Dans le super-projet, je l'utilise alors:

set(SUBPROJECT_INSTALL_PREFIX "path/to/subproject" CACHE STRING "Path in project") 
add_subdirectory(subproject) 
1

Il est tout au sujet de la fonction install().

Dans votre vous avez besoin la ligne suivante de sous-projet CMakeLists.txt:

install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION subproject) 

En fonction de votre usecase vous pouvez régler LIBRARY-RUNTIME.
subproject voici le chemin. C'est relatif à ${CMAKE_INSTALL_PREFIX}.

Ayez le documentation ici pour référence.

+0

L'astuce ici est que je voudrais que mon sous-projet soit agnostique au superprojet. Le sous-projet est utilisé dans plusieurs superprojets et sera installé à différents endroits dans chaque superprojet. Je suppose que mon meilleur pari est d'ajouter une option de chaîne au cache du sous-projet pour définir le préfixe d'installation. – Stewart