4.4. Создание патчей
Пред. | Глава 4. Медленное портирование | След.

## 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` данного порта.

Пред. | Наверх | След.
4.3. Модификация порта | Начало | 4.5. Конфигурирование

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

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