Truva Linux Destek Forumu

Truva Linux => Dokümanlar & İpuçları => Konuyu başlatan: atlantis - 08 Şubat 2008, 01:05:12 ös

Başlık: Truva Linux Paketleri Nasıl Hazırlanır?
Gönderen: atlantis - 08 Şubat 2008, 01:05:12 ös
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.

Kod: [Seç]
#!/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ı

Kod: [Seç]
#!/bin/shBu 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.


Kod: [Seç]
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=tvtime
Bu paramatre yazılımın adını göstermektedir.

VERSION=1.0.2
Bu parametre yazılımın versiyonunu göstermektedir.

EXT=tar.gz
Bu 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=i486
Bu parametre hazırlanacak paketin işlemci mimarisini göstermektedir.

TARGET=i486
Bu parametre paketin derlenmesi esnasında işlemci mimarisine göre işlem yapılmasını sağlar.

BUILD=1
Bu 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/testing
Bu 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.


Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
md5sum -c ${NAMESRC}-${VERSION}.$EXT.md5Bu 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.

Kod: [Seç]
CWD=`pwd`
Bu kısımda "pwd" komutu ile içerisinde bulunulan dizin bilgisi CWD değişkenine aktarılıyor.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
if [ ! -d $TMP ]; then
  mkdir -p $TMP
fi
Bu kısımda "TMP" değişkeni ile belirtilen dizin yoksa oluşturuluyor.

Kod: [Seç]
if [ ! -d $PKG ]; then
  mkdir -p $PKG
fi
Bu kısımda "PKG" ile belirtilen package-$NAMESRC dizini yoksa oluşturuluyor.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
install -m 644 \
  AUTHORS ChangeLog COPYING* INSTALL NEWS README \
  $PKG/usr/doc/$NAME

Kod: [Seç]
mkdir -p $PKG/usr/doc/$NAME/html
install -m 644 \
  docs/html/* \
  $PKG/usr/doc/$NAME/html

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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.

Kod: [Seç]
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

Kod: [Seç]
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

Kod: [Seç]
md5sum paket_adı.md5

komutu ile MD5 değeri oluşturulur. Örneğin;

Kod: [Seç]
md5sum xmms-1.2.10.tar.gz.md5

Bu işlemden sonra

Kod: [Seç]
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ü
Kod: [Seç]
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:

Kod: [Seç]
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
Başlık: Ynt: Truva Linux Paketleri Nasıl Hazırlanır?
Gönderen: atlantis - 11 Nisan 2008, 11:15:20 öö
Wiki'de paket hazırlama makalesinin daha ayrıntılı sürümü mevcut. Meraklıları wikide Truva Linux Kurulum ve Kullanım Kılavuzu'nda ki Truva Linux Paketleri Geliştirmek maddesine bakabilirler...