Autospec
Contents
Pre-requirements
- autospec user should belong to the packager group. The default user created during openmamba installation does already belong to this group.
Installation
Install the package called autospec using synaptic or the following command:
sudo apt-get install autospec
Configuration
In your home create a file called
.autospec
with a content like this:
# [configuration file for `autospec'] DISTRO="openmamba" VENDOR="openmamba" packager_fullname="''enter your full name here''" packager_email="''enter your email address here''" ftp_alias[0]="devel" ftpurl_ro_rpms[0]="http://www.openmamba.org/pub/openmamba/devel/RPMS.@arch@" ftpurl_ro_srpms[0]="http://www.openmamba.org" ftp_rw_server[0]="ftp://ftp.openmamba.org/" ftp_rw_port[0]= ftp_rw_passive_mode[0]=on ftp_rw_user[0]= ftp_rw_passwd[0]="" ftp_rw_rpms_dir[0]="/RPMS.@arch@" ftp_rw_srpms_dir[0]="/SRPMS.base" ftp_rw_server[0]="" ftp_rw_port[0]= ftp_rw_passive_mode[0]=on ftp_rw_user[0]= ftp_rw_passwd[0]="" ftp_rw_rpms_dir[0]="/RPMS.@arch@" ftp_rw_srpms_dir[0]="/SRPMS.base" arch_list[0]="i586" arch_noarch_upload[0]="${arch_list[0]}" ftpdir_rw_old[0]="/old" ftp_alias[1]="devel-games" ftpurl_ro_rpms[1]="http://www.openmamba.org/pub/openmamba/devel-games/RPMS.@arch@" ftpurl_ro_srpms[1]="http://www.openmamba.org/pub/openmamba/devel-games/SRPMS.base" ftp_rw_server[0]="ftp://ftp.openmamba.org/" ftp_rw_port[0]= ftp_rw_passive_mode[0]=on ftp_rw_user[0]= ftp_rw_passwd[0]="" ftp_rw_rpms_dir[0]="/RPMS.@arch@" ftp_rw_srpms_dir[0]="/SRPMS.base" ftp_rw_server[0]="" ftp_rw_port[0]= ftp_rw_passive_mode[0]=on ftp_rw_user[0]= ftp_rw_passwd[0]="" ftp_rw_rpms_dir[0]="/RPMS.@arch@" ftp_rw_srpms_dir[0]="/SRPMS.base" arch_list[1]="i586" arch_noarch_upload[1]="${arch_list[1]}" ftpdir_rw_old[1]="/old" ftp_rw_server_num_default=0 format_description_width=0
This configuration gives read-only access to the devel[1] and devel-games [2] repositories.
Configuring a proxy in Autospec
In the .autospec file in your home add the line proxy="indirizzoproxy:porta" e.g.: proxy="10.12.111.10:3128"
and replace each repository configuration with the following lines (replace [0] with the number associated to each repository):
ftp_rw_server[0]="http://www.openmamba.org" ftp_rw_rpms_dir[0]="/pub/openmamba/''enter repository name here''/RPMS.@arch@" ftp_rw_srpms_dir[0]="/pub/openmamba/''enter repository name here''/SRPMS.base" ftpurl_ro_rpms[0]="ftp://ftpaccounts.openmamba.org/pub/openmamba/''enter repository name here''/RPMS.@arch@" ftpurl_ro_srpms[0]="ftp://ftpaccounts.openmamba.org/pub/openmamba/''enter repository name here''/SRPMS.base"
Creating a new RPM package
You need to start getting the following information:
- source url archive: the full internet address of the source archive for the software you want to package
- package name: the package name, usually the first part of the <source archive url>
type the following command:
autospec -s source_url_archive -o package_name.spec
If the package is ok a spec file will be created with the name:
/usr/src/RPM/SPEC/package_name.spec
before proceeding you need to edit this file and add some information:
- Summary: a short description of the software component
- Group: a group taken from the openmamba defined groups
- URL: the internet address of the home page with descriptive information on this software
- License: the license of this software
Updating a RPM package
autospec permette l'aggiornamento semi-automatico di un pacchetto software, ricavando automaticamente per molti di questi il numero dell'ultima versione disponibile.
Digitare il seguente comando:
autospec -u nome_pacchetto -a1:4
Se non viene identificato il nuovo numero di versione, oppure è stata individuata una versione instabile, si può specificare manualmente la versione a cui aggiornare con il comando:
autospec -u nome_pacchetto -a1,3,4 numero_nuova_versione
Compilazione e pacchettizzazione
Per effettuare la compilazione del componente software e creare i pacchetti RPM binari digitare il comando:
autospec -u nome_pacchetto -a5
Questa operazione può richiedere un tempo variabile. In alcuni casi la pacchettizzazione consiste solo nella copia di files e può richiedere pochi secondi, in altri si tratta di compilare migliaia di righe di codice sorgente e questa operazione può richiedere un tempo variabile tra alcuni minuti ed alcune ore a seconda della dimensione del software.
Raggruppamento dei file
Il risultato normalmente ottenuto, se l'operazione è andata a buon fine, è di ottenere un output che contiene un elenco di file come nell'esempio seguente:
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/libz-root error: Installed (but unpackaged) file(s) found: /lib/libz.so.1 /lib/libz.so.1.2.3 /usr/include/zconf.h /usr/include/zlib.h /usr/include/zutil.h /usr/lib/libz.a /usr/lib/libz.so /usr/share/man/man3/zlib.3.gz RPM build errors: Installed (but unpackaged) file(s) found: /lib/libz.so.1 /lib/libz.so.1.2.3 /usr/include/zconf.h /usr/include/zlib.h /usr/include/zutil.h /usr/lib/libz.a /usr/lib/libz.so /usr/share/man/man3/zlib.3.gz
I files elencati andranno inseriti nel pacchetto principale oppure in sottopacchetti del pacchetto principale. Nel caso di questo esempio, la libreria zlib, il pacchetto principale si chiamerà libz e si aggiungerà un sottopacchetto denominato libz-devel. Il sottopacchetto -devel contiene tutti i file che servono solo per lo sviluppo di altri software che utilizzano questa libreria come dipendenza. Esempi di file sono:
- %{_includedir}/*.h, %{_includedir}/*.hpp: prototipi di librerie
- %{_libdir}/*.so: collegamento alla libreria utilizzato dal linker in fase di compilazione
- %{_libdir}/*.la: file contenente informazioni per il linking della libreria
- %{_libdir}/*.a: libreria statica utilizzata per la creazione di applicazioni che non dipendono dinamicamente dalla libreria dinamica
- %{_libdir}/pkgconfig/*.pc: file contenente i flag da passare al compilatore/linker per l'utilizzo di questa libreria
Una volta aggiornato lo specfile, prima di rilanciare la compilazione, è possibile verificare che tutti i file siano stati inclusi correttamente negli elenchi %files con:
rpmbuild -bl nome_pacchetto.spec
Se questa operazione non restituisce errori o file non inclusi si può di nuovo lanciare la compilazione e questa volta al termine dell'operazione saranno prodotti i pacchetti attesi.
Posizionamento dei pacchetti prodotti
Se l'operazione è andata a buon fine nella directory
/usr/src/RPM/RPMS/i586
oppure
/usr/SRC/RPM/RPMS/noarch
saranno disponibili i pacchetti installabili, mentre il pacchetto sorgente sarà in:
/usr/SRC/RPM/SRPMS
Problemi di compilazione e/o pacchettizzazione
Questa è la fase più complessa di tutto il procedimento, si tratta di una situazione equivalente al centro della partita nel gioco degli scacchi, è il momento in cui occorre applicare doti quali l'ingegno, l'esperienza, l'intuito, l'estro ecc. per giungere al risultato desiderato!
Normalmente la prima cosa da fare è cercare, tra i molti messaggi che compaiono a video, qual è stato l'errore che ha causato la terminazione del processo. Normalmente in presenza di molti errori è sufficiente iniziare a considerare soltanto il primo, perché i successivi potrebbero esserne una conseguenza.
Solitamente occorre effettuare modifiche nello specfile e/o applicare delle patch al codice sorgente.
In ogni caso ci sono diverse possibilità per agire ed arrivare ad un risultato funzionante, ed è buona norma scegliere il metodo che tenga in considazione il più possibile i seguenti aspetti:
- il modo in cui il software viene sviluppato e mantenuto dai suoi sviluppatori. Poiché saranno disponibili nuove versioni che occorrerà aggiornare in openmamba è bene applicare modifiche che si può presumere che funzioneranno anche nelle versioni successive
- che ciò che è stato fatto sia chiaro ad altri manutentori del pacchetto
- in nessun caso rimuovere da uno specfile qualcosa se non si è chiaro di cosa faccia e perchè lo faccia
- evitare di introdurre problemi di regressione delle funzionalità del componente software: dopo un aggiornamento la nuova versione del pacchetto deve mantenere almeno le stesse funzionalità della versione precedente
Verifica dei build requirements
Dopo che i pacchetti sono stati creati con successo, occorre verificare che siano stati specificati tutti i build requirements necessari. autospec permette di identicare automaticamente la maggior parte dei build requirements con il comando:
autospec -u nome_pacchetto -a6
ad esempio:
[silvan@openmamba SPECS]$ autospec -u mediawiki -a6 aggiornamento del pacchetto mediawiki alla versione [?]... [step 6] -- creazione della lista dei build requirement * /usr/src/RPM/RPMS/noarch/mediawiki-1.10.2-3mamba.noarch.rpm * /usr/src/RPM/RPMS/noarch/mediawiki-theme-openmamba-1.10.2-3mamba.noarch.rpm ## AUTOBUILDREQ-BEGIN BuildRequires: apache-mod_php BuildRequires: bash BuildRequires: diffutils BuildRequires: ImageMagick-devel BuildRequires: mysql BuildRequires: php-apc BuildRequires: php-devel BuildRequires: php-mysql ## AUTOBUILDREQ-END
Copiare o modificare il testo compreso tra ##AUTOBUILDREQ-BEGIN e ##AUTOBUILDREQ-END (comprese queste due righe) nello specfile ed aggiungere eventuali altri build requirements mancanti noti.
Non è necessario effettuare di nuovo il build ma basta ricreare il pacchetto sorgente con il comando:
autospec -u nome_pacchetto -a5 --norpm
Test di installazione
Una volta completato il processo di pacchettizzazione è opportuno effettuare un test di quanto realizzato effettuando l'installazione dei pacchetti RPM che sono stati creati. I pacchetti creati saranno disponibili nelle seguenti cartelle:
Percorso | Contenuto | Estensione |
---|---|---|
/usr/src/RPM/SRPMS | Sorgenti | .src.rpm |
/usr/src/RPM/RPMS/noarch | Pacchetto installabile per tutte le architetture | .noarch.rpm |
/usr/src/RPM/RPMS/i586 | Pacchetto installabile per architetture i586 e compatibili | .i586.rpm |
/usr/src/RPM/RPMS/SOURCES | Archivi sorgenti, patch e altri file sorgenti | .tar.gz .tar.bz2 .zip e altre |
/usr/src/RPM/RPMS/SPEC | Script di pacchettizzazione (specfiles) | .spec |
Per installare i pacchetti realizzati è possibile utilizzare il comando rpm:
sudo rpm -i nome_pacchetto1 nome_pacchetto2 ...
oppure autospec che effettuerà l'installazione di tutti i pacchetti disponibili:
autospec -u nome_pacchetto -a11
Invio del pacchetto in un repository
L'invio dei pacchetti prodotti richiede di avere l'autorizzazione per l'accesso ftp in upload. Normalmente questo avviene utilizzando il proprio repository personale che può essere richiesto contattando i manutentori della distribuzione.
Il proprio repository dev'essere configurato aggiungendo le righe sottostanti al file ~/.autospec. In questo esempio è riportata la configurazione per un ipotetico repository devel-john dell'utente john e supponendo che il primo vettore di configurazione libero sia il numero 2:
# Repository personale ftpurl_ro_rpms[2]="http://www.openmamba.org/pub/openmamba/devel-john/RPMS.@arch@" ftpurl_ro_srpms[2]="http://www.openmamba.org/pub/openmamba/devel-john/SRPMS.base" ftp_rw_server[2]="ftp://ftpaccounts.openmamba.org" ftp_rw_port[2]= ftp_rw_passive_mode[2]=on ftp_rw_user[2]=john ftp_rw_passwd[2]="password" ftp_rw_rpms_dir[2]="/RPMS.@arch@" ftp_rw_srpms_dir[2]="/SRPMS.base" arch_list[2]="i586" arch_noarch_upload[2]="${arch_list[0]}" ftpdir_rw_old[2]="/old"
L'invio avviene con il seguente comando:
autospec -u nome_pacchetto -a10 --server 2