Una caratteristica importante delle distribuzioni Linux è certamente la disponibilità di software facilmente installabile tramite i repository ufficiali mantenuti dagli sviluppatori o realizzati dagli utenti. In alcuni casi, però, non è possibile utilizzare pacchetti compilati in precedenza, sia per la mancanza di questi ultimi, sia per la necessità di ottimizzare un'applicazione o implementarne alcune funzionalità altrimenti non utilizzabili.
Di tutti i software open source, per la definizione stessa di tale termine, vengono resi disponibili i sorgenti che, una volta compilati, andranno a costituire l'intera applicazione. La compilazione, in genere, è un'operazione non particolarmente difficile, sopratutto se non si ha la necessità di andare a modificare numerosi parametri, e può durare più o meno tempo a seconda delle dimensioni dell'applicazione e delle operazioni da eseguire per ottenere i file binari. Vediamo, dunque, come compilare un qualsiasi software per Linux a partire dai suoi codici sorgenti.
Installazione dei pacchetti di sviluppo
Ogni distribuzione fornisce ai propri utenti tutti gli strumenti necessari alla compilazione di un pacchetto, anche se in alcuni casi è necessario installare prima tali strumenti. In Ubuntu Linux, ad esempio, è sufficiente installare il pacchetto build-essential per aver subito a disposizione quanto necessario, utilizzando il seguente comando:
$ sudo apt-get install build-essential
In questo modo verranno installati il compilatore C e C++, lo strumento GNU Make, che si occupa della generazione dei file eseguibili grazie Makefile, le librerie C con relativi header, ed altri moduli necessari ad eseguire tutte le operazioni di controllo e compilazione dei sorgenti. I repository delle principali distribuzioni Linux includono tali strumenti, installabili in alcuni casi tramite un unico pacchetto, in altri obbligatoriamente elencandoli uno ad uno nel comando di installazione. Dunque, chi non utilizza Ubuntu può effettuare una semplice ricerca dei pacchetti necessari alla compilazione di un'applicazione all'interno del database dei repository.
Verifica ed installazione delle dipendenze
Per far sì che la realizzazione dei software risulti più semplice, sono disponibili numerosissime librerie che gli sviluppatori possono utilizzare semplicemente richiamandole all'interno del codice sorgente dei propri software. Basti pensare, ad esempio, alle librerie grafiche GTK+ o Qt, indispensabili per realizzare un'applicazione dotata di interfaccia grafica integrabile con GNOME o KDE. Risulta chiaro, dunque, che per compilare un'applicazione che necessita di determinate librerie, è necessario in primis assicursarsi di averle già installate.
Molto spesso è stesso lo sviluppatore che elenca quelle che vengono chiamate dipendenze del software, ovvero le librerie e gli altri software di cui necessita per poter funzionare al meglio. Ma l'operazione di controllo delle dipendenze può essere automatizzata: una volta scompattato l'archivio contenente i sorgenti del software, infatti, è molto probabile che sia presente un file chiamato configure. Tale file ha una struttura realizzata molte volte in Bash, e si occupa di controllare che tutte le dipendenze siano già state risolte. In caso contrario, restituisce un errore, segnalando quale dipendenza non è stata trovata.
Per eseguire lo script di configure è sufficiente posizionarsi con il terminale all'interno della cartella in cui è localizzato il suddetto file, e lanciare il comando:
$ ./configure
Una serie di informazioni verranno mostrate a video, così da poter seguire la fase di controllo delle dipendenze in tempo reale. L'esecuzione del configure è forse l'operazione più delicata nella compilazione dei sorgenti di un'applicazione, in quanto è l'unica nella quale è necessario intervenire davvero in caso di problemi, ed un errato controllo può comportare l'impossibilità di compilare o l'inutilizzabilità dell'applicazione installata.
Come già detto, lo script di configure restituisce un errore nel caso in cui non venga trovata una libreria: ciò non sempre è sintomo dell'assenza di tale libreria all'interno del proprio sistema. Non tutte le distribuzioni, infatti, installano i pacchetti all'interno dello stesso percorso, e dunque può capitare che lo script vada alla ricerca di una libreria in un percorso diverso da quello in cui è effettivamente installata, con conseguente messaggio di errore. La risoluzione di tale problema può essere molto semplice: il configure può essere lanciato con diversi parametri che ne gestiscono il comportamento, e grazie a questi è possibile suggerire allo script di andare a cercare un pacchetto o una libreria in un determinato percorso piuttosto che in quello predefinito.
Uno di questi parametri è --help, che fornisce un elenco degli altri possibili parametri da inserire, e dunque permette di comprendere come indirizzare lo script verso un ben preciso percorso per una libreria. Per ricevere tale elenco, è sufficiente digitare:
$ ./configure --help
Ad esempio, se le librerie necessarie all'installazione di un pacchetto sono all'interno della directory /directory/delle/librerie, sarà necessario aggiungere il parametro -L seguito dall'indirizzo della directory, come segue:
$ ./configure -L /directory/delle/librerie
In questo modo il linker, la parte che si occupa del collegamento e dell'integrazione dei vari moduli che compongono l'applicazione, sarà in grado di svolgere il proprio compito in maniera efficiente, recuperando le librerie nel percorso suggerito.
Tramite i parametri opzionali, inoltre, è possibile scegliere in quale percorso installare il pacchetto, quali opzioni abilitare e quali invece disabilitare, il nome da assegnare al pacchetto, con eventuale suffisso o prefisso, ed impostare alcune variabili di ambiente che andranno ad influenzare la compilazione. Ancora una volta, tutte le possibili voci che è possibile impostare sono disponibili tramite l'help di configure.
Chiaramente, se una libreria non è presente in un percorso diverso da quello predefinito ma non è installata affatto, è necessario procedere alla sua installazione, tramite i repository della distribuzione o tramite compilazione manuale, seguendo lo stesso procedimento suggerito in questo articolo per un qualunque pacchetto. Lo script configure, infine, si occupa anche della realizzazione del già citato Makefile.
Compilazione ed installazione dei sorgenti
Una volta ultimata la fase di controllo delle dipendenze e generazione del Makefile, che in genere non impiega molto tempo, se tutto è andato a buon fine è possibile passare alla compilazione vera e propria dei sorgenti. Per avviare tale processo, basta lanciare il comando
$ make
La compilazione può impiegare dai pochi secondi ai diversi minuti: tutto dipende dalle dimensioni dell'applicazione, dal numero di operazioni da eseguire per la compilazione, e soprattutto dalle risorse hardware disponibili. In alcuni casi, se le operazioni di compilazione richiedono particolari risorse, può accadere che vengano occupate quasi tutte quelle del sistema, che dunque può risultare inutilizzabile durante la fase di compilazione.
Al termine della compilazione, se non ci sono stati errori e non sono sopraggiunti problemi, verrà mostrato un messaggio che confermerà l'esito positivo della compilazione, o comunque sarà possibile comprendere che tutto è andato per il verso giusto. A questo punto, è possibile passare all'installazione dell'applicazione, che verrà posizionata all'interno della directory predefinita di sistema per i software a meno che non sia stato specificato diversamente. Per installare, lanciamo il comando:
$ sudo make install
Da notare la necessità di eseguire tale comando con privilegi superiori a quelli di un utente normale, tramite sudo o loggandosi come root ed eseguendo lo stesso comando senza sudo.
Al termine della compilazione, può essere necessario dover modificare alcuni parametri precedentemente impostati tramite lo script di configure: per fare ciò è necessario prima pulire la directory di compilazione tramite il comando
$ make clean
Una volta terminato questo processo, è possibile rilanciare lo script con i parametri giusti e ridare il via alla compilazione. E' possibile, inoltre, disinstallare un'applicazione installata tramite compilazione dei sorgenti, a patto che il Makefile supporti tale possibilità: per fare ciò è sufficiente lanciare il comando
$ make uninstall