17527
как написать PKGBUILD
В связи со стремительным набором популярности я заметил, что на manjaro стремительно стали пробовать переходить убунтоводы, минтовцы и прочие дебианщики. Очень часто наблюдаю комментарии, что в манджаро apt-get не работает или рекомендации установить deb-пакет при помощи dpkg. Такие фразы периодически веселят, но когда это происходит практически каждый день в телеграмм-чате я все-таки решился написать маленький how-to как же все-таки написать PKGBUILD и установить приложение, которого нет в аур. Писатель из меня никудышный, поэтому не стоит оценивать перо автора очень критично. И так приступим.
Для начала немного теории. PKGBUILD — это обычный текстовый файл с набором инструкций по сборке пакетов для арчеподобных дистрибутивов. На выходе мы должны получить пакет с расширением *.pkg.tar.xz. По сути это просто архив с установочными файлами пакетов и информацией об устанавливаемом пакете. с помощью PKGBUILD можно написать инструкцию по сборке пакета из *.deb, *.rpm, их исходников и даже просто из обычного архива файлов. Главное понимать что ты собираешься получить на выходе.
Скачиваем deb-пакет с сайта и помещаем его в отдельный каталог(для удобства).
рядом с файлом создаем текстовый файл и присваиваем ему имя PKGBUILD. готово!
открываем его в текстовом редакторе.
Итак. первая строка не обязательна и не несет какой-либо инструктивности, а просто говорит нам кто разработчик
идем далее
имя пакета,
здесь все подробно описано.
далее создадим типа «переменную» с именем ZVVOnlineTV
здесь скажу пару слов. Так как ОС линукс чувствительна к регистру, то нам нужно это дело как-то обозначить.
следующее
присваиваем актуальную версию программы,
так как имя скачанного файла ZVVOnlineTV2_1.deb, то нужно создать еще одну переменную.
присваиваем версию релиза.
добавляем описание
архитектуру.
и ссылку на источник.
указываем лицензию, я не знаю под какой лицензией разработчик распространяет это приложение. поэтому custom
далее определяем зависимости, которые необходимы для работы приложения, они есть на сайте разработчика
какие нужны зависимости, ищите в инструкциях разрабов или гуглением или посредством вылова ошибок при работе программы, — если вдруг начала ругаться, что не хватает какой-то библиотеки, значит это необходимая зависимость!!!)
Некоторые пакеты в арчеподобных системах называются немного иначе, но, думаю, кому надо, — разберется!
Идем далее
здесь мы показываем источник, из которого мы будем брать данные(файлы программы) для сборки, вот как раз сдесь нам и пригодятся наши переменные ${_pkgname} — это имя пакета ZVVOnlineTV, а ${_pkgver} — это его версия 2_1 использованная в имени файла, далее ставим точку и указываем расширение deb.
в source можно указать и url-ссылку на исходный файл, если их несколько то они перечисляются в кавычках через пробел:
здесь указывается контрольная сумма файла, подробнее в арчвики, если не знаете где ее взять, укажите в кавычках SKIP, вот так
Далее переходим непосредственно к сборке.
Когда начнется сборка, то в каталоге, где вы разместили файл 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.
прочитав до этого момента вы должны спросить, а когда же все-таки начнется сборка, и я отвечу, что для сборки пакета нужно открыть терминал в каталоге с этими файлами и запустить команду
после того как скрипт отработает его можно установить командой
где package_name имя вашего пакета, в данном случае zvvonlinetv-2.1-1-x86_64.pkg.tar.xz
Подробно описывать не буду, а опишу только некоторые отличия.
В файле README описана инструкция по установке и необходимые зависимости для работы программы.
итак отличие будет в том, что у нас будет 2 секции build(){} и package() {}
Порядок выполнения команд такой же как описано в README файле, единственное на что нужно обратить внимание, так это на строку
в связи с тем что команду make install нужно выполнять от суперпользователя, в скрипте нужно это указать, чтобы во время сборки была создана имитация рут-установки.
пример PKGBUILD`a
Напоследок несколько ключей для работы с makepkg
makepkg -i — собирает и устанавливает пакет,
makepkg -s — устанавливает завизимости и собирает пакет
makepkg -si — угадайте)))
makepkg -g — выдает контролюную сумму пакетов.
Про сборку из rpm-пакетов не буду вдаваться в подробности, единственное, что должен быть установлкен rpmextract/pkgextract.
складываем необходимые пакеты rpm в один каталог и создаем PKGBUILD примерно такого содержания, в source указываем имена нужных rpm-файлов
}
ЗЫ эта програма давно не поддерживается, 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 выложен просто как пример
Остались вопросы пишите в комментариях
Всем удачи, арчвики в помощь!)
8 комментариев
то есть он говорит, что в секции package() написана какая-то ересь, посмотрите в секцию и все станет на свои места
bash.org
bash.org
Будет установлено: 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…
Как побороть? Благодарю за внимание
bash.org