Maceraya hazır mısın! bir BSD almaz mısın?

Duyuru
* Forum tasarımımız yenilendi.
* FreeBSD 10.4 - RELEASE Final çıktı.
* FreeBSD 11.1 - RELEASE Final çıktı.
Son Mesajlar
Çevrimiçi (0)

Port Ağacı ve Özel Port Oluşturma

FreeBSD Port Ağacı ve Özel Port Oluşturma


Giriş


FreeBSD Port Ağacı, (FreeBSD Ports Tree) FreeBSD işletim sistemi için geliştirilen kolay yönetilebilir uygulama yönetim sistemi bütünüdür.  Ocak 2012 'itibariyle 24000 civarı yüklenebilir port barındırmaktadır. FreeBSD ports; NetBSD, OpenBSDprojelerinin yanısıra bazı linux dağıtımları tarafından da kullanılmaktadır.
Portlar üzerinde gerçekleştirilen install, build, uninstall gibi işlemler, düzenlenen Makefile'ların make komut çağrısıyla işlenmesiyle sağlanmaktadır.
FreeBSD Ports içinde yer alan binlerce uygulama titiz bir çalışma sonucu kategorilenmiş dizinler altında (/usr/ports) servis edilmektedir.  Güncel kategori listesine aşağıdaki adresten ulaşabilirsiniz.
5.3.2 Current List of Categories:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/book.html#porting-categories
Örneğin; yükleme için port dizininde; “make install”, yüklemede kullanılan work dizinini temizlemek için “make clean” komutu kullanılmaktadır. “make install clean” çağrısıyla iki işlem aynı anda gerçekleştirilir. “make deinstall” ile port kaldırılır.
Make komutu ile Makefile içeriğinde MASTER_SITES= tanımındaki adresten kaynak yüklemesi yapılmaktadır. Kaynak dosyalar
/usr/ports/distfiles/ dizinine kaydedilir.
Makefile üzerinde yapılabilen kolay düzenlemelerle, port’a ait bağımlı uygulamalar kolayca tanımlanabilmektedir. Port kurulumuyla ilgili özelleştirebilir seçenekler Makefile üzerinde belirlenmektedir.
FreeBSD Ports ile kaynak koddan derlenerek bağımlı paketlerin yüklenebilmesi sağlandığı gibi tekrar derleme yapılmaksızın zaten derlenmiş olan paketlerin kurulumu da gerçekleşebilmektedir. Bunun için port’un .tbz uzantılı paketininin oluşturulması gerekir.

Port Ağacı Kurulumu


FreeBSD port ağacı temel (base) kurulumla beraber yüklenmemektedir. Bu yüzden kurulumu portsnap ile veya cvsup ile sizin gerçekleştirmeniz gerekmektedir. Hızlı ve kolay kurulum için portsnap kullanmanızı öneririm.

Portsnap ile Kurulum


FreeBSD port ağacı eski sürümlerde cvsup-without-gui uygulaması ile kurulmaktaydı. Yeni sürümlerde  ise kurulum için portsnap uygulaması tercih edilebilir.
Portsnap ile port ağacının yüklenmesi için fetch ve extract işlemleri gerçekleşir.Portsnap ile kurulum root kullanıcısındayken “portsnap fetch extract” çağrısı ile yapılmaktadır.

Cvsup ile Kurulum


Cvsup ile yükleme için ise öncelikle cvsup-without-gui portu kurulmalıdır. cvsup-without-gui derlenmiş paketini uzaktan yükleme için pkg_add komutu –r parametresi ile kullanılmalıdır. “pkg_add –r cvsup-without-gui” Sonrasında /usr/share/examples/cvsup dizini altında ports-supfile düzenlenmeli ve “cvsup -g –L 2 ports-supfile” çağrısı yapılmalıdır.

Port’tan derlenmiş Paket oluşturma


Kurulumda port’un ve bağımlı port’ların derlenerek yüklenmesi oldukça zaman alan zahmetli bir iştir. Bu durumda derlenmiş paket kullanımı tercih edilebilir.
Port’tan paket oluşturma işlemi için port dizini içerisinde “make package” çağrısı kullanılmaktadır. Make package çağrısı sadece port’a ait .tbz kurulum paketini oluşturmaktadır.
“make package-recursive” çağrısı ise port’un ve bağımlı olan diğer port’ların paket dosyalarının oluşması sağlanmaktadır.
Binary paketler /usr/ports/packages/All dizini altında .tbz uzantısı ile oluşmaktadır.P aket oluşturma işlemleri öncesinde /usr/ports/packages dizinin varolduğundan şayet yoksa bu dizini oluşturduğunuzdan emin olunuz.

Yeni Port Oluşturma


Port dizinin oluşturulması


Öncelikle oluşturulacak port için uygun kategori dizini altında dizin oluşturulmalıdır. Örneğin; /usr/ports/security/testapp gibi.

Port dizininde pkg-descr dosyasının oluşturulması


Dizin içerisinde pkg-descr dosyası oluşturulmalıdır ve bu dosya içerisine port ile ilgili özet bilgi girilmelidir. Örnek olarak aşağıdaki pkg-descr içeriğini kullanabilirsiniz.
pkg-descr:
This is a port of oneko, in which a cat chases a poor mouse all over the screen. 
:
(etc.)

Makefile düzenleme


Makefile dosyasında port adı, sürüm bilgisi, download adresi, paket bağımlılıkları, build yapılacaksa kullanılacak builder ortamı, hedef dizin yapısı, github kullanılıyorsa github bilgileri vb.. tanımlar yapılmaktadır. Kısacası uygulamamızla ilgili tüm temel tanımları bu dosyada tanımlamamız gerekiyor.
Örnek bir Makefile:
# $FreeBSD$
PORTNAME=            oneko
PORTVERSION=       1.1b
CATEGORIES=         games
MASTER_SITES=      ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER=         asami@FreeBSD.org
COMMENT=             Cat chasing a mouse all over the screen
MAN1=                    oneko.1
MANCOMPRESSED=  yes
USE_IMAKE=           yes
.include
Makefile içerisinde tanımlı olmasa da PREFIX değişkeni /usr/local dizinini işaret eder. Makefile içerisinde yer alan kurulum bloklarınız da direk yol yerine ${PREFIX} değişkenini kullanabilirsiniz.Eğer derleme yapılmayacaksa USE_IMAKE satırını silebilirsiniz.

MakeFile: Kullanıcı ve grup oluşturma


Port kurulumunda kullanıcı ve grupların otomatik oluşturulması için Makefile içinde USERS= ve GROUPS= tanımları kullanılmaktadır. Örneğin; test kullanıcısı ve test grubunun kurulumda otomatik oluşturulması için port Makefile dosyasına
GROUPS= test
USERS=    test
satırları eklenmelidir. Test kullanıcısına ait bilgiler /usr/ports/UIDs içinde test grubuna ait diğer bilgiler ise /usr/ports/GIDs içindeki rezerve edilmiş tanımlar arasında olmalıdır. Eğer tanımlı değilse port kurulumu;
** Cannot find any information about user `test in /usr/ports/UIDs.
hatası ile sonlanmaktadır.

Makefile: Dosya dizinlerin tanımları


Kurulumla beraber oluşacak ve deinstall (kaldırma) işlemi ile silinecek dosya - dizinlerin tanımları Makefile içerisinde kullanılan PLIST_FILES ve PLIST_DIRS değişkenleri ile sağlanmaktadır.
PLIST_DIRS değişkeninde tanımlanan dizinler en önce en ağacın en iç tarafında yer alan dizin tanımlanacak şekilde sıralanmalıdır. Eğer bu şekilde doğru sıralama yapılmazsa kaldırma işleminde dizinler doğru şekilde silinmemektedir.
Örnek bir Makefile:
# $FreeBSD$
CUSTOMAPPLICATIONDIR=    customapplication/
CUSTOMAPPLICATIONOUTPUT= ${PREFIX}/customapplication/output/
CUSTOMAPPLICATIONLOGS=   ${PREFIX}/customapplication/logs/PORTNAME=            oneko
PORTVERSION=       1.1b
CATEGORIES=         games
MASTER_SITES=      ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/MAINTAINER=         aokan@siyahsapka.org
COMMENT=             Cat chasing a mouse all over the screen
MAN1=                    oneko.1
MANCOMPRESSED=  yes
USE_IMAKE=           yesPLIST_FILES=    ${CUSTOMAPPLICATIONDIR}/db/file1 
                ${CUSTOMAPPLICATIONDIR}/db/file2 
                ${CUSTOMAPPLICATIONDIR}/lib/file3 PLIST_DIRS=     ${CUSTOMAPPLICATIONDIR}/db 
                ${CUSTOMAPPLICATIONDIR}/lib .include <bsd.port.mk>

Makefile: Boş dizin oluşturulması


FreeBSD port sistemi ile kurulum yaparken MASTER_SITES ‘da belirtilen source archive dosyası içindeki boş dizinler yaratılmasına rağmen pkg_add ile oluşturulan paket ile kurulurken boş dizinler oluşmamaktadır. (http://www4.tw.freebsd.org/doc/en/books/porters-handbook/plist-cleaning.html)

pkg-plist dosyası


Çözüm için için pkg-plist dosyası aşağıdaki şekilde düzenlenmelidir.
@exec if [ ! -d %D/customapplication/output ] ; then  mkdir -p %D/customapplication/output; fi
exec if [ ! -d %D/customapplication/run ] ; then  mkdir -p %D/customapplication/run; fi
exec if [ ! -d %D/customapplication/logs ] ; then  mkdir -p %D/customapplication/logs; fi

Makefile: Bağımlı portların tanımlanması


Uygulamanın çalışması için  veya derlenmesi için veya çıkartma (extract) işi için ihtiyaç duyabileceği kütüphane veya diğer uygulamaların da sisteme kurulmasını sağlamak amacıyla bağımlı portların Makefile içerisinde tanımlanması gerekmektedir.
Bağımlı portların veya kütüphanelerin kullanımı aşağıdaki direktiflerle sağlanmaktadır.
LIB_DEPENDS
RUN_DEPENDS
BUILD_DEPENDS        
FETCH_DEPENDS  
EXTRACT_DEPENDS      
PATCH_DEPENDS      
USE_*
Örneğin jpeg port’unu LIB_DEPENDS altında aşağıdaki biçimde tanımlayarak eğer sistemde kurulu değilse otomatik kurulması sağlayabiliriz.
LIB_DEPENDS=   jpeg:${PORTSDIR}/graphics/jpeg

pkg-install dosyası


pkg-install dosyası paket kurulumu sırasında işlenen dosyadır. Eğer kurulum yapılacak hedef dizin /usr/local prefix ‘i dışında ise dosya kopyalama direktifleri bu dosyaya eklenmelidir. Kurulum sonrası çalıştırmak istediğiniz shell script çağrılarını yine bu dosyada tanımlamalısınız.
#!/bin/sh
[ "$2" != "POST-INSTALL" ] && exit 0
#============================================================
# POST-INSTALL
#============================================================
cp ${PKG_PREFIX}/customapplication/test/etc/testfile /etc/

pkg-deinstall dosyası

#!/bin/sh
[ "$2" != "DEINSTALL" ] && exit 0
#============================================================
# DEINSTALL
#============================================================
rm -fr /etc/testfile
Kurulum yapılan dizin /usr/local dışında ise kaldırma işleminde bu dosyaları silinmesi için gerekli direktifler pkg-deinstall dosyasında tanımlanmalıdır. Kaldırma işlemi sonrası çalıştırılmasını istediğiniz shell script kodları bu dosyaya eklenmelidir.

Makefile kaynaklı hatalar


Makefile düzenlerken en çok karşılaşılan hatalar tab (t) karakteri yerine kullanılan boşluk (spacel, s) karakterlerinden kaynaklanmaktadır.
Hata 1:
"Makefile", line 20: Need an operator
Çözüm:
Makefile da space yerine kullandığınız tab karakterlerini gözden geçiriniz. Satır başlarında veya satır sonlarındaki space karakterleri bu tarz hataların oluşmasına neden olmaktadır.
Hata 2:
Dosya adında $ geçiyorsa Makefile işlemi sırasında:
===>  Building package for customapplication-mgmtsrv-12.4.3
tar: customapplication/xxxserv/lib/tmp/com/testsys/interface/search/LogSearchFilterield.class: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
pkg_create: make_dist: tar command failed with code 256
*** Error code 1
Çözüm:
Çözüm için dosya adınız LogSearchFilter$field ise Makefile içinde LogSearchFilter$$field olarak kullanmalısınız. Yani escape işi için $’dan önce bir $ daha kullanıyorsunuz.
Kaynak  http://www.freebsd.org/doc/en/books/porters-handbook/index.html
==
Ali Okan Yüksel, 4 Şubat 2013, İstanbul
E-mail: aokan[at]siyahsapka.org
http://www.siyahsapka.org/doc/FreeBSD-Port-Agaci-ve-Ozel-Port-Olusturma.html



Bu güzel rehber için Sn. Yüksel'e çok teşekkür ederiz.

Maceraya hazır mısın?  Bir BSD almaz mısın!

Yorumlar

  • Bu öğretici makale paylaşımı için Sn. @Felasife ve Sn. Yüksel'e teşekkürler.
  • Emeği geçenlerin emeklerine sağlık.
  • @Felasife yazan:


    Freebsd 9.1 de temel kurulumda port ağacı yüklenebiliyor.
  • Banada yüklenemiyor gibi geldi, zira kurulumda her ne kadar burası seçilsede, sonradan bir şey derlerken ports.txz netten yeniden indiriliyor.
    9.1 de böyle mi oldu pek net hatırlamıyorum ama öncesinde hep böyleydi diyebilirim.

    Maceraya hazır mısın?  Bir BSD almaz mısın!
  • Daha dün akşam sıfırdan Freebsd 9.1-stable kurdum. Temel kurulumu yaptıktan sonra vi editörü ile kablosuz ağımı yapılandırdım. Porttan linux_base-f10 'u derleyerek kurdum. Bu akşam da yine porttan /x11/xorg 'ı kuracağım. Daha önce Freebsd 9.1-release 'i DVD'den kurduktana sonra yine bazı paketleri porttan kurmuştum. Fakat daha önceki sürümleri bilmiyorum.
  • Belkide ben taban sistemi kurduktan sonra portları güncellediğim için, yeniden port ağacını indiriyordur bende çok emin olamadım açıkcası.
    Aklımda kaldığı kadarıyla bunu verince (normalde bu komut varolan port ağacını günceller)
    # portsnap fetch update
    Ama altaki komutu döndürmemi istiyor diye hatırlıyorum (buda sıfırdan port ağacı oluşturur)
    # portsnap fetch extract 

    Maceraya hazır mısın?  Bir BSD almaz mısın!
  • port'un içine girip make install clean yapmaktan çok öteye götürmüşsün bu makalede de. Teşekkürler Felasife :)
  • Rica ederim. :)
    Ama tabii Sezarın hakkın Sezara demek mecburiyetindeyiz, olayı make install clean dan öteye götüren Sn. Yüksel'dir, iyikide götürmüştür.
    Her ne kadar sık kullanmasak bile bu tür bilgilerin BSD müdavimleri için öğretici olması, ufuklarını genişletmesi için faydalıdır.

    Maceraya hazır mısın?  Bir BSD almaz mısın!
Yorum yapmak için Oturum Açın yada Kayıt Olun .