martedì 10 febbraio 2009

Scrivere uno slackbuild per slackware...

Oggi vedremo come scrivere correttamente uno slackbuild per slackware. Innanzitutto cerchiamo di capire alcune cose fondamentali, altre distro come ad esempio ubuntu, debian, mandriva hanno pacchetti precompilati che vengono distribuiti liberamente. In slackware non funziona così, o meglio non proprio! Nel caso non si riesca a trovare un pacchetto cercato c'è bisogno di compilarlo a "mano" con i classici comandi che tutti sappiamo. Ma il problema è che, come succede in un'altra qualsiasi distro, una volta che un pacchetto viene compilato dai sorgenti e viene installato con il comando make install, si perde traccia dei file installati nel sistema e quando lo si vuole rimuovere (nel caso in cui non sia presente il comando make uninstall) non si sa più dove cercare i file da rimuovere. Per ovviare a tutte queste difficolta nasce lo slackbuild. Noi tutti sappiamo che i pacchetti slackware terminano in tgz, quindi per tener traccia di un programma bisognerebbe ricavare dai sorgenti il pacchetto tgz e poi installarlo con installpkg in questa maniera si terra traccia dei file e una volta che si vorrà rimuovere il pacchetto basta dare il comando removepkg ed è lui che si occuperà di rimuovere tutti i file associati al pacchetto. Lo slackbuild altro non è che uno script. Vediamo un esempio e cerchiamo di capirne il funzionamento. Questo è uno slackbuild scritto da me per il programma basket (un efficiente notepad molto meglio di klipper):
#!/bin/sh
CWD=`pwd` #cartella corrente
TMP=${TMP:-/tmp/tgz} #crea una variabile con la cartella /tmp/tgz solo nel caso non esiste
PKG=$TMP/package #variabile per il pacchetto
NAME=basket #variabile nome pacchetto
VERSION=1.0.3.1 #variabile versione pacchetto
CHOST=i486
ARCH=${ARCH:-i486} #imposta l'architettura nel caso non sia specificata
BUILD=1ac # variabili release e iniziali di colui che crea il pacchetto

#qui di seguito un serie di semplici if per determinare i flags da aggiungere in fase di compilazione
if [ "$ARCH" = "i386" ]; then
SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2"
elif [ "$ARCH" = "s390" ]; then
SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2"
fi

#qui creaiamo le cartelle temporanee se non esistono
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
if [ ! -d $PKG ]; then
mkdir -p $PKG
fi


cd $TMP
tar xzvf $CWD/$NAME-$VERSION.tar.gz #scompattiamo i sorgenti
cd $NAME-$VERSION #entriamo nella cartella scompattata
chmod -R u+w,go+r-w,a-s . # aggiustiamo i permessi ai file
chown -R root:root . # aggiustiamo i permessi ai file
CFLAGS="$SLKCFLAGS" \ # configuriamo il pacchetto con configure passando i flag che avevamo aggiunto
CXXFLAGS="$SLKCFLAGS" \
./configure --prefix=/usr \
--disable-debug \
--program-prefix= \
--program-suffix= \
--build=$CHOST-slackware-linux
make #compiliamo il pacchetto
make install DESTDIR=$PKG #installiamo il pacchetto nella cartella temporanea creata precedentemente
mkdir -p $PKG/usr/doc/$NAME-$VERSION #creiamo la cartella che dove copieremo la documentazione
cp -a AUTHORS COPYING ChangeLog INSTALL NEWS README TODO $PKG/usr/doc/$NAME-$VERSION #copiamo la documentazione
cd $PKG #entriamo nella cartella creata
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null # strippiamo (una sorta di compressione) tutti gli eseguibile e tutte le librerie questi comandi cercano tutte le librerie e le filtrano per tipi di file e infine le strippano
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
mkdir -p $PKG/install # crea la cartella install dove andranno i file contenenti le descrizioni del pacchetto e il file doinst.sh
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/slack-desc > $PKG/usr/doc/$NAME-$VERSION/slack-desc
cat $CWD/$NAME.SlackBuild > $PKG/usr/doc/$NAME-$VERSION/$NAME.SlackBuild
requiredbuilder -v -y -s $CWD $PKG # requirebuilder si occupa di trovare le dipendenze (se ne puo fare a meno se non avete requirebuilder installato
makepkg -l y -c n $CWD/$NAME-$VERSION-$ARCH-$BUILD.tgz # questo e il comando che crea il pacchetto

if [ "$1" = "--cleanup" ]; then
rm -rf $TMP #rimozione delle cartelle temporanee
fi
Una volta salvato questo script "basket.Slackbuild" basta dare il comando (attenzione ad aver scaricato i sorgenti) "sh basket.Slackbuild" e ci ritroveremo dopo un po di scritte il pacchetto compilato nella stessa cartella in cui siamo. Poi basta dare il comando "installpkg nome_pacchetto.tgz" e il nostro programma sarà installato correttamente...Alla prossima!

giovedì 5 febbraio 2009

Strumenti per la progettazione di un database: MySQL Workbench

Prima di tutto vorrei fare un breve accenno sulla teoria che riguarda la progettazione dei database...

mercoledì 4 febbraio 2009

Il mio primo post

Questo è il mio primo post. Ancora non so cosa voglio fare su questo sito, per ora nulla, poi vediamo...