7
votes

Impossible d'utiliser Fixup_Bundle () pour créer un ensemble portable avec QT

J'ai déjà fouillé ce numéro sur d'autres messages, mais rien jusqu'à présent. Alors je suis ici.

J'aimerais créer un paquet portable. Portable comme dans "Je peux l'exécuter sur n'importe quelle machine OS X, même si mes libs requis (qt) ne sont pas installés". Malheureusement, je ne peux pas comprendre comment utiliser Fixup_Bundle () (qui semble être le bon outil pour cela) pour atteindre cet objectif. P>

Voici mon projet de cmake minimal généré C ++ Projet: P>

Main.CPP P>

vincent@hpcd0016-lion:test.app/Contents/ (0) > otool -L test.app/Contents/MacOS/test     
    test.app/Contents/MacOS/test:
        path_to_qt/Qt-4.8.1/osx/lib//QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.1)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

vincent@hpcd0016-lion:tmp/test_bundle/ (0) > otool -L test.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
    test.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore:
        path_to_qt/Qt-4.8.1/osx/lib//QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.1)
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
        /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 41.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 635.15.0)
        /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55010.0.0)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1094.0.0)
        /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 53.0.0)


0 commentaires

3 Réponses :


4
votes

J'ai ajouté cette ligne en haut de mes cmakelists.txt xxx

et c'était-ce.

Par défaut, apparemment, CUKE_INSTALL_PREFIX est défini sur / USR / Local sur ma machine. Si vous modifiez-le sur mon répertoire de travail actuel résolu le problème, cela signifie que CMAKE essayait d'effectuer certaines opérations sur / usr / local (qu'il n'est pas autorisé à faire). Alors, pourquoi le message d'erreur ne mentionne pas une telle erreur d'accès à droite?

Je ne sais pas si je n'ai pas lu assez de documentation ou si la documentation nécessite des précisions ... < / p>


2 commentaires

La documentation nécessite des précisions ... Je me suis battu exactement le même problème récemment. M'a fait perdre quelques heures.


J'ai le même problème, et définir l'installation de préfixe sur un Dir de bureau écrit ne semble malheureusement pas suffisant.



2
votes

En outre, je devais effectivement être encore plus explicite sur le chemin d'installation (c'est-à-dire dans le fichier .app).

comme ceci: xxx

(NB no Script séparé mais code plutôt embarqué - ne devrait pas faire une différence).


1 commentaires

Comment avez-vous résolu le problème que le plugin de plate-forme QT (libqcocoa.dylib) n'est pas fourni avec le reste?



1
votes

Répondre à la réponse de Timlukins, si vous allez appeler des variables de cmake dans le code installer em>, vous devez faire très attention à leur échapper contre une évaluation précoce.

Le code Vous avez posté la résolution CUKE_INSTALL_PREFIX code> immédiatement, avant d'intégrer votre code dans le script d'installation. Ce qui signifie que le fichier cmake_install.cmake code> contiendra: p> xxx pré>

(ou quel que soit le chemin que vous avez eu CUKE_INSTALL_PREFIX code> défini sur lors de la génération L'arbre de construction.) Ce n'est pas ce que vous voulez, puisqu'il rend votre consolidation sans appariement, même avant forte>, il est installé. p>

Vous devez protéger le CUKE_INSTALL_PREFIX code> Invocation Donc, il en fait dans le script d'installation intact et utilisera la valeur de l'installation. Il y a deux façons que vous pouvez faire cela. P>

  1. Furious s'échappant dans les citations ...
    install(CODE [[
      include(BundleUtilities)
    
      # You could also do this part before the CODE using
      #   install(TARGETS MyApp BUNDLE DESTINATION foo)
      #
      file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/foo"
        TYPE DIRECTORY FILES "$<TARGET_BUNDLE_DIR:MyApp>")
    
      # This string is crazy-long enough that it's worth folding into a var...
      set (_plugin_file "$<TARGET_FILE_NAME:Qt5::QCocoaIntegrationPlugin>")
    
      # Ditto the output paths for our installation
      set (_appdir "${CMAKE_INSTALL_PREFIX}/foo/MyApp.app")
      set (_outdir "${_appdir}/Contents/plugins/platforms")
    
      file(INSTALL DESTINATION "${_outdir}"
        TYPE FILE FILES "$<TARGET_FILE:Qt5::QCocoaIntegrationPlugin>")
    
      fixup_bundle("${_appdir}" "${_outdir}/${_plugin_file}" "")
    ]] COMPONENT Runtime)
    
  2. (beaucoup plus facile :) Utilisez un Argument de support em> ...
    install(CODE [[
      include(BundleUtilities)
      fixup_bundle("${CMAKE_INSTALL_PREFIX}/MyApp.app" "" "")
    ]] COMPONENT Runtime)
    


0 commentaires