2017-09-12 4 views
0

Faire copier des fichiers CMake pendant make install est simple:CMake: fichiers au lieu de les symboliques sur la copie installer pendant

install(TARGETS foo DESTINATION lib) 
install(DIRECTORY Include/ DESTINATION include) 

Mais est-il possible d'écrire make symlink qui fera des liens symboliques au lieu de copier des fichiers? Si c'est le cas, comment?

+0

Sur les systèmes Unix comme des liens symboliques peuvent être créés avec 'CMake -E create_symlink' invocation ([mode outil en ligne de commande de CMake] (https://cmake.org/cmake/help/v3.9/manual/cmake.1.html#command-line-tool-mode)). Pour effectuer des actions sur l'étape 'make install', utilisez le mode * SCRIPT * de la commande' install'. – Tsyvarev

+0

@Tsyvarev pouvez-vous écrire au code entier dans une réponse? – Lyberta

+0

Copie possible de [Liens symboliques CMake] (https://stackoverflow.com/questions/35765106/symbolic-links-cmake) – Tsyvarev

Répondre

0

Ok, après avoir lu la réponse suggérée et faire quelques tentatives, je réussis à écrire le code:

add_custom_target(symlink 
    ${CMAKE_COMMAND} -E create_symlink ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libfoo.a ${CMAKE_INSTALL_PREFIX}/lib/libfoo.a 
    COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/Include ${CMAKE_INSTALL_PREFIX}/include) 
0

écrire le script CMake qui crée un lien symbolique nécessaire:

symlink_include_dir.cmake.in:

execute_process(COMMAND cmake -E create_symlink 
    "@[email protected]/include" # Old name 
    "@[email protected]/include" # New name 
) 

Dans ce script configure CMakeLists.txt pour l'ajuster pour la source réelle et installer des chemins, et l'appeler de install(SCRIPT):

CMakeLists.txt:

# This will copy original script with @[email protected] replaced with variable's value. 
configure_file("symlink_include_dir.cmake.in" "symlink_include_dir.cmake" 
    @ONLY) 

# Tell CMake to use the script at install stage 
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/symlink_include_dir.cmake") 
+0

Donc il fonctionne pendant 'make install'? Est-ce qu'il symbolise aussi une bibliothèque? Pouvez-vous le faire tourner pendant 'make symlink' - une cible personnalisée? – Lyberta

+0

Oui, il fonctionne pendant 'make install'. Le script crée uniquement les liens symboliques qui sont donnés à 'create_symlink', si vous voulez créer un lien symbolique pour une bibliothèque, vous devez spécifier * COMMAND * pour cela. Pour exécuter un (ou plusieurs) * COMMAND * pendant la phase de construction, utilisez l'approche standard 'add_custom_target' /' add_custom_command'. Pour exécuter un script entier au stade de la construction, spécifiez 'COMMAND -P '. – Tsyvarev

+0

Pouvez-vous écrire le code entier? Je n'ai pas la connaissance pour le faire moi-même – Lyberta