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.
%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}.
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
Commenti
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.
SO: Linux desktop Sistema: OpenSUSE Leap 15.1 (64bit) KDEE 5.12
SO: Linux desktop Sistema: OpenSUSE Tumbleweed (64bit) KDE 5
Miao
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
HP - Gaming OMEN 15-ek0015nl Notebook
Intel Core i7-10750, Nvidia GeForce RTX 2060 6GB, 32GB RAM, 500GB SSD M2 + 2TB Sabrend SSD M2