Ciao a tutti!
Sto smanettando da un po’, a tempo perso, per creare una versione pacchettizzata di gtkradiant. Seguendo la http://doc.fedoraonline.it/Installazione_e_Configurazione_GtkRadiant per fedora ho creato il file .spec, visionabile http://dl.dropbox.com/u/62048973/gtkradiant.spec, ancora incompleto nei dettagli.
Spiego brevemente quello che vorrei faccia il pacchetto: l’utente apre il file gtkradiant.desktop che rimanda a /usr/bin/gtkradiant (visionabile http://dl.dropbox.com/u/62048973/gtkradiant.sh), il quale copia il contenuto della cartella /usr/share/gtkradiant in una cartella nella home dell’utente (~/.gtkradiant-src/). Quindi entra nella cartella, procede alla compilazione e una volta finita preleva la cartella install/ (~/.gtkradiant/install/ ) e la sposta nella home con il nome ~/.gtkradiant/
Quello che dovrebbe fare adesso il lanciatore .desktop è, cliccandoci sopra una seconda volta dopo la compilazione, lanciare l’applicativo ~/.gtkradiant/radiant.bin.
Il problema che rilevo adesso è che non funziona il lanciatore /usr/bin/gtkradiant: come si può vedere dal link sopra faccio controllare se esiste o meno l’applicativo ~/.gtkradiant/radiant.bin: se non esiste, lo script esegue i processi di prima, altrimenti dovrebbe lanciare il processo; ma una volta che ha compilato la prima volta, rilanciando il lanciatore, questo continua a chiedere di voler compilare i sorgenti.
Come posso fare? Avete consigli, dettagli da sistemare?
Scusatemi ma è la prima volta che faccio un rpm e me ne intendo ancora poco, così come nella creazione di script.
Per quanto riguarda la var $HOME è una delle cose da sistemare, grazie mille.
Non ci sono problemi di sorta nella creazione sia del rpm che del src.rpm, infatti li creo dall’utente makerpm e li vado a testare in una sessione di virtualbox apposita. Il problema è quello descritto prima, non so come fare il “check” della presenza o meno del file ~/.gtkradiant/radiant.bin .
Esiste qualche opzione n modo da creare in bash una roba di questo tipo:
se $ELEMENTO c'é
lancio dell'applicazione
se $ELEMENTO non c'é
esegui vari passaggi..
?
Questo ovviamente è solo un esempio per chiarezza
Scusami, per compilazione intendo esecuzione dello script bash. Non mi riferivo al file spec che per come è funziona (e ci hai dato conferma, al limite si può solo affinare la formattazione ed eventualmente alcune cosette ma nulla di che).
Il tuo if dovrebbe funzionare, per l’appunto. Probabilmente è l’if annidato che ti crea dei problemi?
Non penso, non ho mai visto problemi particolari con if annidati.
Consigli l’uso della funzione case o altre? O è meglio “spostare” il gruppo dei passaggi in una variabile e lanciarlo dopo l’if?
Una cosa del genere, per intenderci
[code]vari_passaggi="…"
se $ELEMENTO c’é
lancio dell’applicazione
se $ELEMENTO non c’é
$vari_passaggi[/code]
?
Perché chiedo all’utente se vuole procedere con la compilazione nella sua home dei file necessari, poiché ci mette un po’ a fare le sue robe. Però in effetti potrei anche rimuoverlo e mettere un semplice avviso, senza fare la domanda. Dici che potrebbe essere quello che fa “sballare” l’if?
No, scusami, io zenety non l’ho mai usato e ho letto il tuo codice e mi sono scordato la riga di questo, scusami.
Prova così:
#!/bin/bash
EXEC="radiant.bin"
FOLD="$HOME/.gtkradiant/"
if ! -f $FOLD$EXEC ]; then
zenity --question --text=' This is the first time you launch GTKRadiant.
Now there will be some configurations in your home. Proceed?'
if $? == 0 ]]; then
cp -Rf /usr/share/gtkradiant/ $HOME/.gtkradiant-src/
cd $HOME/.gtkradiant-src/
scons target=radiant,q3map2 config=release
mv install/ $HOME/.gtkradiant/
cd $HOME && rm -rf $HOME/.gtkradiant-src/
# zenity --info --text='Now you can launch GTKRadiant. Restart it to enjoy!'
else
exit 0
fi
fi
# lanci l'applicazione
$FOLD$EXEC
Tu avevi usato un if ma non un operatore di confronto ma di assegnazione (= invece di ==). Il doppio ]] potenzia la funzionalità dell’operazione condizionale di bash. Ma il man è più esplicativo.
sotto la voce expression mi sembra di aver trovato qualcosa, procederò poi ad un attento esame
Mi viene un grosso dubbio. Dato che il programma poi girerà all’interno della home non verrà influenzato da aggiornamenti dello stesso nelle cartelle di sistema. Quindi se l’utente vuole aggiornare all’ultima versione, dopo aver dato uno yum update, dovrà anche cancellare la directory ~/.gtkradiant manualmente. Stavo pensando di fare una comparazione tra due changelog (uno nella home e uno nella cartella di sistema) all’inizio dello script e se ci sono differenze chiedere all’utente se vuole rimuovere la cartella ~/.gtkradiant nella home per ricompilare il programma con gli aggiornamenti. Non so se sono stato chiaro.
La mia domanda quindi è: è possibile fare la comparazione di due file da terminale?
Si, è possibile, anzi potresti mettere un log all’interno di ~/.gtkradiant che indica la versione installata. Al momento dell’avvio controlli che versione è, se è più vecchio proponi la cancellazione e la ricreazione della directory e dell’applicativo.
Si può fare in molti modi differenti
Allora, diciamo che era giusto, però le due variabili andavano inserite DOPO aver fatto la compilazione, altrimenti il lanciatore fa due volte la compilazione dato che non trova, ovviamente, il file ~/.gtkradiant/rpm_version, perché prima della compilaz non esiste.
Poi nello spec ho sistemato la parte della creazione del rpm_version, dato che va inserito nella cartella $RPM_BUILD_ROOT%{_datadir}/%{name}/install/rpm_version , che è quella che poi rimane nella home dell’utente. La parte dello spec diventa quindi così:
touch $RPM_BUILD_ROOT%{_datadir}/%{name}/install/rpm_version
echo "%{version}-%{release}" > $RPM_BUILD_ROOT%{_datadir}/%{name}/install/rpm_version
Infine ho ripulito un po’ tutto e ho sistemato anche il file .desktop
Qualcuno sa come si fa a chiedere l’inclusione di un pacchetto nei repository? Bisogna aprire una discussione su bugzilla? Nel caso, dove? Non sono molto esperto di bugzilla…