Na preparação do port, arquivos que forem adicionados ou alterados podem ser gravados com diff(1) para posterior inclusão em um patch(1). Fazer isso com um arquivo típico envolve salvar uma cópia do arquivo original antes de fazer qualquer alteração usando um sufixo .orig
.
%
cp
file
file
.orig
Depois que todas as alterações forem realizadas, cd
de volta ao diretório do port. Execute make makepatch
para gerar arquivos de patch atualizados no diretório files
.
Usar BINARY_ALIAS
para substituir comandos codificados durante a compilação e para evitar patching de arquivos de compilação. Veja Seção 5.17, “Use BINARY_ALIAS
para Renomear Comandos Em Vez de Aplicar Patch na Compilação” para maiores informações.
Arquivos patch são armazenados em PATCHDIR
, geralmente files/
, de onde serão aplicados automaticamente. Todas os patches devem ser relativos ao WRKSRC
. Tipicamente WRKSRC
é um subdiretório de WRKDIR
, o diretório onde o distfile é extraído. Execute make -V WRKSRC
para ver o caminho real. Os nomes dos patches devem seguir estas regras:
Evite ter mais de um patch modificando o mesmo arquivo. Por exemplo, ter os dois patch-foobar.c
e patch-foobar.c2
fazendo alterações em ${WRKSRC}/foobar.c
torna-os frágeis e difíceis de serem depurados.
Ao criar nomes para arquivos de patch, substitua cada underline (_
) com dois underlines (__
) e cada barra (/
) com um underline (_
). Por exemplo, para corrigir um arquivo chamado src/freeglut_joystick.c
nomeie o patch correspondente patch-src_freeglut__joystick.c
. Não nomeie patches como patch-aa
ou patch-ab
. Sempre use o caminho e o nome do arquivo nos nomes dos patches. O make makepatch
gera automaticamente os nomes corretos.
Um patch pode modificar vários arquivos se as alterações estiverem relacionadas e o patch tiver o nome apropriado. Por exemplo, patch-add-missing-stdlib.h
.
Use apenas caracteres [-+._ a-zA-Z0-9]
para nomear patches. Em particular, não use ::
como um separador de path, use _
no lugar.
Minimize a quantidade de mudanças de espaço em branco não funcionais em patches. É comum no mundo Open Source para projetos compartilhar grandes quantidades de uma base de código, mas obedecer a regras de recuo e estilo diferentes. Ao usar uma funcionalidade funcional de um projeto para consertar áreas similares em outra, por favor, tenha cuidado: o patch resultante pode estar cheio de mudanças não-funcionais. Ele não só aumenta o tamanho do repositório do ports, mas torna difícil descobrir o que exatamente causou o problema e o que foi alterado em todos.
Se um arquivo precisar ser excluído, faça-o no target post-extract
em vez de como parte do patch.
A criação manual de patches geralmente não é necessária. A geração automática de patches, conforme descrito anteriormente nesta seção, é o método preferido. No entanto, patches manuais podem ser necessários ocasionalmente.
Patches são salvos em arquivos nomeados como patch-*
onde *
indica o nome do caminho do arquivo que está sendo feito o patch, como patch-imakefile
ou patch-src-config.h
.
Depois que o arquivo foi modificado, diff(1) é usado para registrar as diferenças entre a versão original e a modificada. -u
faz com que o diff(1) produza diffs “unificados”, a forma preferida.
%
diff -u
file
.origfile
> patch-pathname-file
Ao gerar patches para novos arquivos adicionados, -N
é usado para dizer ao diff(1) para tratar o arquivo original inexistente como se existisse, mas estava vazio:
%
diff -u -N
newfile
.orignewfile
> patch-pathname-newfile
Não adicione Strings RCS $FreeBSD: head/pt_BR.ISO8859-1/books/porters-handbook/book.xml 53158 2019-06-16 14:52:21Z dbaio $
em patches. Quando os patches são adicionados ao repositório Subversion com svn add
, a propriedade fbsd:nokeywords
é definida para yes
automaticamente para que as keywords no patch não sejam modificadas no commit. A propriedade pode ser adicionada manualmente svn propset fbsd:nokeywords yes
.files...
Usar a opção (-r
) do diff(1) para gerar patches é razoável, mas por favor, analise os patches resultantes para se certificar de que não há nenhum lixo desnecessário neles. Em particular, diffs entre dois arquivos de backup, quando o port usa Imake
ou GNU configure
, etc., diffs de Makefile
s são desnecessários e devem ser eliminados. Se for necessário editar o configure.in
e executar o autoconf
para regerar o configure
, não gere diffs do configure
(ele geralmente cresce para algumas milhares de linhas!). Em vez disso, defina USES=autoreconf
e gere os diffs no configure.in
.
Substituições simples podem ser realizadas diretamente do Makefile
do port usando o modo in-loco do sed(1). Isso é útil quando as alterações usam o valor de uma variável:
post-patch: @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
Muitas vezes, o software sendo portado usa a convenção CR/LF nos arquivos fonte. Isso pode causar problemas com correções adicionais, avisos do compilador ou execução de scripts (como /bin/sh^M não encontrado
.) Para converter rapidamente todos os arquivos de CR/LF para apenas LF, adicione essa entrada ao Makefile
do port:
USES= dos2unix
Uma lista de arquivos específicos para conversão pode ser informada:
USES= dos2unix DOS2UNIX_FILES= util.c util.h
Use DOS2UNIX_REGEX
para converter um grupo de arquivos em subdiretórios. Seu argumento é um find(1) compatível com expressão regular. Mais sobre o formato está em re_format(7). Esta opção é útil para converter todos os arquivos de uma determinada extensão. Por exemplo, converta todos os arquivos de código-fonte, deixando os arquivos binários intactos:
USES= dos2unix DOS2UNIX_REGEX= .*\.([ch]|cpp)
Uma opção similar é DOS2UNIX_GLOB
, que executa o find
para cada elemento listado nele.
USES= dos2unix DOS2UNIX_GLOB= *.c *.cpp *.h
O diretório base para a conversão pode ser definido. Isso é útil quando há vários distfiles e vários arquivos contidos que requerem conversão de fim de linha.
USES= dos2unix DOS2UNIX_WRKSRC= ${WRKDIR}
Alguns ports precisam de patches que são aplicados apenas para versões específicas do FreeBSD ou quando uma determinada opção é ativada ou desativada. Os patches condicionais são especificados colocando-se os caminhos completos para os arquivos de patch emEXTRA_PATCHES
.
.include <bsd.port.options.mk> # Patch in the iconv const qualifier before this .if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069 EXTRA_PATCHES= ${PATCHDIR}/extra-patch-fbsd10 .endif .include <bsd.port.mk>
Quando um option requer um patch, use
e opt
_EXTRA_PATCHES
para fazer o patch condicional na opção opt
_EXTRA_PATCHES_OFF
. Veja Seção 5.13.3.11, “Substituição de Variáveis Genéricas, opt
e OPT
_VARIABLE
” Para maiores informações.OPT
_VARIABLE
_OFF
OPTIONS_DEFINE= FOO BAR FOO_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-foo BAR_EXTRA_PATCHES_OFF= ${PATCHDIR}/extra-patch-bar.c \ ${PATCHDIR}/extra-patch-bar.h
EXTRA_PATCHES
Com um DiretórioAs vezes, existem muitos patches que são necessários para um recurso, neste caso, é possível apontar EXTRA_PATCHES
para um diretório, e ele aplicará automaticamente todos os arquivos nomeados como patch
nele.*
Crie um subdiretório em ${PATCHDIR}
, e mova os patches para ele. Por exemplo:
%
ls -l
-rw-r--r-- 1 root wheel 350 Jan 16 01:27 patch-Makefile.in -rw-r--r-- 1 root wheel 3084 Jan 18 15:37 patch-configurefiles/foo-patches
Então adicione isso ao Makefile
:
OPTIONS_DEFINE= FOO FOO_EXTRA_PATCHES= ${PATCHDIR}/foo-patches
O framework irá então usar todos os arquivos nomeados patch
nesse diretório.*
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.