DESCRIZIONE:
Il programma paco può essere utilizzato insieme con nALFS per tracciare l'installazione di un intero sistema LFS. Questo è fatto editando appropriatamente i profili XML di ALFS. Questo hint intende fornire le istruzioni per editare questi profili e integrare paco in ALFS nel modo più pulito e sicuro possibile.
ALLEGATI:
La patch di paco per i profili di LFS-6.1: http://paco.sourceforge.net/dl/profile-LFS-6.1-paco.patch
PREREQUISITI:
HINT:
0.INTRODUZIONE:
Ci sono principalmente due modi per integrare paco in ALFS: il modo “forza bruta”, e
il modo pulito.
In questo hint si ha intenzione di descrivere il modo pulito nel dettaglio, ma prima si desidera
dire alcune parole circa il metodo “forza bruta”, il quale effettivamente funziona bene, ed è
stato felicemente utilizzato fino ad oggi da diversi utenti di ALFS.
Nota: indipendentemente dal metodo utilizzato, prima di eseguire nALFS, il tarball di paco
deve essere copiato nella directory dove risiedono gli altri pacchetti di LFS.
1.IL METODO FORZA BRUTA:
In breve, questo metodo consiste nell'(ab)usare dell'elemento <execute command=“paco”> per includere ogni comando che installa file nel sistema. Come esempio, guardare il pezzo di codice XML seguente, preso dal file capitolo06/binutils.xml nel profilo LFS-6.1, il quale installa il pacchetto binutils:
---[ inizio XML ]--- <make> <param>tooldir=/usr</param> <param>install</param> </make> <copy> <source>../&binutils-directory;/include/libiberty.h</source> <destination>/usr/include</destination> </copy> ---[ fine XML ]---
Il frammento sopra potrebbe essere paco-izzato in questo modo:
---[ inizio XML ]--- <execute command="paco"> <param>-lp binutils-&binutils-version;</param> <param>make tooldir=/usr install</param> </execute> <execute command="paco"> <param>-lp+ binutils-&binutils-version;</param> <param>cp ../&binutils-directory;/include/libiberty.h</param> <param>/usr/include</param> </execute> ---[ fine XML ]---
Se si ha familiarità con paco, questo è pittosto chiaro.
Con questo metodo è sempre possibile tracciare le installazioni dei pacchetti, non importa
la complessità o il numero dei comandi coinvolti, ma non è molto… si
sa, intelligente, perché non approfitta della varietà degli elementi
definiti in ALFS DTD, e sostituisce ognuno di loro con l'elemento <execute>.
Nella prossima sezione si descriverà nel dettaglio il processo di
compilazione di un sistema LFS con nALFS e paco in un modo indubbiamente migliore.
2.IL MODO PULITO:
[ Nota per gli impazienti: Andare direttamente alla sezione 2.1 di questo hint. ]
2.0.IL MODO PULITO:
Per tenere i log delle installazioni dei pacchetti, paco utilizza una
libreria condivisa per impacchettare i comandi che installano file nel
sistema. Internamente, giusto prima di generare questi comandi, paco
imposta le seguenti variabili d'ambiente:
Quello che si andrà a fare in ALFS è di utilizzare l'elemento XML <variable> per impostare quelle variabili “a mano”.
Da ora in avanti, i file nel profilo di LFS-6.1 saranno referenziati utilizzando
percorsi relativi alla directory del profilo di LFS-6.1, come se fossero
creati quando si spacchetta il tarball profile-LFS-6.1.tar.bz2.
Tutte le variabili PACO_* possono essere impostate nel file LFS.xml, all'inizio di ogni
capitolo nel quale ogni pacchetto è installato, sebbene questo non danneggi se sono
impostate durante tutta l'installazione di LFS.
La variabile LD_PRELOAD deve essere impostata separatamente in ogni
profilo XML in cui si installi un pacchetto. Più precisamente, deve
essere settata ogni volta che si esegue un comando install
(o un gruppo di questi) in questi profili.
Per assicurare che la libreria libpaco-log sia caricata solo durante l'esecuzione dei
comandi install, si devono riunire insieme in un separato <stage>.
Pertanto, la variabile LD_PRELOAD è impostata soltanto in quello stage,
e si previene la contaminazione dei log con tutti i file creati durante
i comandi configurazione, patch e costruzione.
Attualmente, nei profili di LFS-6.1, l'intero processo di compilazione e installazione
di un pacchetto avviene in un singolo stage chiamato “Installing”. Si andrà a suddividere
quello stage in diverse parti più piccole, definendo questi nuovi tipi di stage:
Gli stage Unpacking e Cleanup non sono modificati.
Lo stage Building può essere omesso in quei pacchetti che non necessitano essere configurati o compilati, tipo lfs-bootscripts o man-pages.
IMPORTANTE: Il file PACO_TMPFILE deve essere rimosso all'inizio dello stage
Installing, e alla fine dello stage Logging, per pulire la lista dei
file da loggare.
Vedere un esempio di come dovrebbe essere fatto nella sezione 2.3 di sotto.
2.1.Applicare Patch al profilo LFS
Tutte le modifiche possono essere fatte automaticamente in un solo passo, applicando la patch profile-LFS-6.1-paco.patch dalla directory del profilo LFS-6.1:
$ patch -Np1 -i </percorso/verso/la/patch>
Questo hint potrebbe finire qui, dal momento che la patch suddetta fa
tutte le modifiche necessarie, ma verranno date informazioni dettagliate
su quello che in realtà viene fatto da questa patch, per chi ne vuol
sapere di più, o per chi vuole personalizzarla secondo le proprie esigenze.
2.2.Ricettario per farlo manualmente
Si considererà che non si sia interessati nel tenere traccia delle installazioni dei
pacchetti nel capitolo 5 (“Costruzione di un Sistema temporaneo”), così che tutti i file XML della
directory del capitolo05 che installano pacchetti saranno lasciati così come sono.
chapter05/creatingtoolsdir.xml
---[ inizio frammento del file ]--- <source>&ncurses-package;</source> <source>&paco-package;</source> <source>&patch-package;</source> ---[ fine frammento del file ]---
config/package.ent
Devono essere aggiunte le seguenti 3 linee:
---[ inizio frammento del file ]--- <!ENTITY paco-version "1.10.0"> <!ENTITY paco-package "paco-&paco-version;.tar.bz2"> <!ENTITY paco-directory "paco-&paco-version;"> ---[ fine frammento del file ]---
config/paco.ent
Devono essere create il file config/paco.ent, contenente le entità relative a paco:
---[ inizio file ]--- <!-- PACO_TMPFILE --> <!ENTITY paco-tmpfile "/tmp/paco.tmp"> <!-- LD_PRELOAD (path to the libpaco-log shared library) --> <!ENTITY paco-lib "/usr/lib/libpaco-log.so"> <!-- path to the paco log directory --> <!ENTITY paco-logdir "/var/log/paco"> <!-- PACO_INCLUDE and PACO_EXCLUDE --> <!ENTITY paco-include "/"> <!ENTITY paco-exclude "/tmp:/tools:/sources"> <!-- PACO_DEBUG --> <!ENTITY paco-debug "no_thanks"> <!-- different XML "macros": 'paco-clear' rimuove il file log temporaneo. 'paco-ld-preload' imposta la variabile LD_PRELOAD. 'paco-log-dirname' esegue "paco -lD" per loggare i pacchetti. --> <!ENTITY paco-clear "<remove>&paco-tmpfile;</remove>"> <!ENTITY paco-ld-preload "<environment> <variable name='LD_PRELOAD'>&paco-lib;</variable> </environment>"> <!ENTITY paco-log-dirname "<execute command='paco'> <param>-lD < &paco-tmpfile;</param> </execute> &paco-clear;"> ---[ fine file ]---
chapter06/paco.xml
Paco in sé dovrebbe essere installato come primo pacchetto nel capitolo 6, così si deve creare il file chapter06/paco.xml, con i comandi necessari per installarlo:
---[ inizio file ]--- <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd" [ <!ENTITY % general_entities SYSTEM "../config/general.ent"> <!ENTITY % package_entities SYSTEM "../config/package.ent"> <!ENTITY % paco_entities SYSTEM "../config/paco.ent"> %general_entities; %package_entities; %paco_entities; ]> <alfs> <package name="paco" version="&paco-version;"> <stage name="Unpacking"> <unpack> <archive>&packages_dir;/&paco-package;</archive> <destination>&build_dir;</destination> </unpack> </stage> <stage name="Installing"> <stageinfo> <base>&build_dir;/&paco-directory;</base> </stageinfo> <configure> <param>--prefix=/usr</param> <param>--disable-gpaco</param> <param>--sysconfdir=/etc</param> </configure> <make /> <make> <param>install</param> </make> <textdump> <file>/etc/pacorc</file> <content> =LOGDIR=&paco-logdir; =INCLUDE=&paco-include; =EXCLUDE=&paco-exclude; </content> </textdump> </stage> <stage name="Cleanup"> <remove>&build_dir;/&paco-directory;</remove> </stage> </package> </alfs> ---[ fine file ]---
LFS.xml
Il file LFS.xml deve essere editato per includere l'installazione di paco, giusto dopo la sezione 'basic-dev' nel capitolo 6:
---[ inizio frammento del file ]--- <xi:include href="chapter06/basic-dev.xml" /> <xi:include href="chapter06/paco.xml" /> <xi:include href="chapter06/libc-headers.xml" /> ---[ fine frammento del file ]---
Le variabili d'ambiente di paco devono essere impostate nel capitoli 6, 7, 8 e 9.
Per ciascuno di questi capitoli, nell'elemento <environment>, devono essere inserite
le impostazioni delle seguenti variabili:
---[ inizio frammento del file ]--- <variable name="PACO_DEBUG">&paco-debug;</variable> <variable name="PACO_TMPFILE">&paco-tmpfile;</variable> <variable name="PACO_INCLUDE">&paco-include;</variable> <variable name="PACO_EXCLUDE">&paco-exclude;</variable> ---[ fine frammento del file ]---
chapter0?/*.xml
Per concludere, il lavoro più duro: Ogni profilo XML nel quale sia stato installato un qualsiasi pacchetto deve essere modificato, se si vuole che il pacchetto sia loggato.
Fino a che tutti i pacchetti non sono installati nello stesso modo, non sarà facile apportare le modifiche in modo automatico.
Segue un esempio di come dovrebbe essere fatto in pratica.
2.3.Esempio
Prendere il file chapter06/zlib.xml. Per semplificarlo, si sono tolte alcune parti
come lo stage “Patching” e il checksum md5. Questo file è un buon esempio,
perché i comandi install e non-install avvengono alternativamente.
Senza utilizzare paco il file sarebbe così:
---[ inizio file ]--- <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd" [ <!ENTITY % general_entities SYSTEM "../config/general.ent"> <!ENTITY % package_entities SYSTEM "../config/package.ent"> %general_entities; %package_entities; ]> <alfs> <package name="zlib" version="&zlib-version;"> <stage name="Unpacking"> <unpack> <archive>&packages_dir;/&zlib-package;</archive> <destination>&build_dir;</destination> </unpack> </stage> <stage name="Installing"> <stageinfo> <base>&build_dir;/&zlib-directory;</base> </stageinfo> <configure> <param>--prefix=/usr</param> <param>--shared</param> </configure> <make /> <make> <param>install</param> </make> <remove>/lib/libz.so</remove> <link> <option>force</option> <target>../../lib/libz.so.&zlib-version;</target> <name>/usr/lib/libz.so</name> </link> <make> <param>clean</param> </make> <configure> <param>--prefix=/usr</param> </configure> <make /> <make> <param>install</param> </make> <permissions mode="644"> <name>/usr/lib/libz.a</name> </permissions> </stage> <stage name="Cleanup"> <remove>&build_dir;/&zlib-directory;</remove> </stage> </package> </alfs> ---[ fine file ]---
Ed ecco lo stesso file, ma utilizzando paco per tracciare l'installazione.
Le nuove righe aggiunte sono marcate con un '+' all'inizio. Le righe modificate sono
marcate con '!':
---[ inizio file ]--- <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd" [ <!ENTITY % general_entities SYSTEM "../config/general.ent"> <!ENTITY % package_entities SYSTEM "../config/package.ent"> + <!ENTITY % paco_entities SYSTEM "../config/paco.ent"> + %paco_entities; %general_entities; %package_entities; ]> <alfs> <package name="zlib" version="&zlib-version;"> <stage name="Unpacking"> <unpack> <archive>&packages_dir;/&zlib-package;</archive> <destination>&build_dir;</destination> </unpack> </stage> ! <stage name="Building"> <stageinfo> <base>&build_dir;/&zlib-directory;</base> </stageinfo> <configure> <param>--prefix=/usr</param> <param>--shared</param> </configure> <make /> + </stage> + <stage name="Installing"> <stageinfo> + &paco-ld-preload; <base>&build_dir;/&zlib-directory;</base> </stageinfo> + &paco-clear; <make> <param>install</param> </make> <remove>/lib/libz.so</remove> <link> <option>force</option> <target>../../lib/libz.so.&zlib-version;</target> <name>/usr/lib/libz.so</name> </link> + </stage> + <stage name="Building"> + <stageinfo> + <base>&build_dir;/&zlib-directory;</base> + </stageinfo> <make> <param>clean</param> </make> <configure> <param>--prefix=/usr</param> </configure> <make /> + </stage> + <stage name="Installing"> + <stageinfo> + &paco-ld-preload; + <base>&build_dir;/&zlib-directory;</base> + </stageinfo> <make> <param>install</param> </make> <permissions mode="644"> <name>/usr/lib/libz.a</name> </permissions> + </stage> + <stage name="Logging"> + <stageinfo> + <base>&build_dir;/&zlib-directory;</base> + </stageinfo> + &paco-log-dirname; </stage> <stage name="Cleanup"> <remove>&build_dir;/&zlib-directory;</remove> </stage> </package> </alfs> ---[ fine file ]---
Analizziamo le diverse modifiche che sono state fatte:
Primo, sono incluse le entità paco. Questo è ottenuto con le righe:
<!ENTITY % paco_entities SYSTEM "../config/paco.ent"> %paco_entities;
Lo stage Installing originale è stato suddiviso in stage differenti:
# “Building” (primo passo):
Il pacchetto è configurato e compilato. Nessun file è installato nel sistema,
così si lasciano i comandi intatti.
# “Installing” (primo passo):
Vengono installati alcuni file, così si deve impostare la variabile d'ambiente LLD_PRELOAD
all'inizio dello stage. Questo è fatto dalla “macro” XML paco-ld-preload:
<stageinfo> &paco-ld-preload; <base>&build_dir;/&zlib-directory;</base> </stageinfo>
E siccome è il primo stage “Installing” in questo file, il file temporaneo libpaco-log viene rimosso per assicurare che non venga loggato nessun file installato da qualche precedente pacchetto installato:
&paco-clear;
# “Building” (secondo passo):
Il pacchetto è nuovamente riconfigurato per installare la libreria statica.
La variabile LD_PRELOAD non è automaticamente azzerata perché l'ambiente impostato nello
<stageinfo> del precedente stage non è visto da quello corrente.
# “Installing” (secondo passo):
Viene installata la libreria statica. Viene impostata nuovamente la
variabile LD_PRELOAD, ma questa volta non si usa “&paco-clear”, perché
non si vuole sovrascrivere i file già loggati, ma aggiungere nuovi file nel log.
# “Logging”:
Questo è uno stage completamente nuovo.
Adesso che l'elenco dei file che devono essere loggati è salvato nel file
temporaneo libpaco-log, un comando “paco -lp” crea il log per il
pacchetto. Questo è fatto con la “macro” XML paco-log-dirname. E'
importante notare che questa macro funziona quando il nome della
directory dalla quale il pacchetto è compilato è la stessa del nome del
pacchetto e di come si vuole che sia loggato. Questo è generalmente vero
per tutti i pacchetti, con le seguenti eccezioni:
In questi casi, la macro &paco-log-dirname; dovrebbe essere sostituita dalle seguenti righe:
<execute command="paco"> <param>-lp foo-&foo-version;</param> <param>< &paco-tmpfile;</param> </execute> &paco-clear;
dove 'foo' è il nome del pacchetto da loggare.
3.FINE
Questo hint finisce qui. Adesso dovrebbe essere possibile al lettore compilare un intero
sistema LFS con la sola pressione del tasto Enter, avendo controllato almeno
ogni byte scritto sull'hard disk. He!
E questo è solo l'inizio. Con poche modifiche, le istruzioni sopra
possono essere applicate per installare anche tutte le altre quisquillie di BLFS…
RICONOSCIMENTI:
Si desidera ringraziare specialmente lo staff di ALFS. Sono veramente
impressionato delle possibilità del sistema ALFS.
Non più notti sprecate davanti al monitor del computer, digitando “./configure &&
make && make install” come degli zombie…
Voglio ringraziare anche Brad Bailey per la creazione della versione iniziale della
patch alfs-paco, e per aver incoraggiato la scrittura di questo hint.
E concludendo, non posso dimenticare le persone che hanno aiutato lo sviluppo di paco.
CHANGELOG: