GLM - 18/6/2018 - 13:44


Classifica dei relatori GLM 2014 (per numero di lezioni svolte)

  1. [9] Samuele Cacchiarelli
  2. [6] Andrea Bianchini
  3. [6] Gianluca Gabrielli
  4. [1] Matteo Ciccioli
  5. [1] Fabio Pagnotta
  6. [1] Alessandro Zampa
  7. [1] Emanuele
  8. [1] Roberto Marozzi
  9. [1] Giampiero Rubini

Vuoi diventare relatore GLM? presenta anche tu una lezione su un argomento che più ti piace relativo a Linux o al mondo dell'OpenSource


Archivio news

server glm
Il nostro Server

bella gnocca freebsd
FreeBSD It's Here!

Come Ottenere un file RPM dai propri sorgenti

Ho voluto scrivere questo Tutorial per venire incontro a tutte quelle persone che, come me, si sono trovate in difficoltà di fronte al problema di creare un file RPM partendo dalle sorgenti di una loro applicazione. Ma perché voler costruire anche il .rpm oltre al file .tar.gz ?
Sicuramente, per quanto mi riguarda, la risposta si trova nella semplicità d'uso dello stesso (caratteristica poco contemplata nel mondo di Linux); infatti anche un utente poco esperto può imparare in breve tempo a utilizzare il comando "rpm" per gestire i suoi pacchetti applicativi. Inoltre, i pacchetti rpm rappresentano uno standard ormai accettato da tutta la comunità Linux (apparte Debian) e per questo vengono usati assiduamente.


Pre-requisiti per comprendere agevolmente il tutorial.

Bisogna saper programmare in un qualche linguaggio di programmazione che prevede la compilazione del codice (vedi il C, C++, Fortran o altri) o almeno riuscire a capire il concetto di compilazione di un codice. Si deve, inoltre, conoscere il comando Make e saper scrivere da soli un Makefile utilizzando le opzioni e la sintassi di base. Conoscere, infine, pochi rudimenti di shell programming.

1. Preparazione della directory del pacchetto

Abbiamo finito di codificare un piccolo progammino in linguaggio C che stampa sullo stdout un messaggio di saluto. Inoltre, abbiamo creato vari uteriori file di documentazione, come normalmente si usa fare, e abbiamo appena ordinato la directory denominata "Ciao_Mondo-0.1", contenente tutti i file del programma, nel seguente modo :

-rw-r--r--1 pattonpatton56ott 19 22:14AUTHORS
-rw-r--r--1 pattonpatton137ott 19 22:14ChangeLog
-rw-r--r--1 pattonpatton19410ott 19 22:14COPYING
-rw-r--r--1 pattonpatton1101ott 19 22:14Makefile
-rw-r--r--1 pattonpatton50ott 19 22:14NEWS
-rw-r--r--1 pattonpatton812ott 19 22:14README
drw-r--r--2 pattonpatton104ott 19 22:14src/
drw-r--r--1 pattonpatton1042ott 19 22:14src/ciao_mondo.c
drw-r--r--1 pattonpatton871ott 19 22:14src/Makefile

Il nome della directory non è stato scelto a caso in quanto contiene il numero di versione (è la 0.1) del nostro nuovo programma. Non mi dilungo sul concetto di "versione" di un programma in quanto sarebbe un argomento troppo lungo su cui disquisire. Notate come prima cosa che nella lista dei file ci sono due Makefile. Questo non è strettamente necessario per il nostro esempio ma lo è sicuramente quando si ha a che fare con progetti di una certa complessità. Il Makefile interno ci serve per compilare il file oggetto (.o) mentre quello esterno serve per linkare il codice oggetto e creare l'eseguibile.
Adesso creiamo una directory chiamata "Prova" e spostamoci dentro la directory Ciao_Mondo-0.1; poi copiamoci dentro anche i file "prepara-rpm" (che è uno script bash) e "Ciao_Mondo.spec" che è proprio il file di configurazione per l'rpm.
Lo script bash è il seguente :

#!/bin/sh
NOME=Ciao_Mondo
VERS=0.1
tar -cvf $NOME-$VERS.tar $NOME-$VERS
gzip $NOME-$VERS.tar
mv $NOME-$VERS.tar.gz /usr/src/RPM/SOURCES/
rpm -ba $NOME.spec
echo
echo
echo Creato Ciao_mondo.rpm .
echo

Cosa fa? (non lo dovrei spiegare ma lo faccio lo stesso) Costruisce il file .tar.gz del programma e lo sposta nella directory standard "/usr/src/RPM/SOURCES/" dove poi l'rpm lo andrà a trovare per lavoraci sopra, e chiama il comando "rpm -ba $NOME.spec" che costruirà il pacchetto .rpm del nostro programma. Lo script è parametrico rispetto al nome e al numero di versione del programma stesso (questo solo per comodità).

Attenzione!! Lo script bash deve essere eseguito da una shell di ROOT a causa del fatto che sicuramente ci saranno problemi con i diritti per l'accesso alle directory di lavoro. Ovviamente, chi è in grado, può aggiustare i diritti a suo piacimento e tentare di eseguire lo script da un account utente.


Ometto il codice del file "Ciao_Mondo.spec" poiché, essendo il fulcro del Tutorial, verrà spiegato approfonditamente e in ogni sua sfaccettatura più avanti. Tornando alla nostra directory "Prova", essa deve dunque contenere i seguenti file:

drwxr-xr-x3 pattonpatton224ott 19 22:14Ciao_Mondo-0.1/
-rw-r--r--1 pattonpatton783ott 19 22:14Ciao_Mondo.spec
-rwxr--r--1 pattonpatton202ott 19 22:14prepara-rpm*

Ricordate che la struttura delle directory dà solo un esempio generale di come si dovrebbero sistemare i file, ma, come è ovvio, ognuno di voi (una volta impratichito) potrà cambiarla a suo piacimento. E' invece molto importante leggere e capire il codice del Makefile esterno:

CC =gcc
INSTDIR=/usr/bin
PACKAGE=Ciao_Mondo
SRCPATH = ./src/
all:
make -C $(SRCPATH)
$(CC) -o $(PACKAGE) $(SRCPATH)ciao_mondo.o
clean:
rm -f $(PACKAGE)
rm -f *.*~ *~ core
rm -f $(SRCPATH)*.*~ $(SRCPATH)*~ $(SRCPATH)*.o $(SRCPATH)core
install:
mkdir -p $(RPM_BUILD_ROOT)$(INSTDIR)/
cp -f $(PACKAGE) $(RPM_BUILD_ROOT)/$(INSTDIR)/

Quello che ci interessa è la parte in neretto. Con il comando "install" il make esegue delle azioni precise. In pratica crea la directory di installazione e ci copia dentro il file del programma. Ma dove la crea?? Ebbene, tutte le azioni sono eseguite nella directory $(RPM_BUILD_ROOT). Ovvero, le azioni vengono simulate in una directory di appoggio messa a disposizione dal comand rpm. Deve essere chiaro a tutti però, che il comando "make install", se chiamato da shell, non funzionerà nel modo previsto poiché non troverà definita la variabile di ambiente RPM_BUILD_ROOT.

In realtà, ammettendo che già esista il file eseguibile compilato, tenterà di copiarlo nell' INSTDIR (/usr/bin/), altrimenti darà un errore di "impossibile fare stat del file" o qualcosa di simile.

Scarica subito il pacchetto contenente tutto il necessario per creare l'rpm del programma Ciao_Mondo.

Segue il capitolo 2