Учебники (How-To & F.A.Q)
   17516

как написать PKGBUILD

В связи со стремительным набором популярности я заметил, что на manjaro стремительно стали пробовать переходить убунтоводы, минтовцы и прочие дебианщики. Очень часто наблюдаю комментарии, что в манджаро apt-get не работает или рекомендации установить deb-пакет при помощи dpkg. Такие фразы периодически веселят, но когда это происходит практически каждый день в телеграмм-чате я все-таки решился написать маленький how-to как же все-таки написать PKGBUILD и установить приложение, которого нет в аур. Писатель из меня никудышный, поэтому не стоит оценивать перо автора очень критично. И так приступим.
Для начала немного теории. PKGBUILD — это обычный текстовый файл с набором инструкций по сборке пакетов для арчеподобных дистрибутивов. На выходе мы должны получить пакет с расширением *.pkg.tar.xz. По сути это просто архив с установочными файлами пакетов и информацией об устанавливаемом пакете. с помощью PKGBUILD можно написать инструкцию по сборке пакета из *.deb, *.rpm, их исходников и даже просто из обычного архива файлов. Главное понимать что ты собираешься получить на выходе.

Пример написания PKGBUILD для сборки из deb

для примера я возьму IPTV-player украинского разработчика Вячеслава Зубика ZVVOnlineTV, которого, кстати нет в аур`е.
Скачиваем deb-пакет с сайта и помещаем его в отдельный каталог(для удобства).
рядом с файлом создаем текстовый файл и присваиваем ему имя PKGBUILD. готово!
открываем его в текстовом редакторе.
Итак. первая строка не обязательна и не несет какой-либо инструктивности, а просто говорит нам кто разработчик
# Maintainer: Вячеслав Зубик

идем далее
pkgname=zvvonlinetv

имя пакета,
здесь все подробно описано.
далее создадим типа «переменную» с именем ZVVOnlineTV
_pkgname=ZVVOnlineTV

здесь скажу пару слов. Так как ОС линукс чувствительна к регистру, то нам нужно это дело как-то обозначить.
следующее
pkgver=2.1

присваиваем актуальную версию программы,
_pkgver=2_1

так как имя скачанного файла ZVVOnlineTV2_1.deb, то нужно создать еще одну переменную.
pkgrel=1

присваиваем версию релиза.
pkgdesc="TV player"

добавляем описание
arch=('i386' 'x86_64')

архитектуру.
url="https://zvvubuntu.blogspot.com"

и ссылку на источник.
license=('custom')

указываем лицензию, я не знаю под какой лицензией разработчик распространяет это приложение. поэтому custom
далее определяем зависимости, которые необходимы для работы приложения, они есть на сайте разработчика

Для запуска ТВ в системе должны быть установлены:
1. Библиотеки PyQt5 и Gstreamer
сделали.
depends=('pyqt5-common' 'python-pyqt5' 'vlc' 'qt5-multimedia' 'gstreamer' 'gst-libav' 'gst-plugins-bad')

какие нужны зависимости, ищите в инструкциях разрабов или гуглением или посредством вылова ошибок при работе программы, — если вдруг начала ругаться, что не хватает какой-то библиотеки, значит это необходимая зависимость!!!)
Некоторые пакеты в арчеподобных системах называются немного иначе, но, думаю, кому надо, — разберется!
Идем далее
source=("${_pkgname}${_pkgver}.deb")

здесь мы показываем источник, из которого мы будем брать данные(файлы программы) для сборки, вот как раз сдесь нам и пригодятся наши переменные ${_pkgname} — это имя пакета ZVVOnlineTV, а ${_pkgver} — это его версия 2_1 использованная в имени файла, далее ставим точку и указываем расширение deb.
в source можно указать и url-ссылку на исходный файл, если их несколько то они перечисляются в кавычках через пробел:

например!
source=("${_pkgname}${_pkgver}.deb" "zvvonlinetv" "ZVVOnlineTV.desktop")


md5sums=('a16762ab1e46f401d4e26a4b6fd74898')

здесь указывается контрольная сумма файла, подробнее в арчвики, если не знаете где ее взять, укажите в кавычках SKIP, вот так
md5sums=('SKIP')

Далее переходим непосредственно к сборке.
package() {
  cd "${srcdir}"
  bsdtar -xf data.tar.xz -C "$pkgdir"
}

Когда начнется сборка, то в каталоге, где вы разместили файл ZVVOnlineTV2_1.deb и создали PKGBUILD будет создано две директории src и pkg. Так вот файл ZVVOnlineTV2_1.deb (это по сути архив) распакуется в директорию src и в ней будут лежать наши файлы data.tar.xz, control.tar.gz, debian-binary и прочее.
Командой cd "${srcdir}" мы говорим скрипту что нужно переместиться именно в эту директорию для продолжения работы, вторая команда распаковывает архив data.tar.xz в директорию pkg. Дальше все это дело благополучно упакуется а архив с именем zvvonlinetv-2.1-1-x86_64.pkg.tar.xz.
прочитав до этого момента вы должны спросить, а когда же все-таки начнется сборка, и я отвечу, что для сборки пакета нужно открыть терминал в каталоге с этими файлами и запустить команду
makepkg

после того как скрипт отработает его можно установить командой
sudo pacman -U package_name

где package_name имя вашего пакета, в данном случае zvvonlinetv-2.1-1-x86_64.pkg.tar.xz

PKGBUILD
# Maintainer: Вячеслав Зубик
pkgname=zvvonlinetv
_pkgname=ZVVOnlineTV
pkgver=2.1
_pkgver=2_1
pkgfix=fix
pkgrel=1
pkgdesc="TV player"
arch=('i386' 'x86_64')
url="https://zvvubuntu.blogspot.com"
license=('custom')
depends=('pyqt5-common' 'python-pyqt5' 'vlc' 'qt5-multimedia' 'gstreamer' 'gst-libav' 'gst-plugins-bad') 

source=("${_pkgname}${_pkgver}.deb")
md5sums=('SKIP')

package() {
  cd "${srcdir}"
  bsdtar -xf data.tar.xz -C "$pkgdir"
 }


Пример написания PKGBUILD для сборки из исходников

для примера я возьму выключалку компьютера qshutdown, которой тоже нет в ауре
Подробно описывать не буду, а опишу только некоторые отличия.
В файле README описана инструкция по установке и необходимые зависимости для работы программы.
итак отличие будет в том, что у нас будет 2 секции build(){} и package() {}
build() {
	cd "$srcdir/$pkgname-$pkgver"

	qmake 
	make -j4
	}

package() {
	cd "$srcdir/$pkgname-$pkgver"
	make INSTALL_ROOT="$pkgdir" install
}

Порядок выполнения команд такой же как описано в README файле, единственное на что нужно обратить внимание, так это на строку
make INSTALL_ROOT="$pkgdir" install

в связи с тем что команду make install нужно выполнять от суперпользователя, в скрипте нужно это указать, чтобы во время сборки была создана имитация рут-установки.
пример PKGBUILD`a

Спойлер!
# Maintainer: hakaishi

pkgname=qshutdown
pkgver=1.7.3.0
pkgrel=1
pkgdesc="Shutdown your computer"
arch=('x86_64')
url="https://launchpad.net/~hakaishi/+archive/ubuntu/qshutdown"
license=('custom')
depends=('qt5-tools' 'qt5-quick1' 'qt5-websockets' 'qt5-svg' 'gstreamer0.10-base' 'libxss' 'qt5-imageformats') 
source=("http://ppa.launchpad.net/hakaishi/qshutdown/ubuntu/pool/main/q/qshutdown/${pkgname}_${pkgver}.orig.tar.gz")
md5sums=('3789710c36e3979b3dd90f8fd943018e')

build() {
	cd "$srcdir/$pkgname-$pkgver"

	qmake 
	make -j4
	}

package() {
	cd "$srcdir/$pkgname-$pkgver"
	make INSTALL_ROOT="$pkgdir" install
}


Напоследок несколько ключей для работы с makepkg
makepkg -i — собирает и устанавливает пакет,
makepkg -s — устанавливает завизимости и собирает пакет
makepkg -si — угадайте)))
makepkg -g — выдает контролюную сумму пакетов.

Про сборку из rpm-пакетов не буду вдаваться в подробности, единственное, что должен быть установлкен rpmextract/pkgextract.

пример для rpm


складываем необходимые пакеты rpm в один каталог и создаем PKGBUILD примерно такого содержания, в source указываем имена нужных rpm-файлов
Спойлер!
# Maintainer: 
pkgname=sparkle

if test "$CARCH" == x86_64; then
    _pkgarch=$CARCH		# Если собираем пакеты для 64 бит
else
    _pkgarch=('i386')		# Если собираем пакеты для 32 бит
fi
pkgver=1.3
pkgrel=1
pkgdesc="Sparkle for Linux"
license=('custom')
arch=($CARCH)
options=('!strip')
#depends=('libwebkit' 'tinyxml2')
makedepends=('pkgextract')
url="www.sparkle.city"
source=(
sqlite3-unicodesn-0.1-1.1.x86_64.rpm
sparkle-1.3-1.1.x86_64.rpm        
tufao-1.3.4-1.1.x86_64.rpm
sparkle-vlc-2.2.0-1.1.x86_64.rpm
)

md5sums=('78694b150219ffd04b5013b4c793b658'
         '5b9e502fdb345c23c8709c4137baacdb'
         '60d986a4eb86afa54d4e5ece021033dd'
         'afc4b2e553532d005e5831a216abeeaf')


package() {
   cd $pkgdir
   cp -r $srcdir/usr $pkgdir
   #cp -r $srcdir/etc $pkgdir
   mv $pkgdir/usr/lib64 $pkgdir/usr/lib

}

ЗЫ эта програма давно не поддерживается, PKGBUILD выложен просто как пример
Остались вопросы пишите в комментариях
Всем удачи, арчвики в помощь!)
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org

8 комментариев

avatar
Спасибо, очень годная и нужная статья
+1
avatar
Сделал по вашей инструкции и получил ошибку:
install: cannot stat 'zvvonlinetv': No such file or directory
==> ERROR: A failure occurred in package().
    Aborting...
0
avatar
Сделал по вашей инструкции и получил ошибку:
обратите внимание, makepkg вам четко указал в каком месте он споткнулся
==> ERROR: A failure occurred in package().
то есть он говорит, что в секции package() написана какая-то ересь, посмотрите в секцию и все станет на свои места
Последний раз редактировалось
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
0
avatar
удалите эти сроки, они лишние, ну как лишние, просто в примере о них ничего не говорится. я просто выложил свой билд с примочками и не перепроверил, бывает, спасибо за наблюдательность, поправил в статье)))
install -Dm755 zvvonlinetv $pkgdir/usr/bin/zvvonlinetv
  install -Dm755 ZVVOnlineTV.desktop $pkgdir/usr/share/applications/ZVVOnlineTV.desktop
Последний раз редактировалось
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
0
avatar
При попытке установить пакет пишет следующее:
Спойлер!
Пакеты (1) zvvonlinetv-2.3-1

Будет установлено: 5,81 MiB

:: Приступить к установке? [Y/n] y
(1/1) проверка ключей [##################################] 100%
(1/1) проверка целостности пакета [##################################] 100%
(1/1) загрузка файлов пакетов [##################################] 100%
(1/1) проверка конфликтов файлов [##################################] 100%
(1/1) проверка доступного места [##################################] 100%
:: Обработка изменений пакета…
(1/1) установка zvvonlinetv [##################################] 100%
предупреждение: права доступа различаются у каталога /usr/
файловая система: 755 пакет: 775
предупреждение: права доступа различаются у каталога /usr/share/
файловая система: 755 пакет: 775
предупреждение: права доступа различаются у каталога /usr/share/applications/
файловая система: 755 пакет: 775
:: Запуск post-transaction hooks…
(1/2) Arming ConditionNeedsUpdate…
(2/2) Updating the desktop file MIME type cache…

Как побороть? Благодарю за внимание
0
avatar
Как побороть? Благодарю за внимание
так ведь установилось же, что не устраивает?
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
0
avatar
Её небыло после установки в меню выбора программ (и поиск в этом меню не давал результата). Нашел в папке /usr/share/applications/ в файловом менеджере. Всё работает, всё устраивает). Спасибо что откликнулись.
0
avatar
А как сделать, если в `source` надо указать чтобы скачал через Proxy (VPN)?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.