Делаем pkgsrc для multiwatch
Содержание
Заготовка
В файл Makefile
будущего pkgsrc прописываем:
# $NetBSD$
PKGNAME= multiwatch
DISTNAME= ${PKGNAME}-1.0.0
MASTER_SITES= ${MASTER_SITE_GITHUB:=lighttpd/}
#PKGREVISION= 1
CATEGORIES= net
GITHUB_TAG= afc537d3454bc1fcb046ba118a1ca384e083e1c9
MAINTAINER= vladimir@stupin.su
HOMEPAGE= https://redmine.lighttpd.net/projects/multiwatch/wiki
COMMENT= Multiwatch forks multiple instance of one application and keeps them running
LICENSE= mit
USE_LANGUAGES= c
.include "../../mk/bsd.pkg.mk"
Заполним файл DESCR
описанием, взятым с официальной страницы проекта:
Multiwatch forks multiple instance of one application and keeps them running;
it is made to be used with spawn-fcgi, so all forks share the same fastcgi
socket (no webserver restart needed if you increase/decrease the number of
forks), and it is easier than to setup multiple daemontool supervised instances.
Создадим пока что пустой файл PLIST
:
# touch PLIST
Скачаем архив с исходными текстами, посчитаем и запишем в файл distinfo
хэш-суммы скачанного архива:
# make distinfo
Сборка
Попробуем выполнить сборку из исходных текстов:
# make
Сборка завершится ошибкой - не найден файл Makefile
в исходных текстах:
===> Building for multiwatch
make: cannot open Makefile.
make: stopped in /usr/pkgsrc/net/multiwatch/work/multiwatch-afc537d3454bc1fcb046ba118a1ca384e083e1c9
*** Error code 2
Stop.
make[1]: stopped in /usr/pkgsrc/net/multiwatch
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Использование GNU Autotools
В исходных текстах есть файлы configure.ac
и Makefile.am
, а это значит, что для сборки проекта нужно использовать пакет GNU Autotools. Допишем в наш Makefile
дополнительные утилиты в качестве сборочных зависимостей и дополнительную цель - для появления скрипта configure
его нужно сгенерировать с помощью утилиты autoreconf
:
USE_TOOLS+= autoconf automake autoreconf
GNU_CONFIGURE= yes
pre-configure:
set -e; cd ${WRKSRC} && autoreconf -fi
Попробуем собрать снова:
# make clean build
На этот раз выходят сообщения об устаревших и неопределённых макросах autoconf
:
===> Configuring for multiwatch
set -e; cd /usr/pkgsrc/net/multiwatch/work/multiwatch-afc537d3454bc1fcb046ba118a1ca384e083e1c9 && autoreconf -fi
WARNING: 'aclocal' is missing on your system. You should only need it if
you modified 'acinclude.m4' or 'configure.ac'. You might want
to install the Automake and Perl packages. Grab them from
any GNU archive site.
configure.ac:7: warning: The macro 'AC_CONFIG_HEADER' is obsolete.
configure.ac:7: You should run autoupdate.
./lib/autoconf/status.m4:719: AC_CONFIG_HEADER is expanded from...
configure.ac:7: the top level
configure.ac:9: error: possibly undefined macro: AM_INIT_AUTOMAKE
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:20: error: possibly undefined macro: AC_DEFINE
configure.ac:21: error: possibly undefined macro: AC_MSG_ERROR
autoreconf: error: /usr/pkg/bin/autoconf failed with exit status: 1
*** Error code 1
Stop.
make[1]: stopped in /usr/pkgsrc/net/multiwatch
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Поиски проблемы в интернете приводят на совет запустить autoupdate -f
. Меняем в Makefile
строчку с утилитами и добавляем в цель pre-configure запуск autoupdate -f:
pre-configure:
set -e; cd ${WRKSRC} && autoupdate -f && autoreconf -fi
Снова пробуем выполнить сборку:
# make clean build
На этот раз сборка продолжается дальше, но прерывается из-за отсутствия зависимостей:
checking pkg-config is at least version 0.9.0... no
checking for glib-2.0 >= 2.16.0... no
configure: error: "glib-2.0 >= 2.16.0 not found"
*** Error code 1
Stop.
make[1]: stopped in /usr/pkgsrc/net/multiwatch
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Добавляем зависимости
Добавляем в Makefile
утилиту pkg-config
, которая умеет искать библиотеки-зависимости:
USE_TOOLS+= autoconf automake autoreconf pkg-config
И предпоследней строчкой добавляем зависимость от библиотеки glib2
:
.include "../../devel/glib2/buildlink3.mk"
Снова пробуем выполнить сборку:
# make clean build
Не хватает ещё одной зависимости - библиотеки libev
:
checking for vfork.h... no
checking for ev.h... no
configure: error: "ev.h not found"
*** Error code 1
Stop.
make[1]: stopped in /usr/pkgsrc/net/multiwatch
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Добавляем в Makefile
ещё одну зависимость:
.include "../../devel/libev/buildlink3.mk"
Снова пытаемся выполнить сборку:
# make clean build
На этот раз сборка завершается успешно.
Сборка пакета
Попробуем сформировать пакет из результатов сборки и установки программы в промежуточный каталог:
# make package
На этот раз выходит ошибка об отсутствии результатов сборки в файле PLIST
:
=> Checking file-check results for multiwatch
ERROR: ************************************************************
ERROR: The following files are in /usr/pkgsrc/net/multiwatch/work/.destdir/usr/pkg but not in the PLIST:
ERROR: /usr/pkgsrc/net/multiwatch/work/.destdir/usr/pkg/bin/multiwatch
ERROR: /usr/pkgsrc/net/multiwatch/work/.destdir/usr/pkg/man/man1/multiwatch.1
*** Error code 1
Stop.
make[1]: stopped in /usr/pkgsrc/net/multiwatch
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Кроме выполняемого файла и страницы руководства я хочу добавить в пакет файл лицензии COPYING
под именем LICENCE
и файл README.rst
, поэтому добавлю в файл Makefile
дополнительные строчки:
INSTALLATION_DIRS= share/doc/${PKGBASE}
post-install:
${INSTALL_DATA} ${WRKSRC}/COPYING ${DESTDIR}${PREFIX}/share/doc/${PKGBASE}/LICENSE
${INSTALL_DATA} ${WRKSRC}/README.rst ${DESTDIR}${PREFIX}/share/doc/${PKGBASE}/
Выполним сборку пакета снова:
# make clean package
Запишем актуальный список устанавливаемых файлов в файл PLIST
:
# make print-PLIST > PLIST
И соберём пакет:
# make package
Пакет собрался в файл, где вместо версии фигурирует название пакета:
=> Creating binary package /usr/pkgsrc/packages/All/multiwatch-multiwatch.tgz
Исправим это.
Исправление имени пакета
Не знаю, как это объясняется, но надо просто поменять значения у переменных DISTNAME
и PKGNAME
в Makefile
:
DISTNAME=multiwatch
PKGNAME=${DISTNAME}-1.0.0
Снова пробуем собрать пакет:
# make clean package
На этот раз сборка обрывается на этапе проверки хэш-сумм, т.к. изменилось имя файла с архивом исходных текстов:
checksum: No checksum recorded for multiwatch-afc537d3454bc1fcb046ba118a1ca384e083e1c9.tar.gz
ERROR: Make sure the Makefile and checksum file (/usr/pkgsrc/net/multiwatch/distinfo)
ERROR: are up to date. If you want to override this check, type
ERROR: "/usr/bin/make NO_CHECKSUM=yes [other args]".
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/multiwatch
Исправим это, пересчитав хэш-суммы архивов с исходными текстами, и попробуем собрать пакет снова:
# make distinfo clean package
Видим, что обнаружено несоответствие с PLIST
. В прошлый раз в качесте значения переменной PKGBASE
использовалось значение multiwatch-1.0.0
. Обновим файл PLIST
и соберём пакет снова:
# make print-PLIST
# make clean package
На этот раз пакет собрался с именем multiwatch
и версией 1.0.0
, как и задумывалось.