Applicazione Qt: distribuzione di un eseguibile standalone in Linux

L’applicazione (Qt C++/QML) è pronta per la distribuzione nei diversi ambienti Linux dei miei colleghi. Non voglio impazzire nel dover creare un pacchetto DEB o RPM per i loro ambienti. Ho provato ad eseguire semplicemente il file binario nei differenti contesti ma il risultato è stato, ovviamente, negativo.
Alla fine per poter utilizzare l’eseguibile sviluppato con Qt 5.2.1 in Ubuntu 15.04 su Linux Mint 17.2 e Fedora Core 22 sono ricorso a questo trucco che in qualche maniera intacca la sicurezza del sistema non avvalendosi del sistema di pacchetti predefinito.
L’idea è quella di tenere tutto in una cartella da distribuire sotto forma compressa tar.gz (o altro basta che mantenga i permessi).
Il file compresso conterrà, oltre al file binario, le librerie ed i plugins necessari al suo funzionamento.
Nel mio caso, avendo sviluppato una applicazione ibrida C++ QML, sarà necessario inserire anche le componenti QML.

MyQtApp/
    MyQtAppBinary
    lib/
    plugins/
    qml/
    qt.conf

Le cartelle lib/ plugins/ qml/ sono una esatta replica di quelle contenute nel Qt framework; Un analisi più fine potrebbe snellire il contenuto di queste cartelle per rendere più leggero il pacchetto compresso. Il primo passo per rendere l’eseguibile più incline alla sua distribuzione è quello di cambiare il suo RPATH hardcoded; Lo strumento chrpath permette di cambiare il parametro RPATH contenuto in un file binario.

$ chrpath --replace lib MyQtAppBinary

Il file binario cercherà le librerie Qt all’interno della cartella lib/ contenuta nella stessa directory. Il secondo stratagemma per raggiungere l’obiettivo è quello di comunicare alle libreria Qt-core dove trovare il resto delle componenti tramite un file di configurazione qt.conf:

[paths]
libraries = lib
qml2scene = qml
plugins = plugins

La direttiva [path] serve a specificare i percorsi per le componenti del Qt framework. L’atto finale è quello di comprimere la cartella ed il suo contenuto.

$ tar -czvf MyQtApp.tgz MyQtApp

Un possibile problematica di sicurezza nasce dal fatto che, in un qualsiasi momento, una delle librerie o lo stesso eseguibile potrebbero essere alterati senza la richiesta di permessi da amministratore; La prima soluzione a cui penso è proprio quella di confinare MyQtApp in un percorso dove l’utente abbia solo i diritti di lettura ed esecuzione.

Lo step successivo, se riesco a finire UnityLauncherStacks, sarà quello di non decomprimere affatto il file tar.gz bensi farlo montare al volo da fuse-zip ed eseguirne il contenuto. Un po’ come un bundle di Mac OS X.