Gestire le dipendenze del C++ con Clickable#

Se un’app dipende da una libreria che non è preinstallata in Ubuntu Touch, l’app deve fornirla all’interno del pacchetto click. Questa guida mostra come farlo con Clickable.

Costruzione#

A volte le librerie sono disponibili pre-costruite, consentendo di saltare la fase di compilazione. La compilazione della dipendenza è comunque consigliata, in quanto consente di avere un maggiore controllo sull’intero processo e può portare a risultati migliori (ad esempio, prestazioni migliori o dimensioni ridotte del pacchetto).

Compilazione#

Mettere il codice sorgente della libreria in libs/LIBNAME (sostituendo LIBNAME con il nome della libreria), perché è qui che clickable la cercherà per impostazione predefinita. Se il codice sorgente della dipendenza è disponibile come repository git, è una buona idea aggiungerlo come git submodule. Altrimenti, aggiungere uno script per scaricare i sorgenti.

Add a libraries section to your clickable.yaml, like this:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"

If the library does not contain a CMake configuration, you need to use the qmake or custom builder instead.

Opzionalmente, si può configurare la compilazione aggiungendo build_args, che può essere simile a questo:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"
     build_args:
     - "-DBUILD_EXAMPLES=OFF"
     - "-DBUILD_DOCS=OFF"
     - "-DBUILD_TESTS=OFF"
     - "-DBUILD_SHARED_LIBS=OFF"

La maggior parte degli argomenti di compilazione sono specifici del progetto. Per questo motivo, si devono studiare le istruzioni di compilazione della libreria e cercare anche le impostazioni delle ``opzioni”” nel suo ``CMakeLists.txt””.

To actually build the library for all architectures run clickable build --libs --arch armhf, clickable build --libs --arch arm64 and clickable build --libs --arch amd64. Don’t forget to mention this step in your README, so that others can reproduce the build process.

See how Teleports clickable.yaml uses the libraries feature to build its dependency tdlib.

Pre-costruzione#

Se hai compilato la tua libreria come descritto sopra, salta questo passaggio.

Una libreria precostituita è solitamente disponibile solo come oggetto condiviso che deve essere collegato dinamicamente. Inoltre, può contenere componenti che non servono, con il risultato di un’applicazione gonfia. Potrebbe anche mancare qualcosa che si potrebbe ottenere compilandola da soli. A volte, una libreria è disponibile nei repository di Ubuntu, ma non è installabile per l’architettura necessaria (probabilmente armhf o arm64). In questo caso è necessario compilare la libreria come descritto sopra.

Se la libreria è disponibile nei repository di Ubuntu, è possibile aggiungerla all’elenco delle dipendenze, in questo modo:

 builder: "cmake"
 dependencies_target:
 - "libsomething-dev"

Clickable installerà automaticamente il pacchetto specificato per l’architettura di destinazione all’interno del contenitore di build. Un esempio si trova in Guitar Tools” clickable.json.

If the library can be found in a PPA, you can add the PPA to the clickable.yaml, too. For example:

 builder: "cmake"
 dependencies_ppa:
 - "ppa:someone/libsomething"
 dependencies_target:
 - "libsomething-dev"

Altrimenti, aggiungere uno script per scaricare la libreria precostituita.

Utilizzo#

In primo luogo, è necessario specificare la directory di inclusione in cui si trovano le intestazioni da includere nel codice sorgente dell’applicazione. In secondo luogo, è necessario collegare il binario della libreria al binario dell’applicazione.

Nel caso in cui la libreria contenga un file di configurazione di CMake, si può usare il comando find_package, che fornisce un target da collegare o variabili che puntano alle directory binarie e include della libreria. Le righe aggiuntive del file CMakeLists.txt potrebbero quindi essere simili a:

find_package(SOMELIBRARY REQUIRED)

include_directories(${SOMELIBRARY_INCLUDE_DIRS})
target_link_libraries(mytarget ${SOMELIBRARY_LIBS})

Il comando find_package di solito definisce il percorso della directory di inclusione come SOMELIBRARY_INCLUDE_DIRS e i binari della libreria come SOMELIBRARY_LIBS (verificare nella documentazione della libreria cosa prevede esattamente la configurazione di CMake). Usarli con i comandi include_directories e target_link_libraries. Vedere il file Camera Scanner ImageProcessing CMakeLists.txt per un esempio reale.

A questo punto si dovrebbe già essere in grado di testare la modalità desktop di Clickable eseguendo clickable desktop.

Distribuzione#

Se la libreria è collegata staticamente, si può saltare questo passaggio, poiché il binario della libreria è già all’interno del binario dell’applicazione.

Scoprire quali file di oggetti condivisi (*.so) è necessario spedire. È possibile farlo avviando l’applicazione sul dispositivo tramite clickable && clickable logs. Dovrebbe apparire un messaggio di errore che indica il file di oggetti condivisi mancante.

Trova il percorso dei file degli oggetti condivisi. Per le librerie costruite tramite clickable, si trovano da qualche parte nella directory di installazione della libreria, che si trova per impostazione predefinita all’interno della directory di compilazione della libreria (ad esempio build/arm-linux-gnueabihf/opencv/install). Per le librerie precostituite, eseguire clickable run "find / -name 'libSomething.so'" (sostituendo libSomething.so con il file che si sta cercando). Questo dovrebbe stampare il percorso del file (insieme ad alcuni messaggi di errore che si possono ignorare). In generale, /usr/lib è una buona scelta quando si cercano i file degli oggetti condivisi.

To get the files into the click package, add the install_lib key to your clickable.yaml:

 builder: "cmake"
 libraries:
   LIBNAME:
     builder: "cmake"
     install_lib:
     - "$LIBNAME_LIB_INSTALL_DIR/usr/lib/$ARCHITECTURE_TRIPLET/libqmapboxgl.so*"
     - "/usr/lib/$ARCHITECTURE_TRIPLET/libSoundTouch.so.*"

Le righe precedenti contengono due esempi. Il primo installa una libreria costruita con Clickable. L’asterisco in .so* aiuta a catturare i collegamenti simbolici insieme alla libreria vera e propria, usati per puntare alla versione corrente.

A seconda della libreria, potrebbe essere necessario inviare alcuni dati aggiuntivi. In questo caso, consultare il readme della libreria o le istruzioni di installazione.

Si dovrebbe essere pronti a costruire e installare il pacchetto click su un dispositivo collegato al computer eseguendo clickable.