WRKDIR
infrastructure/bin. Они предназначены для упрощения
процесса создания новых портов:
make lib-depends-check с целью
проверки shared libraries зависимостей.
make update-patches, который
всегда должен использоваться для обновления/регенерации патчей.
make update-plist.
Этот скрипт позаботится о аккуратности packing-lists. OpenBSD packing-lists
значительно отличаются от своих сородичей из других проектов BSD, отчасти
потому, что packaging инструменты в ней были полностью переписаны.
infrastructure/bin, если вы ищете другие полезные
скрипты. Для большинства из них есть man-страницы.
${VAR:U} и ${VAR:L} для преобразования значения
переменной в верхний или нижний регистр. Другими словами, make test может
быть запущен независимо от регистра. Например:
.if ${NEED_XXX:L} == "yes"
do stuff if yes
.else
do other stuff
.endif
Теоретически, все bool-переменные, распознаваемые bsd.port.mk,
всегда должны быть определены, поэтому в констукциях кода наподобее
defined(USE_FOO) нет необходимости, и
${USE_FOO:L} != "no" должен работать.
Основной файл bsd.port.mk был сильно оптимизирован и исправлен.
В частности, он может выполнять задачи параллельно.
Из-за этого была утрачена функция scripts/{pre,do,post}-*.
Чтобы снова воспользоваться этой функцией, запустите скрипт вручную из
Makefile.
make VAR=value), присваиваемое значение параметра
переопределяет/перезаписывает значение, которое присваивается VAR
из Makefile.
Это означает, что нет необходимости в множестве патчей для Makefile.
Гораздо лучше правильно установить значение MAKE_FLAGS,
что к тому же снизит и maintanance нагрузку.
DISTFILES и
PATCHFILES.
OpenBSD обрабатывает их одинаковым способом и по умолчанию загружает все
из MASTER_SITES. Здесь нет ни PATCH_SITES,
ни PATCH_SITES_SUBDIR.
Если все загружаемые файлы не принадлежат одному и тому же набору сайтов,
OpenBSD разрешает расширение filename:0 до filename:9,
и в этом случае для извлечения файлов будет использоваться
MASTER_SITES0 вплоть до MASTER_SITES9.
Некоторым платформам могут понадобиться специфичные distfiles.
В прошлом это вызывало проблемы, связанные с зеркалированием distfiles.
Теперь же OpenBSD поддерживает третий набор файлов: SUPDISTFILES.
Они используются только для создания checksums и для зеркалирования
(mirroring). Обратите внимание, что SUPDISTFILES может
перекрываться DISTFILES или PATCHFILES.
Например:
DISTFILES=foo-1.0.tgz
.if ${ARCH} == "i386"
DISTFILES+=foo-i386.tgz
.elif ${ARCHI} == "amd64"
DISTFILES+=foo-amd64.tgz
.endif
SUPDISTFILES=foo-i386.tgz foo-amd64.tgz
WRKDIRNO_WRKDIR.
Все порты OpenBSD должны иметь рабочий каталог.
Детали, касательно имени рабочего каталога, не должны вызывать беспокойства
у того, кто собирает порт. Если вам нужно узнать об этом имени, спросите
Makefile:
$ cd that_ports_dir && make show=WRKDIRЭта команда покажет значение
WRKDIR (т.е. имя рабочего
каталога) порта.
Основная причина этого запрета заключается в том, что bsd.port.mk
в OpenBSD действует как настоящий Makefile с зависимостями.
Этап fetch зависит от distfiles и patchfiles, а все остальные
этапы зависят от реальных файлов, находящихся в рабочем каталоге, поэтому
они не могут существовать без рабочего каталога.
Если DISTFILES extraction является особенным, установите
EXTRACT_ONLY=и сделайте extraction на этапе
post-extract..
WRKDIRWRKDISTWRKDIR, куда фактически распаковывается порт.
Это также базовый каталог для патча.
Другие BSD в настоящее время не имеют WRKDIST/WRKSRC различий
и имеют только WRKSRC.WRKSRCWRKDIST, в котором фактический находятся исходники.WRKBUILDWRKDIR, в котором будут выполняться конфигурирование
и сборка порта.
Другие BSD не имеют WRKBUILD/WRKSRC различий.
Программы, основанные на autoconf (в основном), обычно могут установить
SEPARATE_BUILD, чтобы позволить сборке порта происходить в
WRKBUILD, отличном от WRKSRC.WRKCONFWRKDIR, в котором должны запускаться configure скрипты.
По умолчанию используется WRKBUILD, что в 99% случаев верно.WRKINST
Обратите внимание, что NO_WRKSUBDIR был удален: теперь этот же эффект
можно достигнуть установив WRKDIST=$(WRKDIR).
PREFIX, обычно это /usr/local).
WRKINST,
который обычно является подкаталогом WRKDIR.
-B.
make fake, являются обычными целями для
установки, за исключением нескольких отличий:
MAKE_FLAGS используется FAKE_FLAGS.
По умолчанию FAKE_FLAGS устанавливает DESTDIR=${WRKINST}.
INSTALL_TARGET используется FAKE_TARGET.
{pre,do,post}-install, значение
TRUEPREFIX установлено как $(PREFIX),
PREFIX установлено как $(WRKINST)$(PREFIX), а
DESTDIR установлено как $(WRKINST).
Порты, использующие imake, должны работать как и обычно, поскольку цели imake
настроены на использование DESTDIR. Точно так же недавние порты
конфигурации GNU не нуждаются ни в каких изменениях.
Еще один хороший прием - "late binding" («поздняя привязка»): настройте порты на
использование prefix со значением $(DESTDIR)/usr/local, чтобы
получившийся Makefile имел следующую конфигурацию:
prefix=$(DESTDIR)/usr/localКогда порт начинает собираться при пустом значении
DESTDIR,
будет использоваться /usr/local.
Fake установка поместит все в ${WRKINST}/usr/local (например, для
GNU configure используйте CONFIGURE_STYLE= gnu dest).
DESTDIR:
для бОльшей части порта это не будет проблемой, за исключением одного или двух
нарушителей. Исправьте проблему (Patch the problem away).
TRUEPREFIX.
bsd.port.mk заметит проблемы в этой области.
$(DESTDIR) на этапе
настройки. Тут понадобится post-configure, который добавляет
DESTDIR настройки во все Makefile-файлы.
pre-fake,
чтобы слинковать или скопировать все, что порт хочет найти в WRKINST,
затем выполните install в chroot.
@exec или скрипты
INSTALL не нужны.
Обратите внимание, что все ненужные скрипты должны быть заблокированы, так как они имеют проблемы с масштабируемостью. Гораздо проще отлаживать инфраструктуру одного пакета, чем модифицировать сотни скриптов для решения новых проблем. Например:
@exec ldconfig не нужен, поскольку shared libraries упоминаются
как @lib libfoo.so.1.0, а ldconfig запускается
только при необходимости и корректно обрабатывает chroot.
@exec install-info не нужен, поскольку файлы документации info
упоминаются как @info file.info. Благодаря этому нет проблем и
с составными info файлами, а также отпадает необходимость в запуске
makeinfo --no-split.
@font и @fontdir.
@newuser
и @newgroup вместо installation скриптов.
Они создаются достаточно рано, чтобы их можно было использовать в процессе
дальнейшего extraction пакета.
@tag,
который запускает такие инструменты как update-desktop-database
в конце установки.
@sample
вместо installation скриптов.
Прочитайте pkg_create(1), где
содержится более подробная информация по этой теме.
В большинстве случаев, make update-plist создаст очень хорошую
приблизительную картину того, что должно быть в packing-list и скопирует настройки
из одной версии в другую (следующую).
FLAVORS в качестве списка
всех параметров, которые имеют смысл для этого порта (например,
FLAVORS=foo bar zoinx), а затем использовать FLAVOR,
чтобы проверить, какие параметры фактически были выбраны (например,
FLAVOR=zoinx foo).
bsd.port.mk предоставляет тут некоторую поддержку:
PKGNAME настроен для включения опций, разделенных дефисом
(например, package-foo-zoinx).
WRKDIR настроен таким образом, что различные flavors могут
собираться одновременно, не мешая при этом друг другу.
%%flavor%% вызовут включение PFRAG.flavor.
bsd.port.subdir.mk понимает расширение
SUBDIR=directory,opt1,opt2 и интерпретирует его как «надо
собрать порт в directory с FLAVOR=opt1 opt2».
Проверить, что тот или иной flavor был выбран для сбоки, можно следующим образом:
.if ${FLAVOR:Mzoinx}
Существует дополнительное расширение, известное как MULTI_PACKAGES.
Вообще говоря, MULTI_PACKAGES и FLAVORS являются
противоположными механизмами.
Вместе их количество в дереве портов OpenBSD несколько меньше, чем в другиех BSD,
поскольку они позволяют из одного порта создавать много разных пакетов.
bsd.port.mk(5) имеет
целый раздел,
посвященный FLAVORS и MULTI_PACKAGES.