Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Distribuire applicazione basata su Qt con CPack



  • Salve, sto cercando di creare un pacchetto d'installazione di un'applicazione che fa uso delle Qt, utilizzando il modulo CPack di CMake.
    Per poter includere le dll ho usato il comando GET_RUNTIME_DEPENDENCIES. Il problema è che nel pacchetto d'installazione NSIS vengono copiati solo file di sistema, non quelli delle Qt.
    Vi allego il codice del file cmakelists.txt

    project(myproj)
    set(PROJECT_VERSION_MAJOR "1")
    set(PROJECT_VERSION_MINOR "0")
    set(PROJECT_VERSION_PATCH "0")
    
    cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
    cmake_policy(SET CMP0087 NEW)
    
    file(GLOB my_sources *.h *.cpp style.qrc)
    
    find_package(Qt5Widgets REQUIRED)
    find_package(Qt5Gui REQUIRED)
    find_package(Qt5Core REQUIRED)
    find_package(Qt5Multimedia REQUIRED)
    
    set(CMAKE_AUTORCC ON)
    set(CMAKE_AUTOMOC ON)
    
    add_executable(myexe ${my_sources})
    qt5_add_binary_resources(media_res media.qrc)
    
    target_link_libraries(myexe Qt5::Widgets Qt5::Gui Qt5::Core Qt5::Multimedia)
    
    install (TARGETS myexe DESTINATION bin)
    install (CODE [[
    	file(GET_RUNTIME_DEPENDENCIES
    		EXECUTABLES $<TARGET_FILE:myexe>
    		RESOLVED_DEPENDENCIES_VAR r_deps)
                    DIRECTORIES "C:\Qt\5.14.2\msvc2017_64\bin"
            foreach(_file ${r_deps})
               file(INSTALL
                       DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
                       TYPE SHARED_LIBRARY
                       FILES "${_file}"
                    )
            endforeach()
            ]])
    include(CPack)
    

    EDIT: chiedo scusa, avevo mancato di trascrivere il blocco foreach().



  • Per fare deployment su window l'unico modo su cui puoi fare affidamento e' windeployqt (GET_RUNTIME_DEPENDENCIES non sara' mai in grado di trovare i plugins per ovvie ragioni).

    La cattiva notizia e' che al momento e' un inferno al punto che, secono me, e' inusabile

    Tieni d'occhio questo ticket in quanto sembra ci possano essere miglioramenti con CMake 3.19: https://bugreports.qt.io/browse/QTBUG-84789



  • Lascia perdere cmake, usa innosetup su windows, un pacchetto deb oppure rpm su linux e package maker su mac.
    Attenzione ad eventuali plugins ed alla cartella qml .



  • @mrdebug said in Distribuire applicazione basata su Qt con CPack:

    Lascia perdere cmake

    Come grande fan di CMake, I don't approve this message

    usa innosetup su windows, un pacchetto deb oppure rpm su linux e package maker su mac.
    Attenzione ad eventuali plugins ed alla cartella qml .

    Eh ma questo equivale a fare l'installer manualmente, anche CPack puo' gestire l'installer se specifichi i liles a mano ma credo che OP volesse qualcosa di piu' automatico



  • Io di programmi ne distribuisco parecchi.
    In fase di installazione infatti innosetup controlla se c'è già una installazione vecchia da aggiornare, se il database c'è già oppure va installato, è multilingua, installa librerie tipo vcredist se servono...
    Con cmake non si possono fare queste cose.



  • @mrdebug said in Distribuire applicazione basata su Qt con CPack:

    Con cmake non si possono fare queste cose.

    CPack (parte di CMake) non fa nulla da solo, lui crea un "modo standard" di creare installers con altri tools. Innosetup, a quanto ne so, non e' ancora supportato ma NSIS (forse il piu' popolare in ambito free-software) e Wix (quello che uso io su windows) sono entrambi funzionanti.

    Per fare un parallelo:
    CMake non e' un build system, e' un build system generator cioe' e' un linguaggio generico per creare progetti che possono essere compilati da vari build systems come Visual Studio, Ninja, make, etc.

    CPack non e' un creatore di intsallers, e' un generatore di installer build. E' un linguaggio comune per creare releases dal piu' banale archivio zip/tar con i files a script che tools esterni come Wix, NSIS, etc. usano per poi creare l'installer vero e proprio


Log in to reply