Коллекция портов 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, прежде чем спрашивать, постарайтесь найти ответ в Справочнике носильщика.