Делаем pkgsrc для WebDAV-сервера dave

Содержание

Заготовка

В качестве протопипа я взял pkgsrc lang/gitea. Создал начальный файл Makefile со следующим содержимым:

DISTNAME=       dave-0.5.0
MASTER_SITES=   ${MASTER_SITE_GITHUB:=micromata/}
#PKGREVISION=   1
CATEGORIES=     net
GITHUB_TAG=     v${PKGVERSION_NOREV}

MAINTAINER=     vladimir@stupin.su
HOMEPAGE=       https://github.com/micromata/dave/
COMMENT=        A totally simple and very easy to configure stand alone webdav server
LICENSE=        apache-2.0

.include "../../lang/go/go-module.mk"
.include "../../mk/bsd.pkg.mk"

Этого должно быть достаточно для скачивания архива с исходными текстами проекта.

Также создал файл DESCR, скопировав в него фрагмент из файла Readme.md проекта:

dave is a simple WebDAV server that provides the following features:

* Single binary that runs under Windows, Linux and OSX.
* Authentication via HTTP-Basic.
* TLS support - if needed.
* A simple user management which allows user-directory-jails as well as full admin access to all subdirectories.
* Live config reload to allow editing of users without downtime.
* A cli tool to generate BCrypt password hashes.

It perfectly fits if you would like to give some people the possibility to upload, download or share files with common tools like the OSX Finder, Windows Explorer or Nautilus under Linux (or many other tools).

The project name dave is an abbreviation for: Distributed Authoring and Versioning made easy.

Создадим пока пустой файл PLIST и обновим размеры и хэш-суммы архива с исходными текстами:

# touch PLIST
# make distinfo

Теперь сформируем файл с информацией о сторонних модулях go, используемых в программе:

# make show-go-modules > go-modules.mk

Добавим в Makefile дополнительную строчку перед последними двумя строчками файла:

.include "go-modules.mk"

И попробуем выполнить сборку:

# make

Решение проблемы с VCS

Сборка завершится с ошибкой следующего вида:

# cd /usr/pkgsrc; git status --porcelain
fatal: bad object HEAD
error obtaining VCS status: exit status 128
        Use -buildvcs=false to disable VCS stamping.
error obtaining VCS status: exit status 128
        Use -buildvcs=false to disable VCS stamping.
*** Error code 1

Stop.
make[1]: stopped in /usr/pkgsrc/net/dave
*** Error code 1

Stop.
make: stopped in /usr/pkgsrc/net/dave

Ошибка происходит из-за того, что в каталоге /usr/pkgsrc есть каталог .git и go, начиная с версии 1.18, пытается выставить у собранных файлов отметку времени, соответствующую последней фиксации в репозитори.

Для обхода проблемы добавим в файл Makefile две опции:

GOFLAGS+=               -buildvcs=false
MAKE_ENV+=              GOFLAGS=${GOFLAGS}

И попытаемся выполнить сборку снова:

# make

Сборка завершается успешно.

Сборка пакета

Пытаемся собрать пакет:

# make package

Сборка пакета завершается ошибкой, т.к. файлы, установленные в промежуточном каталоге, не упомянуты в файле PLIST:

=> Checking file-check results for dave-0.5.0
ERROR: ************************************************************
ERROR: The following files are in /usr/pkgsrc/net/dave/work/.destdir/usr/pkg but not in the PLIST:
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/bin/dave
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/bin/davecli
*** Error code 1

Stop.
make[1]: stopped in /usr/pkgsrc/net/dave
*** Error code 1

Stop.
make: stopped in /usr/pkgsrc/net/dave

Обновим файл PLIST:

# make print-PLIST > PLIST

Добавление файлов в пакет

Однако этот результат меня не совсем устраивает. Я хочу добавить в пакет пример файла конфигурации, текст лицензии и файл Readme.md под именем README.md. Также хочу разместить двоичный файл dave в каталоге sbin, поскольку это демон, хоть его и можно запустить с правами обычного пользователя. Для этого я добавлю в Makefile дополнительные строчки:

INSTALLATION_DIRS=      share/doc/${PKGBASE} share/examples/${PKGBASE} sbin

post-build:
        ${MV} ${DESTDIR}${PREFIX}/bin/${PKGBASE} ${DESTDIR}${PREFIX}/sbin/${PKGBASE}

post-install:
        ${INSTALL_DATA} ${WRKSRC}/LICENSE.txt ${DESTDIR}${PREFIX}/share/doc/${PKGBASE}/LICENSE
        ${INSTALL_DATA} ${WRKSRC}/Readme.md ${DESTDIR}${PREFIX}/share/doc/${PKGBASE}/README.md
        ${INSTALL_DATA} ${WRKSRC}/examples/config-sample.yaml ${DESTDIR}${PREFIX}/share/examples/${PKGBASE}/config.yaml

Снова выполним сборку пакета:

# make clean
# make package

В промежуточном каталоге снова есть файлы, не упомянутые в PLIST, а таке пропал файл dave из каталога bin, т.к. он переместился в каталог sbin:

=> Checking file-check results for dave-0.5.0
ERROR: ************************************************************
ERROR: The following files are in the PLIST but not in /usr/pkgsrc/net/dave/work/.destdir/usr/pkg:
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/bin/dave
ERROR: ************************************************************
ERROR: The following files are in /usr/pkgsrc/net/dave/work/.destdir/usr/pkg but not in the PLIST:
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/sbin/dave
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/share/doc/dave/LICENSE
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/share/doc/dave/README.md
ERROR:         /usr/pkgsrc/net/dave/work/.destdir/usr/pkg/share/examples/dave/config.yaml
*** Error code 1

Stop.
make[1]: stopped in /usr/pkgsrc/net/dave
*** Error code 1

Stop.
make: stopped in /usr/pkgsrc/net/dave

Снова обновим файл PLIST и попытаемся собрать пакет:

# make print-PLIST > PLIST
# make package

На этот раз сборка завершается удачно.

Проверка с помощью pkglint

Проверим подготовленные файлы на наличие ошибок:

# pkglint
WARN: DESCR:6: Line too long (should be no more than 80 characters).
WARN: DESCR:10: Line too long (should be no more than 80 characters).
WARN: DESCR:12: Line too long (should be no more than 80 characters).
ERROR: Makefile:1: Expected "# $NetBSD$".
WARN: Makefile:9: COMMENT should not begin with "A".
NOTE: Makefile:15: Variable values should be aligned with tabs, not spaces.
1 error, 4 warnings and 1 note found.
(Run "pkglint -e" to show explanations.)
(Run "pkglint -fs" to show what can be fixed automatically.)
(Run "pkglint -F" to automatically fix some issues.)

В файле DESCR нужно разбить строки длиннее 80 символов на несколько строк.

В начало файла Makefile нужно добавить строку # $NetBSD$, для выравнивания значений переменных использовать вместо пробелов табуляции, а комментарий к пакету не должен начинаться с неопределённого артикля A.

Снова проверяем подготовленные файлы:

# pkglint
Looks fine.

На этот раз всё выглядит прилично.