Makepkg

Arch Linux Türkiye Belgeleri sitesinden
Atla: kullan, ara



Özet
makepkg, pacman ile kullanılmak üzere yazılımları derleyen ve paket oluşturan bir betiktir. Bu makale yapılandırması ve kullanımı hakkında ayrıntılı bilgi vermek amacıyla yazılmıştır.


GENEL BAKIŞ
Arch Linux üzerinde paketler makepkg ve her paket için ayrı bir derleme betiği (PKGBUILD olarak bilinir) kullanılarak oluşturulur. Yazılım paketlendiğinde pacman aracılığıyla kurulur ve yönetilir. Resmi Depolardaki yazılımlar için PKGBUILD betikleri ABS ağacında; daha da fazlası ise Arch Kullanıcı Deposu üzerinde bulunabilir


Kaynaklar
makepkg(8) El kitabı
makepkg.conf(5) El kitabı


makepkg, kendi paketlerinizi pacman ile kuruluma uygun bir şekilde derlemek için kullanılır. makepkg, kaynak dosyalarını indirip geçerliliğini denetleyen, bağımlılıkları kontrol eden, derleme zamanı ayarlarını yapılandıran, paketi derleyen, geçici bir kök içine yükleyen, uyarlamalar yapan, meta bilgisi üretip bütün bunları paketleyen bir betiktir. makepkg betiği pacman paketi içinde sunulur.

Konu başlıkları

Yapılandırma

/etc/makepkg.conf dosyası makepkg' nin ana yapılandırma dosyasıdır. Bir çok kullanıcı paket oluşturmadan önce makepkg seçeneklerini kendilerine göre ayarlamak isteyeceklerdir.

Mimari ve Derleme İşaretleri

Makepkg ile bir yazılım derlenirken make, gcc, ve g++ tarafından MAKEFLAGS, CFLAGS, ve CXXFLAGS seçenekleri kullanılır. Öntanımlı olarak makepkg.conf içerisinde bunlar bir çok makinede çalışabilmek üzere genel (generic) işaretler olarak belirlenmiştir. Bu işaretlerin değerleri değiştirilerek paketlemenin yapıldığı makine için verim ve hız arttırıcı biçimde derleme yapmak mümkündür. Bunun olumsuz yönü, derlenen paketleri sadece aynı tip işlemci kullanan makinelerde çalışacağı (mesela amd phenom ii işlemcili makineler) ancak diğer makinelerde (mesela bir intel işlemci makinede) çalışmayacağıdır.



Kalem.png
ÖNEMLİ:
Tüm yazılımlar için bu belirlenen işaretlerin kullanılacağı düşünülmemelidir. Çünkü bazı yazılımların MAKE dosyalarında kullanıcı ayarlamaları geçersiz kılınmış veya PKGBUILD dosyalarında bu ayarlar önceden belirlenmiş olabilir.


/etc/makepkg.conf
...

#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"

#-- Exclusive: will only run on x86_64
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"

...

Öntanımlı makepkg.conf CFLAGS ve CXXFLAGS seçenekleri aynı mimariyi kullanan tüm makineler ile uyumludur.

x86_64 makinelerde bu seçenekleri değiştirerek resmi paketleri yeniden derlemek için zaman ayırmanızı sağlayacak önemde verim artışı kazandıracak uygulama sayısı çok azdır.

GCC 4.3.0 sürümünden itibaren sunulan -march=native ayarı ile gcc derleme zamanında işlemcinin otomatik olarak algılanarak işlemciye özel seçeneklerin kendiliğinden kullanılması mümkün hale gelmiştir. Bunu kullanmak için CFLAGS ve CXXFLAGS seçeneklerini şu şekilde değiştirmeniz yeterlidir:

# -march=native also sets the correct -mtune=
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"

Teorik olarak işlemci tipine göre özel ayarlar yapmak verimi ve hızı arttıracaktır; çünkü -march= belirli bir işlemci için zamanlamayı geliştirecek ve erişilebilir tüm yönerge setlerinin kullanılmasını sağlayacaktır. Bu özellikle Arch Linux tarafından sağlanan öntanımlı seçenekler (paketler) kullanılırken etkinleştirilmeyen yeni tip yönergeleri kullanan uygulamaları (video/çözümleme uygulamaları, bilimsel uygulamalar, modelleme uygulamaları v.b.) yeniden derlenirken fark edilecektir.

"Standart olmayan" CFLAGS ayarları ile verimlilği ve hızı düşürmek çok kolaydır. Derleme işaretlerine göre derleyici kolayca kodu şişirebilir, sonsuz döngüler yaratabilir, kötü yönlendirmeler yapabilir v.b. Bu nedenle bir şeyin gerçekten hızlı olduğuna emin değilseniz bu seçenekleri değiştirmeyin.

Erişilebilir seçenekler için GCC el kitabına, daha ayrınıtlı bilgi için GENTOO Derleme Eniyileştirme Rehberi ve Güvenli Cflags yazılarına bakın.

MAKEFLAGS

MAKEFLAGS seçeneği make üzerine ek anahtarları geçirmek için kullanılır. Çoklu çekirdekli/çok işlemcili makineler sahip kullanıcılar make üzerine birden fazla işi eşzamanlı olarak geçirerek derleme süresinin kısalmasını sağlayabilirler. Temel olarak -j2 anahtarı ve her bir işlemci/çekirdek için artı 1 eklenmesi uygundur. Bazı PKGBUILD dosyalarında bu seçenek geçersiz kılınarak -j1 kullanılması sağlanmış olabilir. Bunun nedeni bazı olumsuzlukları önlemek veya yazılımın kaynak kodunun basitce make seçeneklerini desteklememesi olabilir. Derlenmesi başarısız olan paketler ile ilgili hata bildirimleri öncelikle kendi MAKEFLAGS ayarlarınızdan kaynaklanmadığından emin olduğunuz takdirde yapılmalıdır.

Kullanılabilir seçeneklerin tam listesi için man make el kitabına bakın.

Paket Çıktısı

Bundan sonraki bölümde, kullanıcı kaynak dosyaları ve paketlerin kaydedileceği konumu ve kendisinin paketleyici olarak bilgilerinin içerilip içerilmeyeceğini belirleyebilir. Bu aşama isteğe bağlıdır. Öntanımlı olarak makepkg' ni çalıştığı dizinde kaynak dosyalar ve oluşturulan paketler yerleştirilir.


/etc/makepkg.conf
...

#########################################################################
# PACKAGE OUTPUT
#########################################################################
#
# Default: put built package and cached source in build directory
#
#-- Destination: specify a fixed directory where all packages will be placed
#PKGDEST=/home/packages
#-- Source cache: specify a fixed directory where source files will be cached
#SRCDEST=/home/sources
#-- Source packages: specify a fixed directory where all src packages will be placed
#SRCPKGDEST=/home/srcpackages
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"

...

Örneğin şu dizini oluşturun:

$ mkdir /home/$USER/packages

Buna göre PKGDEST değerini değiştirin.

PACKAGER değeri derlenen paketlerin .PKGINFO metaveri dosyasında packager değerini belirleyecektir.Öntanımlı olarak kullanıcı tarafından derlenen paketlerde şunları görürsünüz:


pacman -Qi package
...
Packager       : Unknown Packager
...


PACKAGER değeri PACKAGER="John Doe <john@doe.com>" olarak düzenlendiğinde :


pacman -Qi package
...
Packager       : John Doe <john@doe.com>
...

olarak görünecektir.



Kalem.png
ÖNEMLİ:
/etc/makepkg.conf içerisindeki ayarlar, önlerindeki # işareti kaldırılarak etkinleştirilebilirler.

Kullanımı ve Paket Oluşturma

Devam etmeden önce, base-devel paket grubunu yüklediğinizden emin olun. Bu grupla ilgili olan paketlerin PKGBUILD dosyalarında bağımlılık olarak listelenmesine gerek yoktur. base-devel grubunu aşağıdaki komutu kullanarak yükleyebilirsiniz (root olarak):

pacman -S base-devel



Kalem.png
ÖNEMLİ:
Eksik (make) bağımlılıklarından yakınmadan önce base-devel paket grubunun kurulu olduğundan emin olun. makepkg kullanılırken base-devel paket grubunun sistemde kurulu olduğu varsayılmaktadır.

Bir paket oluşturmak için bir PKGBUILD (derleme betiği) dosyası elinizin altında olmalıdır. Bunu ya Paket oluşturma sayfasında açıklandığı gibi kendiniz oluşturmalı ya Arch Kullanıcı Deposu (AUR)'ndan bir tane edinmeli ya da Arch Derleme Sistemi (ABS) ağacından almalı veya diğer bir kaynaktan bulmalısınız.


Tango-dialog-warning.png
Uyarı:
Paketleri nereden edindiğinize dikkat etmeli ve sadece güvendiğiniz kaynaklardan gelen paketleri yüklemelisiniz.


PKGBUILD betiğini edindiğinizde yer aldığı konumda bir komut satırı açın ve paketi derlemek için normal kullanıcı olarak aşağıdaki komutu verin:

$ makepkg

makepkg işlem bittikten sonra mesela $srcdir içinde kalanlar gibi artık gereksiz dosya ve dizinleri temizlesin istiyorsanız aşağıdaki gibi "-c" anahtarını kullanın;

$ makepkg -c

Bu şekildeki bir kullanım özellikle aynı paketin aynı konumda birden fazla derlenmesi durumunda eski dosyaların yeni derlemeyi olumsuz etkilememesi yönünden faydalıdır.

Bütün gerekli bağımlılıkları yüklemediyseniz, makepkg ekrana buna dair bir uyarı yazdıracak ve başarısız olacaktır. Paketinizi derlemek ve bu bağımlılıkları yüklemek için basitçe şu komutu kullanabilirsiniz:

$ makepkg -s

Unutmayın, bu bağımlılıkların sizin yapılandırdığınız depolarda olması gerekir. Alternatif olarak, paketleri pacman -S --asdeps dep1 dep2 v.b. komutunu kullanarak el ile de bağımlılıkları kurabilirsiniz.

Bütün bağımlılıkları doğru bir şekilde karşılamışsanız ve paketiniz de doğru bir şekilde derlendiyse paket_adı-paket_sürümü.pkg.tar.xz paketi makepkg komutunu çalıştırdığınız dizinde ya da eğer yapılandırma dosyasında özel bir dizi belirtmiş iseniz ( /home/$USER/packages gibi ) bu dizin içerisinde oluşturulmuş olmalıdır. Şimdi pacman aracılığı ile bu paketi kurmak için (root olarak):

#pacman -U paket_adı-paket_sürümü.pkg.tar.xz

komutunu verin. Bunun yanında "-i" anahtarını kullanarak makepkg' nin derleme sonunda pacmanı çağırarak yeni paketin kendiliğinden sisteme kurulmasını sağlayabilirsiniz:

$ makepkg -sci  # Örnek olması için yukarıdaki tüm anahtarlar birlikte kullanılmıştır.

makepkg ile oluşturduğunuz ve kurulumunu yaptığınız paketler depolardan kurulmuş paketlerden farklı değildir. Bu paketleri yine pacman yardımıyla sistemden kaldırabilirsiniz.

# pacman -R paket_adı-paket_sürümü.pkg.tar.xz

İpuçları

PKGBUILD içindeki sağlama özetlerini otomatik olarak güncelleme

PKGBUILD betiklerinde indirilen ve kullanılan dosyaların bozuk olarak indirilip indirilmediğinin denetlenmesi için md5, sha1 veya sha256 sağlama özetleri kullanılır. Bu dosyaları değiştirdiğinizde PKGBUILD içindeki sağlama özeti değerini de değiştirmeniz gerekir. Aksi halde makepkg söz konusu dosyanın doğrulamadan geçemediği uyarısını vererek işlemi sonlandıracaktır. İşte sağlama özetlerini PKGBUILD betiğinde elle değiştirmek yerine bunu otomatikleştirecek iki seçenek sunuyoruz:

Seçenek 1

Sağlama özetlerini tek adımda değiştirebilecek aşağıdaki betiği kullanabilirsiniz.

#!/bin/bash
# Script by Falconindy
# https://bbs.archlinux.org/viewtopic.php?id=131666

awk -v newsums="$(makepkg -g)" '
BEGIN {
  if (!newsums) exit 1
}

/^[[:blank:]]*(md|sha)[[:digit:]]+sums=/,/\)[[:blank:]]*$/ {
  if (!i) print newsums; i++
  next
}

1
' PKGBUILD > PKGBUILD.new && mv PKGBUILD{.new,}

Seçenek 2

setconf PKGBUILD $(makepkg -g 2>/dev/null | pee "head -1 | cut -d= -f1" "cut -d= -f2") ')'

Yukarıdaki komutu da kullanabilirsiniz. Ancak bu komut bir takım eksileri de barındırır. Bir kere setconf paketinin kurulu olması lazımdır. Ayrıca PKGBUILD içinde md5 ve sha1 sağlama özetlerinin bir arada kullanılması gibi birden fazla sağlama özeti kullanılmışsa başarısız olacaktır.

Kişisel araçlar
GOOGLE
Diğer dillerde