Il sistema dei package di NetBSD è una raccolta di strumenti che consentono di compilare e installare in maniera semplice una grande quantità di software di pubblico dominio per sistemi Unix. In generale sono sufficienti uno o due comandi per installare qualsiasi pacchetto perfettamente configurato e funzionante.
Il primo contatto con i package genera un po' di confusione perché apparentemente vi sono vari comandi che fanno le stesse cose. In realtà la questione è molto semplice: vi sono due modi per installare un programma
Compilare i sorgenti del programma sul nostro sistema. Questo è il compito della collezione dei package, che è in grado di scaricare in modo automatico i sorgenti, compilarli, installare e configurare il programma e la documentazione con uno o due comandi. Come se non bastasse è in grado di determinare automaticamente le dipendenze e installare i package necessari. Il sistema dei package non viene installato con il sistema base, anche perché subisce frequenti aggiornamenti, per stare al passo con le nuove versioni dei programmi da installare. Il sistema dei package è descritto in modo molto completo ed esauriente sul sito di NetBSD.
Installare una versione precompilata e preconfigurata del programma in un apposito formato. È questo il compito dei "pkgtools" una serie di programmi installati con il sistema di base. Questo sistema è più veloce ma meno flessibile del precedente. I pkgtools sono anche in grado di riconoscere e gestire (elencare, disinstallare, ecc.) i programmi installati con il sistema dei package; si tratta, per così dire, di strumenti complementari. Se si decide di installare esclusivamente programmi in forma precompilata, non è necessario installare la collezione dei package.
I due metodi appena illustrati sono quelli "comodi", che sfruttano il lavoro di configurazione fatto da qualcun altro. Se il programma che ci interessa non è compreso nella collezione dei package, nessuno ci impedisce di compilarlo a mano e di installarlo sul sistema. In questo caso è buona norma fare un piccolo sforzo in più e creare noi stessi un package, in modo che altri possano beneficiare a loro volta del nostro lavoro.
Prima di poter installare un pacchetto è necessario installare la collezione dei package, come descritto in dettaglio sul sito di NetBSD. In sostanza si tratta di:
Scaricare l'ultima versione dei sorgenti della collezione, che comprendono tutti i file di configurazione, da ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/tar_files/. Il nome del file da scaricare è pkgsrc.tar.gz.
Rimuovere la precedente collezione, se presente, con
# cd /usr # rm -rf pkgsrc
Installare la nuova collezione con
# tar -xzvpf pkgsrc.tar.gz -C /usrL'esecuzione del comando precedente dura parecchio tempo perché il numero dei file da estrarre è notevole. Al termine dell'operazione il framework per l'installazione dei package è al suo posto: rimane solo da decidere quali package installare sul sistema.
Nota: immagino che a questo punto sia chiaro che con l'operazione precedente è stato installato sul sistema l'insieme dei file di configurazione necessari per l'installazione dei singoli programmi ma non i programmi stessi né i loro sorgenti. In sostanza adesso il sistema dispone della lista dei programmi installabili automaticamente e delle istruzioni per installarli.
Una volta installata la collezione dei package con un browser HTML come Lynx o Netscape si possono leggere i dettagli e le descrizioni di tutti i pacchetti disponibili. Per esempio:
$ cd /usr/pkgsrc $ lynx README.html
La collezione dei package viene aggiornata molto spesso; sul sito ftp si trova una nuova copia quasi ogni settimana. Per aggiornare la collezione sul proprio computer occorre seguire le istruzioni date per l'installazione.
A volte, oltre alla collezione dei package è necessario aggiornare anche i programmi di installazione (pkgtools). È facile capire se bisogna eseguire l'aggiornamento: quando si tenta di installare un pacchetto il sistema dei package avvisa che i pkgtools devono essere aggiornati. Per esempio:
# make ===> Validating dependencies for gqmpeg-0.6.3 Your package tools need to be updated to 2000/02/02 versions. The installed package tools were last updated on 1999/01/01. Please make and install the pkgsrc/pkgtools/pkg_install package. *** Error code 1
Il metodo di aggiornamento più semplice è:
# cd /usr/pkgsrc/pkgtools/pkg_install # make install
Fatto ciò, si può riprendere l'installazione del pacchetto originale, quello che aveva dato luogo al messaggio d'errore.
Nota: Tecnicamente, il messaggio d'errore indica che la versione dei programmi di installazione è quella contenuta in pkg_install-20000202.tar.gz, che si può trovare sul sito ftp in packages/distfiles/LOCAL_PORTS. Pkg_install si installa come un qualsiasi altro pacchetto (pkgsrc/pkgtools/pkg_install).
Per determinare esattamente la versione richiesta, esaminare il file pkgsrc/mk/bsd.pkg.mk e cercare la riga con
PKGTOOLS_REQD = 20000202(la data 20000202 è solo un esempio).
A titolo di esempio, proviamo a installare il programma addnerd , che serve a aggiungere utenti al sistema in maniera automatica (un po' come fa il comando adduser su altri sistemi). Per prima cosa ci si porta nella directory /usr/pkgsrc/sysutils/addnerd.
Se si dispone di un collegamento a Internet il Makefile è in grado di scaricare automaticamente il pacchetto e si può saltare alla sezione seguente.
In caso contrario bisogna procurarsi il package sorgente e copiarlo nella directory /usr/pkgsrc/distfiles. Esaminando il Makefile, si trova il nome del pacchetto da scaricare (DISTNAME = addnerd-1.6). Il nome completo del pacchetto è addnerd-1.6.tar.gz.
Lo stesso risultato si può ottenere in modo più semplice con i comandi:
# cd /usr/pkgsrc/sysutils/addnerd # make fetch-list
che in più mostrano anche gli indirizzi dei siti dai quali scaricare il programma.
Per compilare il pacchetto scrivere
# cd /usr/pkgsrc/sysutils/addnerd # make
Il comando precedente scarica il package da Internet (se non è già presente nella directory dei distfile), estrae i sorgenti, applica i patch necessari per poterli compilare sotto NetBSD e infine compila il pacchetto.
Per installarlo:
# make install
L'installazione del pacchetto viene registrata dal sistema: si può verificare scrivendo pkg_info -a. A installazione completata si può fare un po' di pulizia con
# make clean # make clean-depends
Il secondo comando è mostrato solo a titolo di esempio; in questo caso non erano stati installati package dipendenti e quindi non era necessario fare pulizia.
Come ho spiegato nell'introduzione, il sistema dei package è concepito per installare programmi in forma sorgente ma è in grado anche di installare pacchetti precompilati, generati da qualcun altro utilizzando la collezione stessa. In questo caso l'installazione è più veloce (non è necessario compilare il programma da installare).
I programmi precompilati si distinguono solitamente da quelli sorgenti perchè hanno estensione .tgz anziché .tar.gz.
Nota: in realtà l'estensione dei tarball dei sorgenti non è sempre .tar.gz; il sistema dei package, tuttavia, è in grado di gestire anche le estensioni diverse (.zip, .bz2, ecc.).
Non è strettamente necessario scaricare manualmente un pacchetto binario per poterlo installare. Pkg_add è in grado anche di scaricarlo autonomamente quando vengono utilizzati URL FTP (l'uso di HTTP è possibile ma sconsigliato). Per esempio, si può specificare il nome del pacchetto con:
ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh-6.09.00.tgz
Se non si conosce il numero di versione del pacchetto disponibile sul sito FTP, è anche possibile omettere questa informazione dalla riga comando e pkg_add utilizzerà automaticamente l'ultima versione disponibile sul server FTP. Per esempio:
# pkg_add ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh
È anche possibile impostare la variabile di ambiente PKG_PATH con una lista di percorsi e URL separati da ; e omettere il percorso nel comando pgg_add:
# PKG_PATH="/cdrom;/usr/pkgsrc/packages/All;ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All" export PKG_PATH # pkg_add tcsh
Il comando precedente installa il primo pacchetto binario di tcsh trovato nei percorsi specificati.
A titolo di esempio, vediamo come procede l'installazione del programma texinfo in forma precompilata. L'installazione del pacchetto binario è molto semplice:
Copiare gtexinfo-3.12.tgz in una directory temporanea.
Dare il comando
# pkg_add -v gtexinfo-3.12.tgz
Controllare l'avvenuta installazione con il comando
# pkg_info
Rimuovere il file gtexinfo-3.12.tgz dalla directory temporanea.
I pacchetti precompilati sono molto comodi da usare perché comportano un tempo e uno sforzo minimo per l'installazione; tuttavia i pacchetti in forma sorgente sono più flessibili ancora perché consentono di personalizzare eventuali opzioni di configurazione e di installazione. L'installazione è più lunga ma, tutto sommato, non si installano pacchetti in continuazione...
Quando si installa un pacchetto binario con il comando pkg_add, conviene per prima cosa esaminarlo con il comando pkg_info. Per esempio:
# pkg_info -f jpeg-6b.tgz
In particolare conviene osservare il primo comando CWD per vedere dove viene installato il pacchetto. Se la directory base non è quella desiderata, bisognerà usare l'opzione -p di pkg_add. Per esempio, il pacchetto jpeg-6b.tgz si va a installare in /usr/pkg, mentre secondo me dovrebbe finire in /usr/X11R6. (In generale conviene estrarre in /usr/X11R6 tutti i pacchetti della gerarchia X). Pertanto è preferibile estrarlo con:
# pkg_add -p /usr/X11R6 -v jpeg-6b.tgz
I comandi principali per l'amministrazione del sistema dei package sono
Programma di utilità per l'installazione di package precompilati.
Programma di utilità per la disinstallazione di package precompilati. I nomi dei package possono essere specificati con o senza il numero di versione; pkg_delete determina automaticamente il numero di versione del pacchetto installato. Si possono usare caratteri jolly (facendo attenzione a prevenire l'espansione effetuata dalla shell); per esempio:
# pkg_delete "*emacs*"L'opzione -r consente la rimozione ricorsiva dei pacchetti; prima rimuove tutti i pacchetti che richiedono quello indicato e poi rimuove il pacchetto stesso. Per esempio:
# pkg_delete -r jpegrimuove il pacchetto jpeg e tutti quelli che lo utilizzano. Può essere utile per effettuare l'aggiornamento di un package.
Programma di utilità per la visualizzazione di informazioni sui pacchetti software installati e da installare.
Programma di utilità per la creazione di pacchetti software. Questo è il programma che viene usato per creare i pacchetti precompilati. Viene chiamato automaticamente dal sistema dei package e non è mai necessario lanciarlo a mano.
Programma di utilità per l'esecuzione di varie funzioni amministrative sul sistema dei pacchetti.
L'autore di questa sezione (Guida rapida alla creazione di package) è Jason R. Fink
Questa sezione descrive un metodo semplice e veloce per la creazione di semplici package per la collezione di package di NetBSD. Per ulteriori approfondimenti si rimanda alla documentazione ufficiale contenuta nel documento Packages.txt.
Gli strumenti principali da utilizzare per la costruzione di un semplice package da aggiungere alla collezione dei package di NetBSD sono tre:
url2pkg |
un prototipo di package |
pkglint |
Il programma di utilità url2pkg si può installare dalla collezione dei package. Si tratta di uno strumento che consente al costruttore di package di preparare e verificare velocemente le strutture di base della costruzione di un package.
La scelta del prototipo è lasciata allo sviluppatore; Packages.txt mostra un esempio di costruzione di package nella sezione 11 'A simple example of a package: bison'. Si noti che molti dei package della collezione sono tutt'altro che complicati.
Il programma di utilità pkglint può essere installato dalla collezione dei package. Si tratta di uno strumento di verifica della correttezza dei package.
I passi iniziali sono molto semplici a patto di avere l'accortezza di verificare che il programma si compili correttamente dai sorgenti sotto NetBSD. In caso contrario la costruzione del package potrebbe complicarsi notevolmente. Si noti che è generalmente possibile generare dei "patch" da applicare ai sorgenti e da includere nel package per risolvere i problemi di compilazione (o, più in generale, di compatibilità), ma questo argomento esula dagli scopi di questa semplice introduzione.
Per prima cosa bisogna utilizzare url2pkg.
La procedura seguente dettaglia i passi da seguire per creare i file di base di un nuovo package.
Creare una nuova directory per il nuovo package, scegliendo una posizione appropriata in pkgsrc. Lasciare la nuova directory inizialmente vuota.
Portarsi nella nuova directory.
Dare il comando
$ url2pkg
Il programma a questo punto chiede di inserire un URL: inserire l'URL richiesto e premere Invio.
Viene avviato l'editor vi per creare il Makefile per il nuovo package. Bisogna inserire il nome e la categoria di appartenenza del package e il nome e l'indirizzo e-mail della persona che curerà la manutenzione del package stesso.
Salvare il file e uscire.
url2pkg scarica automaticamente il package e lo mette nella sottodirectory work.
Infine, url2pkg genera i file MD5.
Con ciò si conclude la sessione di url2pkg. Si noti che url2pkg non riempie alcun file a eccezione del Makefile. Inoltre genera un file PLIST vuoto.
Ora che il Makefile è stato generato, occorre creare i restanti file sfruttando un package da usare come prototipo. Scegliere un package esistente e copiare i seguenti file dalla sottodirectory pkg, modificandoli opportunamente.
Una descrizione del nuovo package, lunga alcune righe.
Una descrizione del pacchetto lunga una riga. Non è necessario citare il nome del pacchetto stesso: sarà aggiunto automaticamente dai vari strumenti pkg_* quando verranno chiamati.
Questo file descrive la posizione dei file da installare sul sistema. Per un package non molto complesso (per es. un eseguibile e una o due pagine di manuale) dovrebbe essere sufficiente dare un'occhiata al Makefile e agli script di installazione per capire dove mettere i file da installare.
Ora che tutti i file richiesti sono pronti, è venuto il momento di verificare la correttezza del package con il programma pkglint. Capita spesso che una sezione del Makefile debba essere spostata, modificata o integrata con ulteriori informazioni; è bene lanciare subito pkglint per avere un immediato riscontro di ciò che andrà cambiato. Vediamo ora un esempio di output di pkglint preso da Packages.txt:
$ pkglint OK: checking pkg/COMMENT. OK: checking pkg/DESCR. OK: checking Makefile. OK: checking files/md5. OK: checking patches/patch-aa. looks fine.
In caso di errore è generalmente semplice risalire alle cause. Ecco un esempio di messaggio di errore ottenuto durante la costruzione di un package:
extract suffix not requiredIl messaggio indica semplicemente che non era necessario definire nel Makefile il suffisso per l'estrazione.
A questo punto, superata la verifica di pkglint, è consigliabile effettuare un "giro" completo di fetch (scaricamento), compilazione e installazione. Per uno svolgimento corretto bisogna prima cancellare la sottodirectory work e i distfiles già scaricati (che solitamente di trovano in /usr/pkgsrc/distfiles. In questo modo si garantisce che il test effettuato sarà completo.
Per prima cosa bisogna creare un "tarball" (file archivio tar compresso) dell'albero di directory del package stesso (compresa la sottodirectory work). Per esempio:
$ tar -czf packagename.tgz package_dir
Successivamente il file archivio deve essere copiato in una locazione accessibile ai gestori della collezione dei package di NetBSD. Se questo non è possibile, conviene contattare i responsabili chiedendo se vi sono altri metodi utilizzabili per rendere disponibile l'archivio.
Il metodo preferito per informare i responsabili della collezione di package di NetBSD è usare il programma di utilità send-pr specificando la categoria "pkg", includendo il nome, la versione e l'URL del package e una breve descrizione dello stesso.
Si può utilizzare sia la versione di send-pr inclusa in NetBSD sia quella disponibile online all'indirizzo http://www.NetBSD.org/cgi-bin/sendpr.cgi?gndb=netbsd.
Come già detto, questa breve guida si limita a considerare semplici package che installano un numero limitato di file sul sistema NetBSD, con l'ulteriore assunzione che i package stessi non abbiano dipendenze da altri package.
Per ulteriori approfondimenti si consiglia la lettura del già citato Packages.txt.