Файлы, которые добавлялись или изменялись в процессе создания
порта, могут быть выявлены вызовом программы diff(1),
а результат работы этой программы может быть в дальнейшем передан
программе patch(1). Каждый патч, который вы собираетесь
применить, должен быть сохранен в файл с именем
patch-*
, где
*
обозначает путь к файлу, к которому
применяется патч, такой как
patch-Imakefile
или
patch-src-config.h
. Эти файлы должны находиться в
каталоге PATCHDIR
(как правило, это files/
),
откуда они будут взяты автоматически. Все патчи обязаны быть сделаны
относительно каталога WRKSRC
(как правило,
это каталог, в который распаковывается исходный архив и где будет
выполняться построение). Для упрощения внесения изменений и
обновлений вы должны избегать наличия более чем одного патча для
одного и того же файла (например, патчей
patch-file
и patch-file2
,
оба меняющих файл WRKSRC/foobar.c
).
Обратите внимание, что если путь к изменяемому файлу содержит символ
подчеркивания (_
), то патч должен содержать в своем
имени два подчеркивания вместо одного. Например, для применения патча
на файл с именем src/freeglut_joystick.c
соответствующий патч следует назвать
patch-src-freeglut__joystick.c
.
Пожалуйста, используйте для именования ваших патчей только символы
[-+._a-zA-Z0-9]
. Не используйте любые другие
символы, кроме этих. Не называйте ваши патчи как
patch-aa
или patch-ab
и
так далее, всегда ссылайтесь на путь и название файла в названиях
патчей.
Не помещайте строки RCS в патчи. SVN будет изменять их при
помещении файлов в дерево портов, и когда мы будем их оттуда
извлекать, они будут уже другие, поэтому применение патчей
окончится неудачей. Строчки RCS предваряются знаком доллара
($
), и обычно начинаются с
$Id
или
$RCS
.
Использование параметра рекурсии (-r
) с командой
diff(1) для генерации патчей - это хорошо, но всё же,
пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в
отсутствии ненужного мусора. В частности, diff-разниц между двумя
резервными копиями файлов, файлы Makefile
, когда
как порт использует Imake
или
GNU-версию программы configure
, и так далее,
не нужны, и должны быть удалены. Если вы отредактировали файл
configure.in
и запустили
autoconf
для перегенерации
configure
, не нужно включать файлы diff для
configure
(они частенько вырастают до нескольких
тысяч строк!); задайте USE_AUTOTOOLS=autoconf:261
и
включите diff-файл для configure.in
.
Также постарайтесь минимизировать в ваших патчах объем нефункциональных изменений с пустыми символами. В мире Открытого Исходного Кода является распространенным совместное использование проектами больших объемов кодовой базы, но с различными стилями и правилами отступов. Если вы берете работающую функциональную часть из одного проекта для исправления похожей области в другом, то будьте аккуратны, пожалуйста: получаемый однострочный патч может быть полон нефункциональных изменений. Это не только увеличивает размер репозитория SVN, но также усложняет поиск того, что конкретно вызвало проблему и что вы вообще изменили.
Если вам нужно удалить файл, то вы можете сделать это при
выполнении цели post-extract
вместо того,
чтобы оформлять это как часть патча.
Простые перемещения могут быть выполнены непосредственно из
Makefile
порта с использованием sed(1) в
режиме in-place. Это очень удобно, когда вам нужно применить патч
на значение переменной. Пример:
post-patch: @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
Довольно часто бывают ситуации, когда портируемое программное
обеспечение, особенно если основной платформой разработки является
Windows®, использует конвенцию CR/LF для большинства своих исходных
файлов. Это может быть причиной проблем с дальнейшей упаковкой,
предупреждениями компилятора, выполнением скриптов
(/bin/sh^M
not found) и так далее. Для быстрой
преобразования всех файлов из CR/LF просто в LF добавьте
USE_DOS2UNIX=yes
в Makefile
порта. Может быть указан перечень преобразуемых файлов:
USE_DOS2UNIX= util.c util.h
Если вы хотите преобразовать группу файлов в разных подкаталогах,
то для этого можно использовать DOS2UNIX_REGEX
.
Его параметром является регулярное выражение, совместимое с
find
. Подробнее о формате в re_format(7).
Эта опция используется для преобразования всех файлов заданного
расширения, к примеру всех исходных файлов, не затрагивая двоичные
файлы:
USE_DOS2UNIX= yes DOS2UNIX_REGEX= .*\.(c|cpp|h)
Если вы хотите создать патч на основе существующего файла, то вы
можете его скопировать с расширением .orig
, а
затем изменить исходный. Цельmakepatch
запишет соответствующий файл с патчем в каталог
files
данного порта.
Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.