Gentoo Documentation - eclass HOWTO

Contenuti:

1.Introduzione alle eclasses

L'idea dietro le eclasses 

Le eclasses sono moduli di codice condiviso. Sono scritte in bash e hanno la stessa sintassi degli ebuild ordinari, sono ereditate dagli ebuilds e dalle altre eclasses, per provvedere a dare dei settaggi di default e funzionalità per molti ebuild simili.

Vengono utilizzate per assicurare il miglior riutilizzo di codice possibile per gli ebuild simili.

Questo primo capitolo spiega brevemente come scrivere una eclass includendo i trucchi standard e le tecniche utilizzate nelle eclasses esistenti. Il secondo è uno sguardo d'insieme alle eclasses kde. Il terzo spiega come scrivere un ebuild KDE utilizzando il gruppo delle eclasses kde.

Un esempio di eclass semplice 

Qui abbiamo una eclass sourforge.eclass fittizia, scritta per fornire le locazioni della homepage e del download ai progetti hostati da sourceforge:

Esempio 1: Esempio: sourceforge.eclass

# Copyright 2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License, v2 or later
# Author Dan Armak <danarmak@gentoo.org>
# $Header: /var/www/www.gentoo.org/raw_cvs/gentoo/xml/htdocs/doc/it/eclass-howto.xml,v 1.4 2004/05/01 15:01:32 mush Exp $
ECLASS=sourceforge
INHERITED="$INHERITED $ECLASS"
# This eclass sets $HOMEPAGE and $SRC_URI to the standard vaules for
# sourceforge.net - hosted projects.

HOMEPAGE="http://${PN}.sourceforge.net/"
SRC_URI="http://download.sourceforge.net/${PN}/${P}.tar.gz"

Nota: Le linee ECLASS= e INHERITED= aiutano portage a gestire il caching delle dipendenze con le eclasses; devono essere presenti in ogni eclass o le cose andranno male. $ECLASS è utilizzata da EXPORT_FUNCTIONS(). Queste variabili verranno deprecate in futuro e settate automaticamente da portage in inherit().

Le prime quattro linee sono headers, come quelle in ogni ebuild. Le altre due linee sono una corta descrizione della eclass. Il resto del codice setta SRC_URI e HOMEPAGE.

La maggior parte delle eclasses vanno oltre i settaggi di variabili e la fornitura di funzioni di supporto; esse contengono le versioni di default delle funzioni speciali degli ebuild (src_unpack, scr_compile e così via). Prima di scrivere una funzione di default in una eclass, dovete controllare quella già contenuta in ebuild.sh(se esiste). Essa sarà quella che verrà eseguita se non ne mettete una vostra nell'ebuild (non sempre tramite eclass); la scr_unpack() di default viene spesso usata. Se non la avete ancora, andate a guardare le implementazioni di default in ebuild.sh.

Questo è tutto ciò che avete bisogno di conoscere per scrivere le eclasses. Mettete le vostre eclass in $PORTDIR/eclass/, e mettete questa linea all'inizio del vostro ebuild:

Esempio 2: Ereditare eclasses

                        inherit sourceforge

I contenuti delle eclass dovranno essere incluse a questo punto. Ricordate che ogni variabile o funzione definita nella eclass può essere sovrascritta da una nell'ebuild, il cui codice viene eseguito con priorità più alta rispetto alle eclasses. Comunque, potete provare a mettere più settaggi di default possibili e codice comune nella eclass. Ogni settaggio non standard e modificazione può quindi venir messa nell'ebuild.

Puoi anche includere varie eclasses nello stesso tempo scrivendo:

Esempio 3: Ereditare eclasses multiple

                        inherit eclass1 eclass2 [...]

attenzione però al loro ordine! Ricordate, le eclasses possono ereditare una e sovrascrivere i settaggi di un'altra, quindi bisogna stare attenti quando si includono eclasses multiple che possono influenzarne altre.

Possiamo ora andare avanti e vedere i trucchi per la scrittura delle eclass, prima di andare a quelleattuali di portage.

inherit() 

Questa funzione risiede in ebuild.sh e gestisce l'inclusione delle eclasses. Viene chiamata con una lista di nomi di eclass da ereditare: inherit <eclass1> [eclass2 eclass3...].

Inoltre includere i file eclass, setta le variabili ECLASS e INHERITED usate da portage per registrare i timestamp di modifica. La variabile INHERITED si usa scrivendo le eclasses: contiene una lista di tutte le classi ereditate dal punto dove è dichiarata la variabile, in ordine. Ciò fa determinare alla eclass se è stata chiamata da qualche altra eclass.

EXPORT_FUNCTIONS 

Molte funzioni predefinite di eclass possono essere usate come sono; l'ebuild allora conterrà poco codice (che è un'ottima cosa). Talvolta, comunque, le funzioni eclass non fanno esattamente ciò che vi serve. Potete allora scrivere una nuova funzione nell'ebuild, sovrascrivendo la definizione della funzione della eclass. Comunque, questo minimizzerà il beneficio della riutilizzazione di codice. Quindi proviamo ad estendere le funzioni delle eclasses.

Supponiamo di voler estendere src_compile(). Potete scrivere una definizione di scr_compile() nel vostro ebuild che includerà solo le parti mancanti della src_compile() nella eclass. Dovete allora chiamare la eclass src_compile() dal codice della vostra funzione personalizzata.

Ad ogni modo, se create una nuova funzione chiamata src_compile(), bash dimenticherà tutto della vecchia e non potrete chiamarla! E` qui che entrano in gioco le macro EXPORT_FUNCTIONS.

Diamo un'occhiata a un altro problema per un momento. Supponiamo che foo.eclass e bar.eclass sono definite in src_compile(). Se ereditiamo tutte e due abbiamo una diversa src_compile() dipendentemente dall'ordine in cui ereditiamo foo e bar. Va bene, ora dovreste sapere che dovete mantenere traccia dell'ordine di ereditarietà. Puoi anche però voler chiamare esplicitamente una delle due src_compile().

Quindi, ogni eclass aggiunge un prefisso a ogni funzione definita. Per esempio la eclass foo.eclass definirà una funzione chiamata foo_src_compile() e bar.eclass definirà bar_src_compile(). Così, l'ebuild può chiamare tutte e due le funzioni e saprà cosa sta facendo.

Comunque, potremmo anche voler avere una funzione di default chiamata solo src_compile(), o l'ebuild dovrà definirne una. La macro EXPORT_FUNCTIONS risolve questo problema e quello iniziale.

Esempio 4: EXPORT_FUNCTIONS() (da ebuild.sh)

EXPORT_FUNCTIONS() {
	while [ "$1" ]; do
		eval "$1() { ${ECLASS}_$1 ; }" > /dev/null
		shift
	done
}

La funzione inherit() setta $ECLASS con il nome della eclass prima di ogni operazione. La eclass, alla sua fine chiama EXPORT_FUNCTIONS(), passando come parametri la lista delle funzioni di default che fornisce. Ad esempio, se chiamate

Esempio 5

EXPORT_FUNCTIONS src_compile src_install

EXPORT_FUNCTIONS chiamerà eval() nella seguente stringa:

Esempio 6

src_unpack() { foo_src_compile() ; }
src_compile() { foo_src_compile() ; }

Ora, qualsiasi eclass ereditata per ultima, definirà la funzione default di src_compile() ma ogni funzione potrà essere chiamata direttamente dall'ebuild se necessario.

Potete anche estendere la default src_compile() chiamando la funzione eclass dalla vostra funzione. Dovete allora usare il nome intero della funzione di default foo_src_compile(), un esempio:

Esempio 7: Estendere le funzioni di default delle eclass nel vostro ebuild

#in foo.eclass:
foo_src_compile() {
	[default code here]
}

EXPORT_FUNCTIONS src_compile
#end eclass code

#in an ebuild:
inherit foo

src_compile() {
	[codice personalizzato]
	foo_src_compile
	[ancora codice personalizzato]
}

Sezioni delle funzioni 

Talvolta, estendere le funzioni di default aggiungendo codice prima e dopo non è abbastanza flessibile. Quando si ha a che fare con funzioni lunghe e complesse, spesso vorrete avere il vostro codice personalizzato in mezzo a queste funzioni.

Le sezioni delle funzioni permettono una grande flessibilità in questo. Esse dividono le funzioni in varie sezioni e vi permettono di eseguire codice fra le sezioni.

L'implementazione è semplice. Prendiamo un esempio di src_compile() da base.eclass. (Nota: non esiste ma è un buon esempio :-) Appare come segue:

Esempio 8: Esempio da base.eclass

base_src_compile() {
    ./configure || die
    emake || die
}

Qua abbiamo la stessa funzione, divisa in due sezioni:

Esempio 9: La stessa funzione divisa in due sezioni.

base_src_compile() {
 
    [ -z "$1" ] && base_src_compile all
 
    while [ "$1" ]; do
        case $1 in
            configure)
                ./configure || die;;
            make)
                emake || die;;
            all)
                base_src_compile configure make;;
        esac
    shift
    done
}

Il codice è stato diviso in due sezioni: configure e make. Nel nostro semplice esempio, esse corrispondono ai due comandi della funzione originale.

Al centro della nuova funzione troviamo un blocco while;case...esac;shift;done. Questo blocco trova i parametri della funzione con i nomi della sezione definita ed esegue le linee di codice corrispondenti.

Il caso speciale all chiama la stessa funzione ricorsivamente con una lista di sezioni ordinate. E` compito dell'autore della eclass aggiornare questa lista.

La linea prima del blocco di codice dice che una chiamata senza parametri deve essere trattata come una chiamata con singolo parametro all. Come potete vedere, questa funzione si richiama molto. Notate, comunque, che la chiamata base_src_compile configure all make è comunque lecita; essa eseguirà base_src_compile configure configure make make.

Ora, nel vostro ebuild (o eclass) che eredita le funzioni da base.eclass, avete la funzione abbreviata src_compile che chiama base_src_compile senza parametri. Ciò esegue base_src_compile all, ossia, tutte le sue sezioni. Potete lasciare tutto com'è. Se volete estendere, potete definire una nuova src_compile e chiamare base_src_compile una sezione per volta:

Esempio 10: Utilizzare la src_compile() sezionata

src_compile() {
    run_my_code1
    base_src_compile configure
    run_my_code2
    base_src_compile make
    run_my_code3
}

Come potete vedere, le sezioni aggiungono flessibilità quando potete inserire codice fra due di esse, lo fanno anche quando esse vengono eseguite in un ordine differente da quello prestabilito o si esegue sono qualcuna delle sezioni disponibili. Ciò permette un grande riutilizzo di codice.

Le funzioni debug-print-* 

Queste sono altre funzioni fornite da ebuild.sh. Esse aggiungono un output dettagliato per il debug alle eclasses, per permettervi di tracciare la loro esecuzione più facilmente senza dover leggere le lunghe tracce lasciate dal semplice debugging di bash. Tutte le mie eclasses chiamano molto queste funzioni.

debug-print() stampa semplicemente tutti i suoi parametri con il prefisso 'debug:'. Viene chiamata quando c'è qualcosa di interessante da mettere nel log di debug.

debug-print-function() stampa 'debug: entro nella funzione $1, parametri: $2 [$3 ...-] Viene chiamata all'inizio di una funzione.

debug-print-section() stampa 'debug: entro nella sezione $1'. Viene chiamata all'inizio di una sezione di funzione.

L'ouput di debug va normalmente in $T/eclass-debug.log. Potete settare la variabile d'ambiente ECLASS_DEBUG_OUTPUT (in make.globals/conf o nell'ambiente stesso) e l'output verrà mandato tranquillamente dove specificato. Potete anche settarla nel valore speciale 'on', che visualizza l'output nell'stdout con i messaggi di emerge.

Aggiungiamo un'output di debug tipico alla nostra funzione di esempio:

Esempio 11: Aggiungere debug statements

base_src_compile() {
 
    debug-print function $FUNCNAME $*
    [ -z "$1" ] && base_src_compile all
 
    while [ "$1" ]; do
        case $1 in
            configure)
                debug-print-section configure
                ./configure || die;;
            make)
                debug-print-section make
                make || die;;
            all)
                debug-print-section all
                base_src_compile configure make;;
        esac
    shift
    done
 
    debug-print "$FUNCNAME: result is $RESULT"
}

FYI, $FUNCNAME è un builtin bash che restituisce il nome della funzione corrente.

2.Eclasses esistenti

Introduzione 

Molte eclasses sono semplici, e potete semplicemente leggerle e dare un'occhiata agli ebuild che le usano per capire come funzionano. Molte eclasses sono ben-commentate, quindi è meglio leggerle.

Questo capitolo del documenta le relazioni fra le eclasses kde*.

base.eclass 

Questa eclass definisce alcune variabili di default e funzioni, simili a quelle che potete avere di default in un ebuild non ereditario (definite in ebuild.sh). Probabilmente non sarete interessati a utilizzarla direttamente ma tramite una delle eclasses kde che la eredita.

Un'interessante funzionalità che fornisce è la capacità autopatch. Se settate la variabile PATCHES per contenere una lista di files nel vostro ebuild che usa base_src_unpack() (o kde_src_unpack()), i sorgenti verranno patchati da questi files. Le patch necessitano il parametro -p0 quando vengono eseguite da $S.

Nota che potete settare PATCHES senza definire una src_unpack() personalizzata nel vostro ebuild! E` fatta apposta.

La nuova funzione epatch() proveniente da eutils.eclass è molto più potente - supporta patch compresse, directory di patch e serie, più la detection automatica del livello di patch - e intendo utilizzarla per autopatch.

Notate che la sezione patch in base_src_unpack() è deprecata e verrà rimossa. Se vedete un ebuild che la utilizza, ha bisogno di essere convertita nello stile autopatch.

kde-functions.eclass 

Questa eclass contiene tutte le funzioni d'aiuto in relazione con KDE. Alcun di esse non dovranno mai essere usate in un ebuild; esse non sono menzionate qu e dovranno essere ben commentate nei sorgenti.

Notate che per "funzioni di aiuto" intendo funzioni che non sono specifiche degli ebuild (src_unpack() etc.). Tutte le eclasses KDE contentgono funzioni speciali che ereditano funzioni kde.

Il solo codice fuori dalle funzioni in kde-functions.eclass è un blocco che determina se l'ebuild corrente fa parte di kde-base. Se si, KDEBASE=true viene settata. Questa variabile viene usata in vari test logici ed è comodo avere un test centralizzato per essa.

Lo schema corrente multi-kdedir

Una breve spiegazione su come Gentoo gestisce le versioni multiple di KDE:

KDE (da kde-base) è situata in /usr/kde/${major version}.{minor version}. Quindi, KDE 3.1.x sta in /usr/kde/3.1. Comunque, questo schema è stato stabilito dopo la release 3.0 di KDE e le versioni vecchie stanno nelle locazioni non standard: KDE 3.0.x sta in /usr/kde/3 (non in /usr/kde/3.0) e KDE 2.2.2 (la sola versione 2.x che abbiamo) sta in /usr/kde/2. Gli ebuild cvs che mantengo installano in /usr/kde/cvs.

Un numero diverso di minor versions di KDE possono coesistere. I pacchetti kde-base hanno una SLOT major.minor (es. 3.0, 3.1).

Da quando le versioni QT sono considerate completamente compatibili indipendentemente dalle minor versions, abbiamo solo ognuna delle major version installate con slot diversi; esse risiedono in /usr/qt/$major.

Un ebuild non-kde-base installa sempre in /usr. Il pacchetto kde-env mette KDEDIRS=/usr in env.d, permettendo a queste applicazioni di essere eseguite in maniera corretta. La applicazione si compila e si linka con le ultime librerie KDE sul sistema; la eclass controlla le locazioni standard in ordine discendente - /usr/kde/cvs, poi /usr/kde/3.1 poi /usr/kde/3 (gli ebuild kde-base si linkeranno sempre con le kdelibs della loro versione) Questo dipende anche dai parametri passati a need-kde() (guarda più giù).

Esistono diverse variabili speciali che potete configurare per cambiare i settaggi di default di questo sistema. Il loro uso primario è compilare un ebuild con un KDE specifico installato da voi per testing, ma, potete anche usarlo per installare KDE in una locazione non standard e avere KDE 3.0.1 e 3.0.2 installati. Questo, ancora, è più utile per testing e sviluppo.

Tutte le applicazioni KDE (base e non base) verranno installate in $KDEPREFIX se esiste. Questo sovrascrive tutti gli altri settaggi delle eclasses.

Una applicazione KDE (sempre che sia kde-base) proverà a linkarsi sulle kdelibs installate in $KDELIBSDIR, se esiste. Se fallisce, tornerà sulla locazione di default di prima delle ultime kdelibs (o la versione propria per la versione kde-base).

need-kde(), need-qt(), set-kdedir(), set-qtdir()

kde-functions.eclass fornisce due paia di funzioni: need-kde(), need-qt() and set-kdedir(), set-qtdir(). Queste funzioni gestiscono i dettagli di molti settaggi KDE e QT.

La funzione need-kde() viene chiamata con un parametro che è la versione minima delle kdelibs di cui si necessita. Essa aggiunge le dipendenze a DEPEND, RDEPEND e chiama la funzione set-kdedir(). Se non viene passato nessun parametro un numero di versione 0 viene usato, ciAoA significa che ogni versione può soddisfare la dipendenza. need-kde() chiama anche need-autoconf() e need-automake() con i parametri necessari per la versione di KDE.

La funzione set-kdedir() allora determina il prefisso dell'installazione e la directory delle kdelibs che il vostro ebuild userà. Essi vengono passati a voi rispettivamente in $PREFIX e $KDEDIR (e sono gestiti automaticamente in kde.eclass). Notate che nessun ebuild deve indirizzare direttamente $KDEPREFIX o $KDELIBSDIR.

need-kde() controlla anche la versione minima di QT richiesta per questa versione delle kdelibs da una tabella. Quindi chiama need-qt() con questa versione. Un'applicazione qt-only (es. non kde) chiama sempre direttamente need-qt, bypassando need-kde.

La funzione need-qt() aggiunge la versione di QT necessaria a DEPEND, RDEPEND e chiama set-qtdir() con essa. La funzione set-qtdir() configura QTDIR con la locazione di default della versione di QT corrente. A differenza di set-kdedir(), set-qtdir() non controlla se c'è QT installato nella locazione.

need-kde() (o need-qt()) deve essere chiamata dalla parte principale dell'ebuild (non da una funzione), così che ogni cambiamento a DEPEND e RDEPEND agiscano su emerge.

need-autoconf(), need-automake()

Queste funzioni settano le variabili d'ambiente necessarie per far girare le versioni richieste di autoconf e automake. Eliminano anche i settaggi delle vecchoie variabili di questo tipo. Per esempio, chiamando 'need-automake 1.4' configurerà NEED_AUTOMAKE_1_4=1 e toglierà tutte le altre variabili WANT_AUTOMAKE*. Per maggiori informazioni controllate il codice delle funzioni e i commenti all'inizio di /usr/bin/auto{conf.make} (in un sistema Gentoo).

kde_sandbox_patch()

Alcuni makefile KDE non funzionano. Essi chmoddano o chownano i files in PREFIX quando li installano ma non rispettano DESTDIR ($D). Ad esempio quando si installa, essi copiano correttamente un file in $DESTDIR/$PREFIX/percorso/foo, ma quando provano a fare chmod +x il path $PREFIX/percorso/foo non sempre esiste. E se esiste, la sandbox previene questa operazione.

Questa funzione esegue un sed generico nei makefiles che sistemano tutti i casi di questo problema. Viene chiamata con le directory da processare come parametri e processa Makefile, Makefile.in e Makefile.am in queste directory. Per esempio:

Esempio 12: Processing

src_unpack() {
    base_src_unpack
    kde_sandbox_patch ${S}/dir1 ${S}/dir2/dir3
}

kde_remove_flag()

Questa funzione viene utilizzata per togliere le flag al compilatore che si sa possano rovinare il pacchetto. Potete chiamarla dopo l'unpacking, con la subdirectory $S come primo parametro e il nome della flag da rimuovere come secondo. Notate che non è ricorsiva. Esempio "kde_remove_flag foodir/barfoo -fomit-frame-pointer".

kde_remove_dir() and $KDE_REMOVE_DIR

Questa funzione toglie la subdirectory specificata dalla compilazione. Essa la rimuove e rimuove ogni sua occorrenza dal file subdirs, da configure e dai makefiles. Notate che funziona solo nelle subdir di $S per ora, non in subdir di secondo livello. Potete chiamarla con una lista di subdirectory da cancellare; funziona a turno con tutti i parametri.

Potete chiamarla direttamente ma per evitare di definire una src_unpack() personalizzata, fate questo, potete settare in KDE_REMOVE_DIR una lista di directory da rimuovere. kde_src_unpack() chiamerà 'kde_remove_dir $KDE_REMOVE_DIR' dopo l'unpacking. Come potete vedere, Sono andato molto avanti per evitare di dover definire una funzione extra in un ebuild, visto che ciò permette di costruire un ebuild più pulito e leggibile.

kde.eclass 

Questa è la eclass principale di KDE. Essa contiene molto del codice in relazione a KDE. Tutti gli ebuild KDE la ereditano, in un modo o nell'altro. La eclass kde eredita base e kde-functions.

Come per le altre eclasses, leggetela per trovare cosa fa. Molte cose si spiegano da sè. Qua abbiamo un breve sommario:

La sezione globale della eclass (quella che viene eseguita quando si eredita) aggiunge nelle dipendenze correnti kde-env, automake, autoconf, make e perl (l'ultimo utilizzato dagli script standard configure per la generazione veloce di makefile), essa setta anche lo slot di default a 0.

kde_src_unpack() chiama base_src_unpack(), passando parametri (es. sezioni da eseguire). Dopo questo, aggiunge elementi specifici di kde. Esegue touch su tutti i files .ui nei sorgenti scompattati per rigenerare tutti i file stantii .cpp e .h. Chiama anche kde_remove_dir() con $KDE_REMOVE_DIR se è settata (guarda nella sezione kde-functions).

kde_src_compile() ha varie correzioni. Una è l'esportazione di kde_widgetdir="$KDEDIR/lib/kde3/plugins/designer" per girare attorno a un bug nei vecchi acinclude.m4.in di kde. Un altro è settare HOME="$T/fakehome", così che ogni accesso a $HOME/.kde e $HOME/.qt non venga stoppato dalla sandbox e non abbia effetto sulla home dell'utente. E` un bug di uic che prova sempre ad accedere ai config files in quelle locazioni.

kde_src_compile() ha varie sezioni. myconf aggiunge a $myconf i parametri di default degli script configure di kde, come --prefix=${PREFIX} (ricordate, $PREFIX viene settato da set-kdedir()). Potete aggiungere i vostri valori personalizzati in $myconf prima o dopo questa sezione; ricordate solo di non sovrascrivere i vecchi valori perchè gli utenti potrebbero voler settare $myconf nella shell e aggiungere così qualcosa ai parametri configure usati dall'ebuild.

La sezione configure esegue lo script configure in $S, passandogli $myconf. Se lo script configure non esiste, prova a generarlo eseguendo make -f Makefile.cvs o make -f admin/Makefile.common. Così, questo passaggio della compilazione (che è necessario per le snapshots cvs o per gli ebuild che patchano files come configure.in) viene eseguito automaticamente.

La sezione make esegue semplicemente emake || die. Infine, esiste una sezione all che esegue tutto quello che è stato sopra descritto.

Infine, kde_src_install() ha una sezione make che esegue make install e ha anche una sezione dodoc che esegue dodoc in alcuni nomi di documenti standard in $S, come ad esempio README e COPYING.

kde-base.eclass 

Questa eclass ora e' deprecata, le applicazioni devono essere ereditate da kde.

kde.org.eclass 

Anche questa eclass e' deprecata e tutto il codice e' stato spostato a kde-dist.eclass.

kde-dist.eclass 

Questa eclass è per i pacchetti della distribuzione di base di kde in kde-base/*, eredita kde.

Setta in maniera corretta DESCRIPTION e HOMEPAGE e chiama need-kde $PV. Il più semplice e piccolo pacchetto di base per kde (es. kdetoys) non ha bisogno di modificarla in alcun modo; la maggior parte degli ebuild aggiungono solo dipendenze e patches.

kde-i18n.eclass 

Questa eclass serve ai pacchetti kde-i18n-*. Infatti, tutti gli ebuild kde-i18n sono completamente identici e quello che devono fare è ereditare questa eclass. Le loro variabili $P, $P e $PV fanno il resto.

koffice-i18n.eclass 

Questa eclass serve ai pacchetti koffice-i18n-* ed è molto simile a kde-i18n.eclass. Ancora, tutti gli ebuild koffice-i18n sono identici e tutto quello che devono fare è ereditare questa eclass.

cvs.eclass 

Questa eclass provvede a fornire le funzionalità necessarie a creare gli ebuild 'live' cvs. Questi ebuild scaricano i sorgenti dal server cvs specificato a tempo di unpack, prendendo gli ultimi bug e le fix dall'upstream.

Comunque, il supporto necessario per i live cvs ebuilds non è stato aggiungo a portage. Gli ebuild possono lavorare con questa eclass ma non è molto conveniente per alcuni aspetti. Pensateci due volte prima di creare un live cvs ebuild; forse un cvs snapshot regolare sarebbe meglio. Se intendete aggiungere un ebuild di questo tipo al portage, fate attenzione alle guide ai cvs ebuild nella guida dello sviluppatore.

Prima di ereditare cvs.eclass, settate tutti i settaggi non-default che volete (almeno l'indirizzo del server e il nome del modulo). Guardate la lista dei settaggi configurabili e di quelli di default all'inizio di cvs.eclass, marcato come 'ebuld-configurable settings'.

Dopo questo, le cose sono automatiche. Una cvs_src_unpack() (senza sezioni) viene eseguita. Se volete sapere di più leggete la eclass.

kde-source.eclass 

Questa eclass lavora su cvs.eclass, aggiugendo alcune funzionalità specifiche per kde. Per esempio essa scarica automaticamente la directory admin dal modulo common del cvs kde. Leggete la eclass per sapere di più, includendo i settaggi kde-cvs-specific che potete passargli.

3.Writing KDE ebuilds

Introduzione 

Questo capitolo spiega come scrivere ebuild standard per KDE. Tutto quello che viene detto qui è un riassunto delle informazionu sulle eclasses sopra. Quando siete in dubbio, guardate gli altri ebuild, le eclasses o chiedete.

Un tipico ebuild KDE 

Il codice qua sotto dovrebbe essere ovvio dopo aver letto questo howto:

Esempio 13: Un semplice ebuild KDE, #1

<header lines>
inherit kde

Alcuni ebuild finiscono qua. Altri hanno bisogno di qualche personalizzazione.

Il prossimo passo è aggiungere ogni dipendenza extra. Ricordate: estendete *sempre* le variabili, non sovrascrivetele!

Visto che il nostro obbiettivo è evitare funzioni personalizzate finchè non ne abbiamo bisogno, cerchiamo di configurare tutti i settaggi che possiamo e chiamare le funzioni di aiuto più che possiamo, direttamente dalla main section dell'ebuild. Ricordate che ci sono delle limitazioni nel codice della main section; per esempio, esso non deve produrre alcun output (debug-print() non conta).

Esempio 14: Un semplice ebuild KDE, #2: aggiungere dipendenze extra

DEPEND="foo/bar"
RDEPEND="bar/foo"

In Alternativa, una chiamata a newdepend() aggiungerà la dipendenza in DEPEND e RDEPEND:

Esempio 15: Un semplice ebuild KDE, #3: utilizzare newdepend()

newdepend "foo? ( bar )"

Possiamo anche voler aggiungere alcuni argomenti extra a myconf, che verranno passati a configure (assumendo che noi usiamo la sezione configure di kde_src_compile):

Esempio 16: Un semplice ebuild KDE, #4: passare argomenti a configure

myconf="$myconf --with-foobar"

Possiamo anche voler aggiungere una patch. Se essa può essere applicata utilizzando -p0 in $S, possiamo usare la sezione autopatch di base_src_unpack. Ricordate, kde_src_unpack() chiama base_src_unpack() passandogli tutti i parametri che gli date.

Esempio 17: Un semplice ebuild KDE, #5: autopatching

PATCHES="$FILESDIR/$P-myfix.diff"

Infine, possiamo voler usare extend_src_install() per mettere a posto la documentazione:

Esempio 18: Un semplice ebuild KDE, #6: estendere src_install()

src_unpack() {
    kde_src_install
    dodoc $S/doc/*
}

Guardiamo l'ebuild che abbiamo creato in questo esempio:

Esempio 19: Un semplice ebuild KDE, completo

<header lines>
inherit kde

# add deps
DEPEND="foo/bar"
RDEPEND="bar/foo"
newdepend "foo? ( bar )"

# always enable foobar
myconf="$myconf --with-foobar"

# fix terrible bug
PATCHES="$FILESDIR/$P-myfix.diff"

src_unpack() {
    kde_src_install
	# install some extra docs not included in make install's targets
    dodoc $S/doc/*
}

Un tipico ebuild con funzionalità opzionali di KDE 

Quando aggiungete la funzionalità (eclass) kde a un ebuild esistente, dovete sempre prefissare ogni linea specifica kde con use kde &&, o creare blocchu if [ -n "`use kde`" ]; then; fi.

Nella sezione generale, aggiugete ciò che segue (solo se USE kde è settato):

Esempio 20: Supporto opzionale a KDE - sezione main di un ebuild

    inherit kde-functions
	# this will add kdelibs, kde-env to your dep strings and set $KDEDIR
	# to the correct value:
    need-kde $version # minimal version of kde your app needs

	# add anything else you need for kde support:
	use kde && myconf="$myconf --with-my-parameter"

Dopo, dite alla vostra applicazione di vedere se c'è KDE nel settaggio $KDEDIR disponibile dopo la chiamata a need-kde(). Se non volete che venga aggiunta la dipendenza kdelibs, chiamate set-kdedir invece di need-kde().



Ultimo aggiorn.:
12 Marzo 2004
Dan Armak
Autore

John P. Davis
redazione

Bernardo Damele
Traduzione

Sommario: L'eclass howto illustra l'idea che sta dietro le eclasses, le eclasses correnti, ciò che fanno al loro interno e il modo giusto di scrivere delle eclasses e degli ebuild.
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.