Коллекция портов FreeBSD - это способ, которым почти каждый устанавливает приложения («порты») на FreeBSD. Как и все остальное во FreeBSD, это в первую очередь волонтерская работа. Об этом важно помнить при чтении этого документа.

Во FreeBSD любой может представить новый порт или добровольно поддержать существующий необслуживаемый порт. Никаких специальных прав на фиксацию не требуется.

Для этого руководства я буду использовать fd инструмент, написанный Дэвидом Питером в качестве примера проекта.

Предпосылки

  • Установка FreeBSD (виртуальная машина в порядке)
  • Дерево локальных портов (выполняется через svn)
  • portlint (находится по адресу devel/portlint)
  • poudriere (находится по адресу _3 _) [необязательно]

Получение дерева портов

При установке FreeBSD откажитесь от дерева портов. Установите svn:

pkg install svn
svn checkout https://svn.freebsd.org/ports/head /usr/ports

Poudriere

Poudriere настоятельно рекомендуется для тестирования / упаковки и обеспечения качества ». Проект активно продвигает QA перед отправкой, и это помогает быстрее уложить вещи в дерево. Вам следует попробовать протестировать его хотя бы на одном производственном выпуске на `i386` и` amd64`. Отметьте арку порта как конкретную, если это ваш случай. Если вы решили использовать poudriere, используйте ZFS. Руководств по ​​этой теме предостаточно. FreeBSD Porter’s Handbook - наиболее полный источник информации о переносе на FreeBSD в целом.

Makefile

Весь процесс портирования в большинстве случаев сводится к написанию одного Makefile. Я рекомендую сделать что-то вроде этого.

Вот тот, который я написал для fd:

Заголовок

Порядок элементов здесь важен, portlint -AC поможет вам сделать это правильно. Если вам нужна помощь, вы можете посмотреть существующие порты. Заголовок - это всего одна строка:

# $FreeBSD$

Метаданные порта

У каждого порта должна быть одна основная категория, в случае fd это будет sysutils, поэтому он находится в /usr/ports/systuils/fd.

PORTNAME= fd
CATEGORIES= sysutils

Поскольку этот порт конфликтует с другой утилитой с именем fd, я указал суффикс пакета как: PKGNAMESUFFIX= -find и указал конфликт: CONFLICTS_INSTALL= fd-[0-9]*. Это означает, что для установки из пакетов пользователю нужно будет ввести:

pkg install fd-find

Лицензии

Этот раздел отличается для каждого порта, но в случае fd это довольно просто:

LICENSE= MIT APACHE20
LICENSE_COMB= dual

Поскольку fd включает текст лицензий, вам также следует сделать это:

LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT
LICENSE_FILE_APACHE20= ${WRKSRC}/LICENSE-APACHE

Файлы дистрибутива

FreeBSD требует, чтобы все порты допускали автономную сборку. Это означает, что вы указали, какие файлы необходимо загрузить. К счастью, теперь у нас есть помощники для загрузки исходников GitHub прямо с GitHub:

USE_GITHUB= yes
GH_ACCOUNT= sharkdp

Поскольку PORTNANE равно fd, он попытается загрузить исходники для sharkdp/fd. По умолчанию будет загружен тег: ${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}

fd использует v в качестве префикса, поэтому нам нужно указать: DISTVERSIONPREFIX= v.

Также можно указать GH_TAGNAME в случае, если имя тега не соответствует этому шаблону.

Дополнительные пакеты

Очень мало проектов rust, которые являются автономными и не используют зависимости от ящиков. Раньше это была PITA, чтобы он работал в автономном режиме, но теперь грузы - это первоклассный гражданин в портах:

USES= cargo
CARGO_CRATES= aho-corasick-0.6.3 \
              atty-0.2.3 \
              # and so goes on

Да, вы должны указать каждую зависимость. К счастью, есть волшебный awk сценарий, который превращает Cargo.lock в то, что вам нужно. Выполните make cargo-crates в корне порта. Это не удастся, потому что вам не хватает контрольной суммы для исходных файлов:

make makesum
make cargo-crates

Это даст вам то, что вам нужно. Дважды проверьте правильность результата. Есть способ игнорировать ошибку контрольной суммы, но я не могу вспомнить… Выполнить make makesum снова.

CARGO_OUT

Если. build.rs полагается на то, что вы должны это изменить. fd позволяет использовать SHELL_COMPLETIONS_DIR, чтобы указать, куда идут завершения, а ripgrep нет. В нашем случае мы просто указываем SHELL_COMPLETIONS_DIR:

SHELL_COMPLETIONS_DIR= ${WRKDIR}/shell-completions-dir CARGO_ENV= SHELL_COMPLETIONS_DIR=${SHELL_COMPLETIONS_DIR}

ПЛИСТ

FreeBSD очень строго относится к устанавливаемым файлам и не позволяет устанавливать случайные файлы, которые теряются. Вы должны указать, какие файлы вы устанавливаете. В данном случае их всего два:

PLIST_FILES= bin/fd \
             man/man1/fd.1.gz

Обратите внимание, что исходники для fd имеют несжатый файл man, а здесь он указан как сжатый. Если порт устанавливает много файлов, укажите их в pkg-plist, например, здесь. Чтобы их установить:

post-install:
  @${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/fd
  ${INSTALL_MAN}${WRKSRC}/doc/fd.1 ${STAGEDIR}${MAN1PREFIX}/man/man1

Завершение Shell

clap-rs может генерировать дополнения оболочки, обычно это выполняется build.rs скриптом. Во-первых, нам нужно определить параметры:

OPTIONS_DEFINE= BASH FISH ZSH # list options
OPTIONS_DEFAULT= BASH FISH ZSH # select them by default
BASH_PLIST_FILES= etc/bash_completion.d/fd.bash-completion 
FISH_PLIST_FILES= share/fish/completions/fd.fish
ZSH_PLIST_FILES= share/zsh/site-functions/_fd

Чтобы их установить:

post-install-BASH-on:
 @${MKDIR} ${STAGEDIR}${PREFIX}/etc/bash_completion.d
 ${INSTALL_DATA} ${SHELL_COMPLETIONS_DIR}/fd.bash-completion \
 ${STAGEDIR}${PREFIX}/etc/bash_completion.d
post-install-FISH-on:
 @${MKDIR} ${STAGEDIR}${PREFIX}/share/fish/completions
 ${INSTALL_DATA} ${SHELL_COMPLETIONS_DIR}/fd.fish \
 ${STAGEDIR}${PREFIX}/share/fish/completions
post-install-ZSH-on:
 @${MKDIR} ${STAGEDIR}${PREFIX}/share/zsh/site-functions
 ${INSTALL_DATA} ${SHELL_COMPLETIONS_DIR}/_fd \
 ${STAGEDIR}${PREFIX}/share/zsh/site-functions

Бонусный раунд

Исправление исходного кода

Иногда вам нужно исправить это и отправить патч вверх по течению. Объединение его в восходящий поток может занять некоторое время, поэтому вы можете исправить его как часть процесса установки. Простой способ сделать это:

  • Перейти в work/ каталог
  • Скопируйте файл, который хотите исправить, и добавьте к нему суффикс .orig
  • Отредактируйте файл, который хотите исправить
  • Выполнить make makepatch в корне порта

Отправка порта

Во-первых, убедитесь, что portlint -AC не выдает никаких ошибок или предупреждений. Во-вторых, убедитесь, что poudriere может построить его как на amd64, так и на i386. Если не получается - нужно либо исправить, либо пометить порт для этой арки как сломанный.

Следуйте этим шагам, как я делал шаги. Если у вас есть какие-либо вопросы, вы всегда можете задать свой вопрос на #freebsd-ports в freenode, прежде чем спрашивать, постарайтесь найти ответ в Справочнике носильщика.