2017-01-26 1 views
0

Le script cmake FindwxWidgets crée la liste de tous les fichiers .lib.CMake list wxWidgets Dll et copiez-les lors de l'installation

Cependant ce script ne fournit pas la liste des dll wxWidgets.

Quel est le script CMake à stocker dans une liste tous les fichiers Dll wxWidgets pour les cibles de débogage et de publication? Ps: J'ai trouvé un projet basé sur wxWidgets et CMake mais ils sont tous liés de manière statique avec wxWidgets.

Travaux en cours:

La solution sale actuelle est de chercher tous les dll dans le répertoire wxWidgets et installer dans le même dossier que le fichier EXE. Cependant, il n'y a pas de filtre pour les composants utilisés car il n'est pas lié à la commande find_package.

# Copy wxWidgets Dll's # extract folder path
file(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll") list(APPEND WXWidgets_DLL_Slash "") foreach(WXWidgets_DLL ${wxwidgets_dlls}) # Check if dll does not contain "ud" for debug dll get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE) string(FIND ${DLL_FILENAME} "ud" debug_annot) if(${debug_annot} LESS 0) string(REPLACE "\\" "/" WXWidgets_DLL ${WXWidgets_DLL}) MESSAGE(STATUS "Install ${WXWidgets_DLL}") list(APPEND WXWidgets_DLL_Slash ${WXWidgets_DLL}) endif() endforeach(WXWidgets_DLL)
install(FILES ${WXWidgets_DLL_Slash} DESTINATION .)

+0

Je ne sais pas si votre projet doit utiliser CMake, mais sinon, pourquoi vous ne compilez wxWidgets sans CMake? C'est assez facile ... – macroland

+0

@macroland Je ne compile pas wxWidgets, je compile un projet qui fait un lien vers wxWidgets. Cependant, avec une liaison dynamique, l'exécutable final nécessite les DLL wxWidgets. Je dois donc trouver un moyen de trouver et de copier ces DLL en utilisant CMake. –

+0

Je voterais pour clore votre question, car on ne sait pas exactement ce que vous voulez réellement. Pouvez-vous donner un exemple minimal qui montre ce que vous avez actuellement et ce qu'il manque par rapport à ce que vous voulez? – usr1234567

Répondre

1

Voici exemple de what je l'utilise avec cpack. Il analysera le .exe avec dumpbin/readelf pour trouver ce que les bibliothèques à copier.

Mon script essaie également de supprimer les DLL résultantes (vous pouvez supprimer cette partie si vous le souhaitez). Insérez cette après votre commande install(TARGETS ...).

Les choses que vous pourriez avoir besoin d'ajuster (attention, ils seront développés avant l'installation):

  • RUNTIME_DIR - sous-répertoire comme bin où vos fichiers .exe et .dll sont installés
  • EXECUTABLE_NAME - nom de votre cible sans le .exe
  • Troisième paramètre à fixup_bundle - son \"\" mais vous devrez peut-être le changer en \"${wxWidgets_LIB_DIR}\" (le répertoire de qui de copier les DLLs)
install(CODE " 
    include(BundleUtilities) 
    fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/${EXECUTABLE_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"\") 
    file(GLOB dynamic_libs \"\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*\") 
    message(STATUS \"GLOB: \${dynamic_libs}\") 
    foreach(dll IN LISTS dynamic_libs) 
     if(\"${CMAKE_STRIP}\") 
      execute_process(COMMAND ${CMAKE_STRIP} \"-s\" \${dll}) 
     endif() 
    endforeach(dll) 
") 

Mise à jour: install(CODE ...) ajoute des commandes à l'intérieur de la chaîne dans le fichier cmake_install.cmake in extenso, donc les expressions du générateur ne sont pas développées. Nombre de variables utiles est également assez limité, par exemple ${CMAKE_INSTALL_PREFIX} dans mon exemple est développé à l'intérieur de cmake_install.cmake, mais ${CMAKE_SHARED_LIBRARY_SUFFIX} devrait être étendu avant d'y aller.

Vous pouvez essayer d'utiliser ${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_PREFIX} pour créer le chemin complet vers .exe manuellement.

+0

Merci. Je vais essayer cela demain et donner un retour. –

+0

J'essaie d'utiliser $ qui devrait être évalué au nom final d'exe mais cette variable ne se développe pas. –

+0

@ nicolas-f Désolé, les expressions de générateur ne fonctionneront pas dans ce cas. 'install (CODE ..)' ajoute simplement les commandes dans la chaîne au fichier 'cmake_install.cmake'. Dans ce fichier les expressions de générateur ne sont pas développées et beaucoup de variables manquent (nous avons 'CMAKE_INSTALL_PREFIX' disponible, mais 'CMAKE_SHARED_LIBRARY_SUFFIX' doit être étendu manuellement auparavant) – Nazar554