Делаем 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, как и задумывалось.