Truva Linux Paketlerinin HazırlanmasıSon güncelleme : 14 Haziran 2007 14:56
Bu başlık altında Truva Linux paketlerinin nasıl hazırlandığına dair ayrıntılı açıklamaları bulabileceksiniz. Böylece sizler de paket konusunda bize yardım edebileceksiniz. Hazırlayacağım bu dokümanı da sık sık güncelleyeceğim...
1-) Genel Bilgiler
Bu dokümanda Slackware Linux'ta kullanılan .SlackBuild dosyalarının Truva Linux Standartları anlatılmaktadır.
Truva Linux paketlerini hazırlamak için .TruvaBuild adını verdiğimiz dosyaları kullanıyoruz. Bu dosyaları rpm paketleri hazırlarken kullandığımız .spec dosyalarına benzetebiliriz.
TruvaBuild dosyaları, bir paketin hazırlanabilmesi için gerekli bilgileri içermektedir. Örneğin program kaynak kod paketi programa ait bir web sitesinden veya yansısından (genelde dosya uzantıları tar.gz, tar.bz2 olur) indirilir. Derleme ve ayar işlemleri yapılır. Ardından paket hazırlanıp TruvaBuild dosyasında belirtilen yerel paket deposuna test edilmek üzere otomatik olarak konur.
2-) Bir .TruvaBuild dosyasının yapısı nasıldır?
Aşağıda örnek bir .TruvaBuild dosyası görülmektedir. Biz bu örnek üzerinde paket yapımını açıklayacağız.
#!/bin/sh
NAMESRC=tvtime
VERSION=1.0.2
EXT=tar.gz
ARCH=i486
TARGET=i486
BUILD=1
REPO=/Truva-Repo/testing
set -e -x
if [ ! -r ${NAMESRC}-${VERSION}.$EXT ] ; then
wget http://ovh.dl.sourceforge.net/sourceforge/tvtime/${NAMESRC}-${VERSION}.$EXT
fi
md5sum -c ${NAMESRC}-${VERSION}.$EXT.md5
CWD=`pwd`
if ["$TMP" = ""]; then
TMP=/tmp
fi
PKG=$TMP/package-$NAMESRC
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
if [ ! -d $PKG ]; then
mkdir -p $PKG
fi
if [ $EXT == tar.bz2 ]; then
NAME=`tar jft $NAMESRC-$VERSION.tar.bz2 | head -1 | awk -F/ '{ print $1 }'`
else
NAME=`tar zft $NAMESRC-$VERSION.tar.gz | head -1 | awk -F/ '{ print $1 }'`
fi
if [ "$ARCH" = "i386" ]; then
CPUOPT="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
CPUOPT="-O2 -march=i486 -mcpu=i686"
elif [ "$ARCH" = "s390" ]; then
CPUOPT="-O2"
elif [ "$ARCH" = "x86_64" ]; then
CPUOPT="-O2"
fi
cd $TMP
echo "Building $NAMESRC-$VERSION.$EXT..."
if [ $EXT == tar.bz2 ]; then
tar xjf $CWD/$NAMESRC-$VERSION.$EXT
else
tar xzf $CWD/$NAMESRC-$VERSION.$EXT
fi
cd $NAME
CFLAGS=$CPUOPT \
CXXFLAGS=$CPUOPT \
./configure --prefix=/usr \
--sysconfdir=/etc \
--enable-shared=yes \
--enable-static=no \
$TARGET-slackware-linux
make
make install DESTDIR=$PKG
mkdir -p $PKG/usr/doc/$NAME
install -m 644 \
AUTHORS ChangeLog COPYING* INSTALL NEWS README \
$PKG/usr/doc/$NAME
mkdir -p $PKG/usr/doc/$NAME/html
install -m 644 \
docs/html/* \
$PKG/usr/doc/$NAME/html
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
if [ -r $CWD/doinst.sh ] ; then
cat $CWD/doinst.sh > $PKG/install/doinst.sh
fi
find $PKG/usr/man -type f | xargs gzip -9
cd $PKG
find . | xargs file | grep "ELF 32-bit LSB executable" | cut -f 1 -d : | xargs strip --strip-all
cd $PKG
if [ ! -d $REPO ]; then
mkdir -p $REPO
fi
chown root:root . -R ;
chown root:bin ./usr/bin -R ;
makepkg -l y -c n $REPO/$NAMESRC-$VERSION-$ARCH-$BUILD.tgz ;
if [ ! -f $TMP/$NAMESRC-$VERSION ]; then
rm -rf $TMP/$NAMESRC-$VERSION
fi
if [ ! -f $PKG ]; then
rm -rf $PKG
fi
3-) Bir .TruvaBuild Dosyasının Yapısının Ayrıntıları
#!/bin/sh
Bu kısım betiğin sh kabuğu ile çalıştırılacağını gösterir. Eğer bu satır eklenmezse metin editörlerinde kabuk programlama komutları renksiz olarak gözükeceği için ayırt etme imkanınız zorlaşır.
NAMESRC=tvtime
VERSION=1.0.2
EXT=tar.gz
ARCH=i486
TARGET=i486
BUILD=1
REPO=/media/truva/Truva-Repo/repo/testing
Bu kısımda tanımlamalar yapılmaktadır.
NAMESRC=tvtimeBu paramatre yazılımın adını göstermektedir.
VERSION=1.0.2Bu parametre yazılımın versiyonunu göstermektedir.
EXT=tar.gzBu parametre yazılım paketinin uzantısını göstermektedir. Uzantısı daha çok tar.gz veya tar.bz2 olmaktadır. Mümkün olduğu kadar tar.bz2 uzantısı kullanılmalıdır. Çünkü tar.bz2 paketleri daha küçük boyutlu olduğundan indirilmesi kolaylaşır hem de indirilen sunucunun bant genişliğinden fazla harcamamış oluruz.
ARCH=i486Bu parametre hazırlanacak paketin işlemci mimarisini göstermektedir.
TARGET=i486Bu parametre paketin derlenmesi esnasında işlemci mimarisine göre işlem yapılmasını sağlar.
BUILD=1Bu parametre paketin düzenlenme durumunu gösterir. "1" ile başlar ve paket üzerinde bir değişiklik yapıldığından bu sayı bir artırılır.
REPO=/Truva-Repo/testingBu parametre hazırlanan paketin depolanacağı klasörü işaret eder. Truva Linux için paket geliştirecek arkadaşlar sabit disklerinde "/media/truva/Truva-Repo/repo/testing" klasörünü oluşturmak durumundadırlar.
set -e -x
Bu kısım kabuk programlamanın özelliklerindendir. Çalıştırılan komutun önüne artı işareti koyarak takibi kolaylaştırmaktedır.
if [ ! -r ${NAMESRC}-${VERSION}.$EXT ] ; then
wget http://ovh.dl.sourceforge.net/sourceforge/tvtime/${NAMESRC}-${VERSION}.$EXT
fi
Bu kısımda ${NAMESRC}-${VERSION}.$EXT ile belirtilen yazılım koduna ait paket yoksa sunucudan indirilmesi için wget komutu çalıştırılır. Paket .TruvaBuild dosyasının bulunduğu klasöre indirilir. NAMESRC, VERSION ve EXT ile ilgili açıklamaları daha önce yapmıştık.
md5sum -c ${NAMESRC}-${VERSION}.$EXT.md5
Bu kısımda eğer yazılıma ait md5 dosyası ile yazılım paketinin bütünlük kontrolü yapılır. Bu kısımda bir kaç düzenleme daha yapılacaktır. Paket ilk kez indirildikten sonra md5 dosyasını elle oluşturmamız gerekiyor.
CWD=`pwd`
Bu kısımda "pwd" komutu ile içerisinde bulunulan dizin bilgisi CWD değişkenine aktarılıyor.
if ["$TMP" = ""]; then
TMP=/tmp
fi
Bu kısımda "TMP" değişkenine herhangi bir şey atanmamışsa "/tmp" dizini "TMP" değişkenine aktarılıyor.
PKG=$TMP/package-$NAMESRC
Bu kısımda paketin derleme işlemi bittikten sonra dokümanların ve derlenen kodların atılacağı dizin belirtiliyor. Bu dizin yukarıdaki satırdan da anlaşılacağı üzere "TMP" değişkenine atanan dizinin altındaki package-$NAMESRC dizinidir.
Örnek tam yazılımı /tmp/package-tvtime-1.0.2 şeklinde olur.
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
Bu kısımda "TMP" değişkeni ile belirtilen dizin yoksa oluşturuluyor.
if [ ! -d $PKG ]; then
mkdir -p $PKG
fi
Bu kısımda "PKG" ile belirtilen package-$NAMESRC dizini yoksa oluşturuluyor.
if [ $EXT == tar.bz2 ]; then
NAME=`tar jft $NAMESRC-$VERSION.tar.bz2 | head -1 | awk -F/ '{ print $1 }'`
else
NAME=`tar zft $NAMESRC-$VERSION.tar.gz | head -1 | awk -F/ '{ print $1 }'`
fi
Bu kısımda NAME değişkenine paket adı bilgisi aktarılıyor. Her betikte bulunmayabilir.
if [ "$ARCH" = "i386" ]; then
CPUOPT="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
CPUOPT="-O2 -march=i486 -mcpu=i686"
elif [ "$ARCH" = "s390" ]; then
CPUOPT="-O2"
elif [ "$ARCH" = "x86_64" ]; then
CPUOPT="-O2"
fi
Bu kısımda derleme öncesi işlemci mimarisi ile ilgili ayarlar yapılmaktadır.
cd $TMP
echo "Building $NAMESRC-$VERSION.$EXT..."
Burada $TMP değişkeninin içerdiği dizine giriliyor. echo ile ekrana yapılan işlemle ilgili mesaj yazdırılıyor. echo komutunun eklenmesi şart değildir.
if [ $EXT == tar.bz2 ]; then
tar xjf $CWD/$NAMESRC-$VERSION.$EXT
else
tar xzf $CWD/$NAMESRC-$VERSION.$EXT
fi
Bu kısımda paket uzantısı kontrol ediliyor. $EXT içeriği tar.bz2 ise çalıştırılacak komut ve tar.bz2 değilse çalıştırılacak komut belirtiliyor.
cd $NAME
CFLAGS=$CPUOPT \
CXXFLAGS=$CPUOPT \
./configure --prefix=/usr \
--sysconfdir=/etc \
--enable-shared=yes \
--enable-static=no \
$TARGET-slackware-linux
make
make install DESTDIR=$PKG
Bu kısımda $NAME değişkenine aktarılan bilgiye göre ilgili dizine giriliyor. Derleme parametreleri ayarlanıyor. Paket derleniyor.
mkdir -p $PKG/usr/doc/$NAME
Bu kısımda $PKG değişenini ile belirtilen dizininde /usr/doc/ dizini altına $NAME değişeninin içerdiği paket adına göre klasör oluşturuluyor.
install -m 644 \
AUTHORS ChangeLog COPYING* INSTALL NEWS README \
$PKG/usr/doc/$NAME
mkdir -p $PKG/usr/doc/$NAME/html
install -m 644 \
docs/html/* \
$PKG/usr/doc/$NAME/html
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
Bu kısımda $PKG değişkeni ile belirtilen dizin altında install dizini oluşturuluyor.
cat komutu ile slack-desc dosyası içeriği install dizini altına slack-desc dosyası olarak gönderiliyor.
if [ -r $CWD/doinst.sh ] ; then
cat $CWD/doinst.sh > $PKG/install/doinst.sh
fi
Bu kısımda eğer doinst.sh dosyası varsa $PKG değişkeni ile belirtilen dizin altına doinst.sh dosyası olarak gönderiliyor. doinst.sh dosyası genellikle derleme sırasında oluşturulur fakat doinst dosyası oluşturulmamışsa ve paket kurulduktan sonra çalıştırılması gereken komutlar var bu dosya elle hazırlanabilir.
find $PKG/usr/man -type f | xargs gzip -9
Bu kısımda $PKG değişkeni ile belirtilen dizin altındaki man dosyaları sıkıştırılıyor.
cd $PKG
if [ ! -d $REPO ]; then
mkdir -p $REPO
fi
Bu kısımda $PKG değişkeni ile belirtilen dizine giriliyor. if komutu $REPO değişkeni ile belirtilen paket deposu dizininin diskinizde olup olmadığını kontrol ediyor. Eğer yoksa oluşturuluyor. Öntanımlı paket deposu dizinimiz REPO=/media/truva/Truva-Repo/repo/testing dizinidir. Bu dizini ister kendiniz oluşturursunuz isterseniz programa bırakırsınız o kendi oluşturur.
chown root:root . -R
chown root:bin ./usr/bin -R
Bu kısımda $PKG değişkeni ile belirtilen dizin altındaki dosyaların sahiplikleri ayarlanıyor.
makepkg -l y -c n $REPO/$NAMESRC-$VERSION-$ARCH-$BUILD.tgz ;
Bu kısımda makepkg komutu belirtilen değişkenler aracılığı ile belirtilen dizin altında paketi oluşturur.
if [ ! -f $TMP/$NAMESRC-$VERSION ]; then
rm -rf $TMP/$NAMESRC-$VERSION
fi
Bu kısımda $TMP değişkeni ile belirtilen dizin altında program kaynak koduna ait dosyaları içeren dizinin olup olmadığı kontrol ediliyor ve dizin varsa siliniyor.
if [ ! -f $PKG ]; then
rm -rf $PKG
fi
Bu kısımda $TMP değişkeni ile belirtilen dizin altında hazırlanacak pakete ait dosyaları içeren dizinin olup olmadığı kontrol ediliyor ve dizin varsa siliniyor.
Paket hazırlama betiğinin genel yapısı bu şekildedir. Bundan çok daha farklı kısımlar içeren betiklerde olabilir. Dikkat etmeniz gereken şey nerede ne tür işlemler yapıldığıdır. 3-5 paket betiği hazırladıktan sonra zaten eliniz alışır. Buna rağmen yapamadığınız, kafanıza takılan bir sorun olursa mesaj atabilirsiniz.
Bu şekilde oluşturulan paket oluşturma betikleri konsoldan
sh betik_adı.TruvaBuild
komutu ile çalıştırılır.
Pakete ait kaynak kod paketi yoksa indirilir ve MD5 dosyası yoksa program durur.
Bu durumda
md5sum paket_adı.md5
komutu ile MD5 değeri oluşturulur. Örneğin;
md5sum xmms-1.2.10.tar.gz.md5
Bu işlemden sonra
sh betik_adı.TruvaBuild
komutunu tekrar uygularsanız derleme işlemi başlayacaktır. Derleme sırasında bağımlılık sorunu yaşadığınıza dair bir mesaj alırsanız, ilgili paketi kurup tekrar denemelisiniz. Bu noktalarda yapılacak hatalar paketin kararlılığını etkileyeceğinden dikkatli olmakta fayda vardır.
Paket sorunsuz bir şekilde derlenirse $REPO değişkeni ile belirtilen depo klasörü adresinde yerini alacaktır. Oluşan yeni paketi kurmadan önce paketin ve dosyanın sağlamlığını kontrol edin. Hatalı bir nokta gözünüze çarparsa hatayı düzeltip tekrar kontrol edin.
Son olarakta paketin test etmek için sisteminize kurup denemeler yapın. Paketin sağlam olduğuna kanaat getirirseniz depo yöneticisine başvurup paketi ftp üzerindeki depoya gönderilmesini sağlayınız.
4-) Örnek paket oluşturma betiklerini nereden bulabilirim?
Örnek betikler için bir çok adres mevcuttur ama en sağlamı
http://www.slacky.it/download/traverse.php adresidir. Burada hem hazır paketler hemde paket hazırlamak için gerekli betikler ve kaynak kodları mevcuttur. Alt kategoriler içerisinde yer alan
src klasöründe üzerinde düzenleme yapabileceğiniz betikleri bulabilirsiniz.
5-) slack-desc dosyası yapısı nasıldır?
Genel Görünümü
tvtime: tvtime (High quality television application)
tvtime:
tvtime: Tvtime is a high quality television application for use with video
tvtime: capture cards on Linux systems. TVtime processes the input from a
tvtime: capture card and displays it on a computer monitor or projector.
tvtime:
tvtime:
tvtime:
tvtime:
tvtime:
tvtime:
tvtime: tvtime (High quality television application)
Bu kısım genel açıklama satırıdır. Geri kalan kısımla beraber paket açıklamalarını içerir.
Dikkat edilmesi gereken noktalar;
a)
tvtime: kısmı paket adıyla aynı olmalıdır,
b) büyük-küçük harf ayrımına dikkat edilmelidir,
c) paket açıklamaları Türkçe olarak hazırlanmalıdır.
Onur ÖZDEMİR
Truva Linux Geliştiricisi
onur.atlantis [a] truvalinux.org.tr