Il mondo Linux è più bello (e più semplice!) da quando esistono i pacchetti installabili; eppure, qualche volta, finiamo volenti o nolenti a ritrovarci faccia a faccia con un'installazione da sorgenti! Questo significa che, anziché delegare lo sporco lavoro ad un gestore come "apt", "rpm", "aur", "dnf" e via discorrendo, l'operazione di compilare i file e soddisfare le dipendenze toccherà a noi!

E se non avete mai messo mani a una distribuzione come Slackware o peggio ancora Gentoo, non siete sviluppatori o non vi divertite a testare rilasci intermedi di programmi open source, potreste non aver mai visto un cosiddetto "tarball sorgente", ovvero un archivio che contiene i sorgenti del nostro software e parte del necessario per compilarli ed usarli.

Linux tar.gz: anatomia file "sorgente"

Il che può essere una cosa buona, poiché solitamente l'installazione diretta da tarball sorgente può dare qualche grattacapo e non doverci avere a che fare è sempre gradito; ma può essere anche una cosa cattiva perché, nella vostra vita da linuxiani, potrebbe sempre capitare quel programma poco diffuso (ma che vi serve come l'aria che respirate) disponibile soltanto come tarball sorgente, da compilare ed installare a manina!

Quindi oggi vedremo insieme alcune cosette da conoscere sui tarball sorgenti e su come gestirli al meglio: sfortunatamente non tutti sono uguali e le procedure di compilazione ed installazione possono differire tra un archivio e l'altro. Ma un po' di conoscenza, e al bisogno anche qualche buona googlata, possono aiutarci più di quanto crediamo!

cosa è un tarball sorgente?

Un tarball sorgente altro non è che un archivio contenente i file sorgenti del programma che ci serve, pronti per essere compilati e resi eseguibili. All'interno dell'archivio troveremo anche le istruzioni da dare agli strumenti di compilazione del nostro sistema (ad esempio gcc o gc) spesso sotto forma di "Makefile", dei file di configurazione e se siamo fortunati qualche script di installazione semi-automatica.

Come si presenta un tarball sorgente?

Un tarball sorgente si presenta solitamente sotto forma di archivio .tar.gz; a volte possiamo trovarlo anche in formato .tar.bz2, .tar.xz, o tar.z. La differenza tra i vari formati è soltanto nel tipo di compressione usata perché, se di tarball sorgente si tratta, i contenuti di un archivio con compressione .gz ed i contenuti dello stesso tarball con compressione .bz2 sono identici.

Cosa c'è dentro un tarball sorgente?

Adesso le cose iniziano a farsi davvero interessanti: ogni sviluppatore può decidere in completa autonomia come strutturare un tarball sorgente e quale strumento scegliere per le procedure di compilazione e di installazione. Sicuramente in un tarball sorgente ci sono i file sorgenti, quelli scritti nel linguaggio di programmazione scelto, del programma che andremo ad installare. Solitamente i programmi per Linux vengono scritti in C o C++, dunque le estensioni dei file sorgenti saranno .c o .cpp. Ciò non toglie che potremmo ritrovarci davanti ad altri linguaggi di programmazione e, di conseguenza, ad altri tipi di sorgente.

Un tarball può contenere inoltre, se necessari, le immagini necessarie per l'interfaccia del programma, le librerie e i relativi header ed in generale ciò che serve per la corretta compilazione del software stesso.

Altro elemento quasi sempre presente in un tarball sorgente è un file readme che contiene le istruzioni per la corretta installazione del software, ad esempio il compilatore da usare, la versione minima richiesta, eventuali parametri da aggiungere alla linea di comando e, se necessarie, le dipendenze esterne da installare separatamente.

In ultimi, ma non di minore importanza, un tarball sorgente può contenere i file che si occupano di "istruire" il compilatore su come comportarsi o che verificano la configurazione della macchina in uso, per accertarsi che la compilazione vada eventualmente a buon fine. Alcuni di questi file sono:

  • un file configure: quando lanciato, questo file verifica alcuni dettagli sul sistema per scoprire se il software può essere installato o meno. Tra questi dettagli quasi sempre figurano: il sistema operativo in uso, la sua architettura, la presenza del compilatore e/o la sua versione, la presenza di dipendenze e librerie esterne o altro. Se l'esecuzione del file di configurazione viene completata senza errori, solitamente viene generato un secondo file - tale Makefile - che si occuperà della compilazione vera e propria del programma.
  • un makefile: si tratta di un file che contiene le regole che il compilatore deve usare per generare il file eseguibile (o i file eseguibili) dai sorgenti contenuti nell'archivio. In esso sono definite le regole di compilazione e la gestione degli eventuali errori. Esso inoltre contiene anche degli "obiettivi", ovvero ciò che il sistema dovrà fare quando si invoca l'installazione materiale del programma o la disinstallazione. Il makefile viene usato dai comandi make, make install, make uninstall e via dicendo (ne parleremo più avanti).
  • un file install.sh (o autorun.sh): se troviamo questo file siamo particolarmente fortunati: si tratta di uno script bash che esegue per noi le procedure di configurazione e verifica, compilazione ed installazione.
  • un file uninstall.sh: come sopra: questo script si occuperà di disinstallare il software per noi.
  • altri file utili al software, anche senza estensione: se necessario, troveremo un riferimento ad essi nel readme e da lì potremo capire a cosa servono.

Come si installa da un tarball sorgente in Linux?

Come abbiamo già spiegato, l'anatomia di un tarball sorgente non è standard, quindi nessuno ci assicura che l'installazione da tarball sorgente del programma A sia identica a quella del programma B, anzi!

E' fondamentale dare un'occhiata al file readme per capire come muoverci con l'archivio che abbiamo tra le mani: lì sono specificate le dipendenze da avere già installate, la procedura di installazione e gli eventuali parametri da usare in casi particolari.

Spesso, comunque, i programmatori tendono ad usare una procedura fortemente basata sugli "autotools": ciò significa che, con una combinazione di file di configurazione ed una scrittura dettagliata del makefile, possono aiutarci a compilare ed installare un programma con pochissimi e semplici comandi. Prendiamo ad esempio il tarball sorgente programmaPippo.tar.gz, costruito sulla base degli autotools e dunque installabile con la sequenza configura/compila/copia.

Decomprimiamo innanzitutto l'archivio con il comando

tar xvzf programmaPippo.tar.gz

ricordando che i parametri da passare a "tar" cambiano a seconda del tipo di archivio (ad esempio, per i .bz2 andremo ad usare i parametri xvjf). Una volta decompresso l'archivio portiamoci nella cartella creata, leggiamo innanzitutto il file readme ed installiamo se necessario le librerie, le dipendenze e gli strumenti che ci servono a parte (eh sì, sporco lavoro, ma qualcuno dovrà pur farlo!).

Leggiamo inoltre le istruzioni di installazione: probabilmente il file readme ci chiederà di invocare prima lo script di verifica della configurazione e, successivamente, i comandi di compilazione ed installazione. Scorgeremo con ogni probabilità il file configure tra quelli contenuti nella cartella.

Portiamoci con il terminale nella cartella di lavoro ed invochiamo la verifica con il comando

./configure

Lasciamo lavorare lo script: se non verranno rilevati errori, ci verrà detto che la procedura è stata completata con successo e che potremo compilare il programma usando il suo makefile. In caso di errori prendiamo nota dell'output: potrebbe esserci qualche dipendenza mancante, una versione troppo datata del compilatore o un'incompatibilità del sistema. Googliamo un po' per capire se possiamo districarci.

Ora torniamo al caso di una terminazione senza errori: lo script di configurazione avrà generato un makefile. Per compilare i nostri sorgenti, adesso, sarà sufficiente dare il comando

make

seguito da Invio: la compilazione partirà. Lasciamo lavorare il nostro computer: potrebbero volerci anche diversi minuti. Se la compilazione procederà senza errori potremo finalmente installare il nostro programma da sorgente: lo faremo usando l'obiettivo "install", presente nel makefile, che istruisce il sistema su dove copiare i file eseguibili generati dalla procedura precedente. Tradotto in comandi, con i permessi di superutente, diamo il comando

make install

ed attendiamo il completamento della procedura. Se tutto finirà senza errori potremo finalmente usare il nostro software nuovo di zecca!

Ovviamente quando procediamo con un'installazione tramite sorgenti il nostro programma non comparirà nel gestore pacchetti, dunque non potremo disinstallarlo se non tramite il suo makefile. In tal caso possiamo usare l'obiettivo uninstall (sempre se il programmatore lo ha messo a disposizione!): dalla cartella in cui abbiamo operato durante le fasi precedenti, per disinstallare il programma ci basterà digitare

make unistall

ed attendere la conferma dell'avvenuta disinstallazione.

Dunque è tutto?

No, non è tutto: come abbiamo già detto più volte in questa guida, le procedure di installazione possono essere profondamente diverse tra loro! Molte volte i passaggi descritti precedentemente ci permettono di installare da tarball sorgente con pochissimi problemi, tuttavia le procedure possono essere differenti. Ad esempio, alcune installazioni:

  • richiedono la copia manuale dei file compilati;
  • richiedono di usare ./configure, make e make install con dei precisi parametri;
  • dispongono di file e script di installazione automatica, che rendono ancora più semplice il lavoro;
  • non sono basate sugli autotools ed usano altri sistemi di installazione...

...eccetera, eccetera, eccetera. In linea generale è assolutamente fondamentale leggere il file readme contenuto nei tarball sorgenti: le vere e proprie istruzioni per l'installazione del nostro tanto adorato software saranno lì!