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