Ebuild yazmaya hızlı başlangıç

· by Gürkan · Read in about 6 min · (1275 Words)

Bu yazı oldukça tanıtıcı ve hızlı bir şekilde ebuild yazma hakkında bir önbilgi oluşturmak ve temel işlevleri anlatmak amacıyla oluşturulmuştur.

Burda kullanılan ebuild'ler gerçekte kullanılan ebuild'ler veya onların biraz sadeleştirilmiş/kırpılmış halleridir.

İlk Ebuild

İlk örneğimiz Ctags aracının ebuild'i. Basitleştirilmiş dev-util/ctags/ctags-5.5.4.ebuild örneğini görüyorsunuz. (Portage ağacını inceleyerek gerçek ebuild'lere bakabilirsiniz).

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

DESCRIPTION="Exuberant ctags generates tags files for quick source navigation"
HOMEPAGE="http://ctags.sourceforge.net"
SRC_URI="mirror://sourceforge/ctags/${P}.tar.gz"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~mips ~sparc ~x86"
IUSE=""

src_compile() {
    econf --with-posix-regex || die "econf failed"
    emake || die "emake failed"
}

src_install() {
    emake DESTDIR="${D}" install || die "install failed"

    dodoc FAQ NEWS README || die
    dohtml EXTENDING.html ctags.html
}

Temel Format

Gördüğünüz gibi, ebuild'ler sadece birer bash scripti. Tek farkları, özel bir ortam (portage) tarafından değerlendirilmeleri.

Ebuild'in en baştaki "header" kısmı, bütün ebuild'lerde sabit olan "başlık"tır.

Ebuild'ler tab boşlukları ile düzende tutulmaktadır: Ebuild File Format.

Bilgi değişkenleri

Ardından Portage'a paketin adını, sürümünü, lisansını vs. belirten bilgi amaçlı değişkenler gelir.

DESCRIPTION değişkeni, paket ile ilgili "kısa" bir tanımdan ibarettir.

HOMEPAGE, pakedin anasayfasına bir link içerir. (http:// bölümünü unutmayın).

LICENSE değişkeni GPL-2 (GPL lisansı sürüm 2)

SRC_URI değişkeni, Portage'a paketi kurarken hangi kaynak(lar)dan çekmesi gerektiğini söyler. Burdaki mirror://sourceforge/ tanımı, Sourceforge'a özel bir tanımdır. ${P} salt okunur bir değişkendir. Paketin adı ve sürümünü içerir. Bu örnekte ctags-5.5.4.

SLOT değişkeni, birden fazla sürümü aynı sisteme kurulabilen (çok kanallı) paketler için ayarlanır. Genelde paketler tek kanallı olduğundan "0" (sıfır) değerine ayarlıdır.

KEYWORDS değişkeni, paketin kurulabileceği sistem mimarilerini (x86, amd64 vs) belirtir. Mimaride ~ karakteri kullanmak, paketin o yapı için henüz kararlı olmadığını/test aşamasında olduğunu belirtir. Bunun yanısıra "-" (eksi) kullanılarak o mimaride çalışmayacağını da belirtebilirsiniz.

-* değeri özel bir değerdir. Paketin belirtilen mimariler dışında çalıştırılamayacağını anlatır. Ayrıca mimari belirtiminde * veya ~* değerlerini asla kullanmamalısınız.

Derleme fonksiyonları

Sıradaki src_compile fonksiyonu, Portage'a bir paketi "derlemesi" derektiğini söyler. econf ./configure için, emakede "make" için bir genel kullanım değişkenidir. Her durumda kullanılan || die "birşeyler yanlış gitti"tarzındaki kullanım da, hata durumunda verilecek mesajı belirler.

src_install fonksiyonu, Portage'a paketi kurması gerektiğini söyler. Düz halde kök dizine kurmanın yanı sıra, eğer istenirse ${D} değişkeni ile belirtilen "hedef"e kurulum yapar. Burda da || die eklemesi ile hata çıktısı alınabilir.

Not:

Standart Makefile dosyaları ile gerçekleştirilecek kurulumda bilinen yöntem emake DESTDIR="${D}" install "˜dır. Eğer bu yöntem sandbox hatası veriyorsa yerineeinstall kullanın.

dodoc ve dohtml ise /usr/share/doc altına kurulacak dökümanlarda yardımcı olur.

Bağımlılıklarla bir Ebuild

ctags örneğinde kurulum sırasında paketin herhangi bir bağımlılığından söz etmedik. Çünkü ctags derlenmek ve kurulmak için temel komutlara ihtiyaç duyar. Bu yüzden oldukça basittir.

Bağımlılıklara paket eklerken şu tarz isimlendirme kullanılır:

~sys-apps/qux-1.0
=sys-apps/foo-1.2*
!sys-libs/gdbm

Buradaki "~" paketin erişilebilen son sürümünü kurmak ister. "=" ifadesi de tam olarak o sürümün kurulmasını gerektirir. Mesela buradaki örnekte foo pakedinin 1.2.7 ve 1.3 sürümleri erişilebilir ise, "=" ifadesine göre 1.2.7 sürümü seçilecektir. "!" ifadesi de, bu paketin kurulan paket ile çakıştığını belirtir. Bazı sebeplerden dolayı ikisi aynı anda sistemde bulunamayan paketler için kullanılır.Şimdi de app-misc/detox/detox-1.1.1.ebuild"˜e bakalım:

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

DESCRIPTION="detox safely removes spaces and strange characters from filenames"
HOMEPAGE="http://detox.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~hppa mips sparc x86"
IUSE=""

DEPEND="dev-libs/popt
    sys-devel/flex
    sys-devel/bison"
RDEPEND="dev-libs/popt"

src_compile() {
    econf --with-popt || die "econf failed"
    emake || die "emake failed"
}

src_install() {
    emake DESTDIR="${D}" install || die "install failed"
    dodoc README CHANGES || die
}

Burda da başlık ve bilgilendirme değişkenlerini görüyoruz. Buradaki SRC_URIaltındaki ${PN} değişkeni pakedin adını, sürüm numarası olmadan belirtir.

Burada da src_compile ve src_install fonksiyonları verilmiş.

DEPEND ve RDEPEND değişkenleri, paketin nelere ihtiyaç duyduğunu belirtir. DEPENDdeğişkeni, pakedin kurulması için gereken bağımlılıkları, RDEPEND de çalışması için gerekli bağımlılıkları içerir.

Bağımlılıkları adlandırırken dikkat etmeniz gereken bazı kurallar vardır. Mesela:

  • Her zaman kategori bölümünü de ekleyin.
    Örneğin >=x11-libs/gtk+-2 kullanın, >=gtk+-2 değil.
  • Büyük-küçük tanımları için çoklu seçim (*) kullanmayın.
    Örneğin >=x11-libs/gtk+-2 kullanımı, >=x11-libs/gtk+-2*"˜dan daha mantıklıdır.
  • Asla bir meta pakete bağımlılık kullanmayın.
    gnome-base/gnome gibi yanında onlarca paketi kurmaya mecbur edenler yerine, özel tanımlar kullanın, libgnome kütüphanesi gibi.
  • Her satıra sadece bir bağımlılık yazın.
  • GTK: GTK+1 uygulamaları için daima =x11-libs/gtk+-1.2* bağımlılığını kullanın.
  • Bunların yanısıra sağlam bir ebuild bağımlılığı listesi için, kuracağınız paketin anasayfası ile beraber; _configure.in, configure.ac, README, INSTALL, .spec_dosyalarını da gözden geçirin.

Yamalar ile Ebuild

Çoğunlukla yama uygulamamız gerekir. src_unpack fonksiyonuna yardımcı olan epatch fonksiyonu ile bu işlemi yapabiliriz. epatch kullanmak için Portage'a eutils sınıfını belirtmemiz gerekir. "” Bu işlem de başlangıçtaki inherit eutils satırı ile sağlanır.

İşte örnek app-misc/detox/detox-1.1.0.ebuild:

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

DESCRIPTION="detox safely removes spaces and strange characters from filenames"
HOMEPAGE="http://detox.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~hppa ~mips ~sparc ~x86"
IUSE=""

DEPEND="dev-libs/popt
    sys-devel/flex
    sys-devel/bison"
RDEPEND="dev-libs/popt"

src_unpack() {
    unpack ${A}
    cd "${S}"

    epatch "${FILESDIR}"/${P}-destdir.patch
    epatch "${FILESDIR}"/${P}-parallel_build.patch
}

src_compile() {
    econf --with-popt || die "econf failed"
    emake || die "emake failed"
}

src_install() {
    emake DESTDIR="${D}" install || die "install failed"
    dodoc README CHANGES || die
}

Buradaki ${FILESDIR}/${P}-destdir.patch ibaresinin, Portage ağacında _files/_klasörü içindeki detox-1.1.0-destdir.patch dosyasına ait olduğuna dikkat edin. Büyük yamalar files/ klasörü yerine sunucularda tutulur.

USE Bayrakları ile Ebuild

Şimdiki örneğimiz, USE bayrağı kullanan dev-libs/libiconv/libiconv-1.9.2.ebuild dosyası.

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

DESCRIPTION="GNU charset conversion library for libc which doesn't implement it"
SRC_URI="ftp://ftp.gnu.org/pub/gnu/libiconv/${P}.tar.gz"
HOMEPAGE="http://www.gnu.org/software/libiconv/"

SLOT="0"
LICENSE="LGPL-2.1"
KEYWORDS="~amd64 ~ppc ~sparc ~x86"
IUSE="nls"

DEPEND="virtual/libc
    !sys-libs/glibc"

src_compile() {
    econf $(use_enable nls) || die "econf failed"
    emake || die
}

src_install() {
    emake DESTDIR="${D}" install || die "install failed"
}

IUSE değişkenine dikkat edin. Bu, pakedin kullandığı (özel olmayan) bütün bayrakları listeler. Bunlar emerge -pv çıktısında görülür.

Bu paket derlenmesi sırasında ./configure betiğinde standart olarak \--enable-nls veya \--disable-nls değişkenlerini kullanıyor. Bu yüzden use_enable aracını kullanarak, USE bayraklarına bağlı olan bu değişkenlerin kullanılmasını sağlıyoruz.

Ebuild içinde USE bayrağına bağlı olarak bir işlem gerçekleştirecekseniz, şunu kullanabilirsiniz:

if use Z; then
  # Z bayrağı aktifse yapılacaklar..
fi

Sürekli olarak güncelllenen USE bayrakları listesi için buraya bakabilirsiniz.Biraz daha karmaşık bir örnek, bu kez mail-client/sylpheed/sylpheed-1.0.4.ebuild:

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

DESCRIPTION="A lightweight email client and newsreader"
HOMEPAGE="http://sylpheed.good-day.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="GPL-2"
KEYWORDS="alpha amd64 hppa ia64 ppc ppc64 sparc x86"
SLOT="0"

IUSE="crypt gnome imlib ipv6 ldap nls pda ssl xface"

DEPEND="=x11-libs/gtk+-1.2*
    nls? ( >=sys-devel/gettext-0.12.1 )
    crypt? ( >=app-crypt/gpgme-0.4.5 )
    gnome? ( media-libs/gdk-pixbuf )
    imlib? ( media-libs/imlib )
    ldap? ( >=net-nds/openldap-2.0.11 )
    pda? ( app-pda/jpilot )
    ssl? ( dev-libs/openssl )
    xface? ( >=media-libs/compface-1.4 )"
RDEPEND="${DEPEND}
    app-misc/mime-types
    x11-misc/shared-mime-info"

src_unpack() {
    unpack ${A}
    cd "${S}"

    epatch "${FILESDIR}"/${PN}-namespace.diff
    epatch "${FILESDIR}"/${PN}-procmime.diff
}

src_compile() {
    econf \
        $(use_enable nls) \
        $(use_enable ssl) \
        $(use_enable crypt gpgme) \
        $(use_enable pda jpilot) \
        $(use_enable ldap) \
        $(use_enable ipv6) \
        $(use_enable imlib) \
        $(use_enable gnome gdk-pixbuf) \
        $(use_enable xface compface) \
        || die

    emake || die
}

src_install() {
    einstall || die "einstall failed"
    dodir /usr/share/pixmaps
    insinto /usr/share/pixmaps
    doins *.png

    if use gnome ; then
        dodir /usr/share/gnome/apps/Internet
        insinto /usr/share/gnome/apps/Internet
        doins sylpheed.desktop
    fi

    dodoc [A-Z][A-Z]* ChangeLog* || die
}

Seçime bağlı olarak değişen (? işaretli) bağımlılıklara dikkat. Ayrıca use_enablesatırları 2 ayrı değişken içermekte. Bu özellik, eğer USE bayrağının ismi tam olarak./configure komutuna gelen değişkenle eşleşmiyorsa, yeniden adlandırma yapmak için kullanılır.

Fazladan bazı açıklamalar içeren skel.ebuild dosyasına bakabilirsiniz. (Genellikle/usr/portage altındadır.)

Ebuild'i denemek ve kullanmak

Oluşturduğunuz ebuild'i denemek için ebuild ornek.ebuild test komutu verebilirsiniz.

Normalde Portage ağaç yapısına göre kendi Ebuild dosyalarınızı da yerleştirip kullanabilirsiniz, ancak emerge --sync işleminin ardından /usr/portage altındaki bütün dosyalar yeniden yapılanır ve ekledikleriniz silinir. Bu yüzden/etc/make.conf altında belirleyebileceğiniz PORTDIR_OVERLAY değişkeni ile kendi ebuildlerinizi (aynı ağaç yapısında klasörleyerek) başka bir dizin altında tutup, sürekli olarak kullanabilirsiniz. (Örneğin /usr/local/portage)

Not: http://devmanual.gentoo.org/quickstart/index.html adresindeki resmi gentoo belgesinin aynı lisansa sahip çevirisidir.