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
WRKDIR
NO_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.
.
WRKDIR
WRKDIST
WRKDIR
, куда фактически распаковывается порт.
Это также базовый каталог для патча.
Другие BSD в настоящее время не имеют WRKDIST/WRKSRC
различий
и имеют только WRKSRC
.WRKSRC
WRKDIST
, в котором фактический находятся исходники.WRKBUILD
WRKDIR
, в котором будут выполняться конфигурирование
и сборка порта.
Другие BSD не имеют WRKBUILD/WRKSRC
различий.
Программы, основанные на autoconf (в основном), обычно могут установить
SEPARATE_BUILD
, чтобы позволить сборке порта происходить в
WRKBUILD
, отличном от WRKSRC
.WRKCONF
WRKDIR
, в котором должны запускаться 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.