Autospec

Da Wiki :: openmamba.
Jump to navigation Jump to search

Pre-requisiti

  • l'utente che utilizza autospec deve fare parte del gruppo packager. Normalmente l'utente creato durante l'installazione di openmamba fa già parte di questo gruppo.

Installazione

Installare il pacchetto denominato autospec utilizzando smart --gui oppure con il seguente comando:

sudo smart install autospec

Configurazione

Nella propria home creare un file denominato

.autospec

con contenuto simile al seguente:

# [configuration file for `autospec']

DISTRO="openmamba"
VENDOR="openmamba"

packager_fullname="<inserisci il tuo nome e cognome>"
packager_email="<inserisci il tuo indirizzo e-mail>"

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

Questa configurazione fornisce l'accesso in sola lettura ai repository devel[1] e devel-games [2].

Configurare un proxy in Autospec

Nel file .autospec della propria home inserire la riga proxy="indirizzoproxy:porta" ad esempio : proxy="10.12.111.10:3128"

ed effettuare queste modifiche per ogni repository (sostituire [0] con il numero del repository desiderato ed effettuare le modifiche per tutti i repository):

ftp_rw_server[0]="http://www.openmamba.org"
ftp_rw_rpms_dir[0]="/pub/openmamba/<inserisci il nome del repository>/RPMS.@arch@"
ftp_rw_srpms_dir[0]="/pub/openmamba/<inserisci il nome del repository>/SRPMS.base"
ftpurl_ro_rpms[0]="ftp://ftpaccounts.openmamba.org/pub/openmamba/<inserisci il nome del 
repository>/RPMS.@arch@"
ftpurl_ro_srpms[0]="ftp://ftpaccounts.openmamba.org/pub/openmamba/<inserisci il nome del 
repository>/SRPMS.base"

Creazione di un nuovo pacchetto RPM

Partendo dalle seguenti informazioni:

  • url archivio sorgente: l'indirizzo internet da cui è possibile scaricare l'archivio
  • nome pacchetto: il nome del pacchetto, solitamente la prima parte del nome dell'<url archivio sorgente>

digitare il seguente comando:

autospec -s url_archivio_sorgente -o nome_pacchetto.spec

Se non ci sono stati problemi viene creato il seguente file anche denomianto specfile:

/usr/src/RPM/SPEC/nome_pacchetto.spec

prima di procedere occorre editare questo file occorre ed immettere alcune informazioni quali:

  • Summary: una descrizione breve del componente software
  • Group: un gruppo tra quelli definiti in openmamba
  • URL: l'indirizzo internet della pagina principale che descrive questo componente software
  • License: la licenza con cui viene rilasciato il componente software

Aggiornamento di un pacchetto RPM

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 --force

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:

Percorsi di RPM
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