Autospec

From Wiki :: openmamba
Revision as of 15:47, 16 January 2010 by Silvan (talk | contribs) (New page: == Pre-requirements == * autospec user should belong to the '''packager''' group. The default user created during openmamba installation does already belong to this group. == Installatio...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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:

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