4.4. Создание патчей

Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены вызовом программы 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
	@${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure

Довольно часто бывают ситуации, когда портируемое программное обеспечение, особенно если основной платформой разработки является 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 данного порта.

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.