Imparare a pacchettizzare

Mer, 21/03/2012 - 23:27

Imparare a pacchettizzare

Inviato da Suse98 2 commenti

Creare un pacchetto significa utilizzare un sistema che permette non solo di compilare un sorgente, ma tenere anche traccia dei file creati e installati per poi poterli recuperare dal sistema e comprimere in un pacchetto RPM con tutte le informazioni utili di corredo.

Serve quindi un pacchetto sorgente e un file SPEC contenente le istruzioni per la creazione del pacchetto e le informazioni che finiranno nel RPM.

Creare un pacchetto in sostanza si riduce a scrivere questo file SPEC.
Guardare i pacchetti e relativi file SPEC è estremamente utile per imparare sul campo, prediligi i repository non home per avere la certezza di imparare da pacchetti certamente ben fatti.

Il Build Service è un'infrastruttura che semplifica il tutto fornendo macchine virtuali che vengono create ed eseguite per creare i vari pacchetti sulla base dei tuoi file SPEC.

Scarichiamo il nostro file sorgente, con estensione .tar, e apriamo il file README. In questo file si trova tutto il necessario per creare il nostro SPEC, le dipendenze per la compilazione, le dipendenze, la descrizione, eccedera.
Ecco un mio SPEC:

Name:               photo
Version:            0.7
Release:            1
License:            GPL
BuildRoot:          %{_tmmpath}/%{name}-%{version}
BuildRequires:      cmake
BuildRequires:      exiv2
BuildRequires:      gcc make automake
BuildRequires:      libexiv2-devel
BuildRequires:      libgexiv2-devel
BuildRequires:      libkexiv2-devel
Group:              Productivity/Graphics/Viewers
Summary:            An image viewer
URL:                http://qt-apps.org/content/show.php/Photo?content=147453&PHPSESSID=165bfd30252d84acdb12d28fc27a5b84
 
Source:             %{name}-%{version}.tar.gz
%description
Photo is an image viewer with a simple and fast interface, being good looking and highly configureable.
 
%prep
%setup -q -n %{name}-%{version}
 
%build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
 
%install
cd build/
%makeinstall
 
%clean
rm -rf "$RPM_BUILD_ROOT"
 
%files
%defattr(-,root,root)
%doc README CHANGELOG
%{_bindir}/%{name}
%{_datadir}/icons/hicolor/128x128/apps/%{name}.png
%{_datadir}/icons/hicolor/16x16/apps/%{name}.png
%{_datadir}/icons/hicolor/32x32/apps/%{name}.png
%{_datadir}/icons/hicolor/48x48/apps/%{name}.png
%{_datadir}/icons/hicolor/64x64/apps/%{name}.png
 
%changelog

Questo è lo SPEC del pacchetto photo funzionante.
Innanzi tutto dobbiamo inserire le informazioni per il pacchetto:

  • Name: - il nome del programma, ad esempio photo
  • Version: - la versione del programma, in questo caso 0.7
  • Release: - il "rilascio", cioè la versione di OpenSUSE ( in questo caso ) per cui state creando lo SPEC, qui è preferibile mettere 0 o 1. Dato che nel Build Service possiamo settare il nostro account a creare pacchetti ( con determinalti SPEC e sorgenti ) per determinate distribuzioni. Io ad esempio ho scelto di creare pacchetti per OpenSUSE 11.4, 12.1, Factory e Tumbleweed. Se noi mettiamo 0 o 1 è meglio, così va a sostituire in automatico la versione che deve mettere, differenti in ogni caso, se creiamo il pacchetto per la 12.1 sostituirà con 12.1. Ma se mettiamo 12.1, poi lo stesso pacchetto, quando il Build Service andrà a “controllare” lo SPEC per creare il pacchetto vedrà 12.1 che comunque dovrà sostituire per forza. Anche se andrà a sostituire, è sempre meglio mettere 0 o 1.
  • License: - la licenza con cui viene distribuito il programma, la maggior parte GNU General Public License GPL, ma va bene anche GPL direttamente
  • BuildRoot: - è la cartella dove vengono elaborati in file temporanei. Qui dobbiamo mettere le tre macro %{_tmppath}/%{name}-%{version}. Questa è la directory /tmp dove vengono elaborati i file temporanei del programma per compilarlo ed installarlo
  • Requires: - indica le dipendenze necessarie a far "funzionare" il programma, se stiamo lavorando in Open Build Service, non serve questa informazione, dato che provvederà lui ad abbinare le giuste dipendenze.
  • BuildRequires: indica le dipendenze necessarie alla compilazione del pacchetto; in entrambi i casi si potrebbero scrivere tutte le dipendenze in un'unica riga, divise da uno spazio, ma si preferisce solitamente dividerle (vedi le due righe utilizzate per Requires) in caso di dipendenze particolarmente importanti che necessitano di essere visualizzate immediatamente. Solitamente dovete mettere il nome del pacchetto aggiungendo -devel, ad esempio se per la compilazione è necessario il pacchetto libqt, voi mettere libqt-devel.
  • Group - indica il gruppo di apparteneza del pacchetto, grazie a questo, viene posizionata l'icona del programma nel vostro menù, e dobbiamo scriverlo in base a come scritto qui
  • Packager: - è chi pacchettizza il programma, ma non c'è bisogno di usarlo se state usando OBS.
  • Summary: - una breve descrizione del programma
  • URL: - è il sito di riferimento del programma
  • Source: - è il nome del codice sorgente, si usano le macro %{name}-%{version}.tar.xxx ( in questo caso .tar.gz )
  • Conflicts: - è una lista di pacchetti con il quale il nostro, eventualmente, può entrare in conflitto.
Poi ci sono anche delle macro particolari, come:
%if %suse_version >= 1021
BuildRequires: gcc41-c++
%endif

Questo pezzo infatti è un "condizionale", la base per creare spec annidati per varie distribuzioni. In questo caso viene "comandato":
Se (%if) la versione di suse (%suse_version) è maggiore o uguale alla 10.2 (>= 1021) allora un BuildRequires aggiuntivo è il pacchetto gcc41-c++. La fine del comando è dato da endif (fine-se).

Ora viene la parte in cui dobbiamo usare le macro, che si devono mettere per forza, altrimenti si ha un pacchetto non compilato.

  • %description: - la descrizione del programma.
  • % prep: - prepara l'ambiente di compilazione.
  • % setup: - applica le giuste impostazioni, la variabile -q la si deve mettere, mentre la variabile -n la si deve mettere per la directory.
  • %build: - inizia la compilazione, sotto questa macro ( da capo ) bisogna mettere i comandi per la compilazione, ad esempio ./configure e make, ma in questo caso non c'e bisogno di ./configure.
  • % install: - inizia l'installazione del programma, sotto questa macro, bisogna mettere i comandi per installare il pacchetto, è preferibile usare la macro % makeinstall, ma in questo caso, va bene anche come è scritto nello spec.
  • %files: - i file del programma, ad esempio il binario, le documentazioni, e il file .desktop. Sotto questa macro, si impostano i permessi dei file, con %defattr, poi la documentazione con %doc i i files di documentazione subito dopo la macro. e poi mettete delle mcro, ad esempio %{_bindir} è la directory binaria, /usr/bin, e non c'è bisgno di mettere /usr/bin, per il nome, usate sempre la macro %{_name}.
E infine, dovete aggiungere la macro %changelog per il changelog. Nello SPEC non è stato scritto il changelog, semplicemente perchè quando aggiungete il sorgente e lo spec in OBS, ci aggiungete un'altro file con il nome del paccheto.changes ( in q uesto caso photo.changes ) , sempre sul progetto del vostro pacchetto.
Però nello spec dobbiamo seguire le linee guida.

Avrete sentito parlare di Open Build Service. Open Build Service è raggiungibile a questo indirizzo. Open Build Service è un sistema generico per creare e distribuire pacchetti da sorgenti più SPEC. consistente e riproducibile. Questo pacchetto può essere distribuito per parecchi sistemi operativi e architetture hardware.Open Build Service è provvisto di vari tools per collaborare con la creazione di pacchetti. Questo è un software gratuito con licenza GNU General Public License (GPL). È disponibile un sorgente. pacchetti e facilmente interpretabile. Si è liberi di usarlo, dissare, estendere e riusare codice. Tutto questo è un [url=http://www.opensuse.org/ ]progetto OpenSUSE[/url].

Basta registrarsi su https://build.opensuse.org/, e cliccare in alto a destra “Home Project” e vi comparirà qualcosa di simile:

cliccate su Repositories in alto, poi Add Repository e scegliete per quali distribuzioni creare il vostro repository home, come in questo caso io ho scelto OpenSUSE 12.1, 11.4, Factory e Tumbleweed:

Ritornate in Home Project e cliccate Create package, dove dovrete inserire il Nome del pacchetto, il Sommario e la Descrizione.

Poi andate in Source, dove dovete inserire il vostro SPEC, il Sorgente e un file chiamato con il nome del pacchetto.changes che sarebbe il changelog.

E poi andare in Overview e vedere il progresso del build. Una volta terminato potrete vedere eventuali errori o se il pacchetto è stato compilato, installato ( in virtuale da OBS ) e creato con successo. Se creato con successo dovrete aspettare un pò che lo aggiunga al vostro repository home. Se è stato creato, installato e pubblicato con successo ci sarà scritto success:

Credo di essere stato abbastanza chiaro. Se avete domande, commentate Wink





Commenti

Ritratto di mauriziod
#1

Inviato da mauriziod il Ven, 06/04/2012 - 07:56.

Re: Imparare a pacchettizzare

Ottima guida!

Maggiori chiarimenti in italiano li trovate anche qui per lo SPEC.

Wink

SO: Linux desktop Sistema: OpenSUSE 13.2 (32bit) KDE 4
SO: Linux desktop Sistema: OpenSUSE Leap 42.1 (64bit) KDE 5
Miao



Ritratto di Suse98
#2

Inviato da Suse98 il Sab, 07/04/2012 - 12:52.

Re: Imparare a pacchettizzare

Grazie Maurizio !
Io sono alle prime armi, e infatti da lì ho iniziato Wink

SUSE LINUX Rilascio 12.3 (Dartmounth) KDE 4.10 && GNOME 3.8