target: dependencies
command1
command2
No meu sistema (Mac OS X), make
parece exigir que os Makefiles tenham um caractere de tabulação antes do conteúdo de cada command
linha, ou ele gera um erro de sintaxe.
Isso é um aborrecimento ao criar ou editar Makefiles porque eu tenho meu editor configurado para ter todos os espaços o tempo todo.
Você pode fazer Makefiles válidos sem caracteres de tabulação?
Respostas:
Esta é uma peculiaridade / exigência de sintaxe
make
, não tem nada a ver com o Mac OS X. Infelizmente, não há nada que você possa fazer sobre isso se for usarmake
.Editar : GNU Make agora suporta um prefixo de receita personalizado. Veja esta resposta .
Você não é o primeiro a não gostar desse aspecto
make
. Para citar o Unix Haters 'Handbook :fonte
.RECIPEPREFIX
). Uma das respostas abaixo também menciona isso, e deve ser marcada como "correta" em vez da minha. stackoverflow.com/a/21920142Desde que esta pergunta foi feita originalmente, uma versão do GNU Make foi lançada que permite que você use algo diferente do Tabcaractere de prefixo. Do anúncio da lista de e-mails :
Este recurso foi adicionado no GNU Make 3.82, lançado em julho de 2010 (seis meses após a data original de venda desta pergunta). Como já se passaram três anos e mudanças desde então, é provável que outros sabores do Make tenham seguido o GNU Make.
fonte
Existe uma maneira complicada de ter um makefile válido sem guias.
Se você alterar seu makefile para ler:
Se vai funcionar. Se quiser em mais de uma linha, você pode fazer:
Confuso, mas funciona.
fonte
.RECIPEPREFIX
é provavelmente a melhor abordagem. Porém, como não tive vontade de fazer isso, acabei usando uma solução baseada nesta. Linha 1:,target:\
Linha 2: [recuo de quatro espaços] seguido por;command
Se você tem um vimrc em seu perfil, pode adicionar esta linha para evitar que o vim mude para espaços:
Eu também estava lutando com isso, e isso resolveu para mim. Espalhe a boa palavra!
fonte
Isso é suficiente para mim, se você quiser usar espaços
Exemplo
fonte
.RECIPEPREFIX
que "Se a variável estiver vazia (como está por padrão ), esse caractere é o caractere de tabulação padrão." Isso significa que a variável é definida por padrão. É confirmado usandoifeq ($(origin .RECIPEPREFIX), undefined)
. Porque+=
anexar um único espaço e o rhs ao lhs,var +=
definevar
para um único espaço (mais uma string vazia), desde quevar
já tenha sido definido. (Sevar
não estiver definido,+=
é o mesmo que=
.)No modo de inserção do vim, pode-se usar
Ctrl-v <TAB>
para inserir uma tabulação literal, mesmo se você configurou a tecla tab para inserir espaços. Isso não responde à sua pergunta, é claro, mas pode ser uma alternativa aos métodos disponíveis para evitar a necessidade de guias literais.fonte
Se estiver usando o EditorConfig , você pode adicionar as seguintes linhas ao seu
.editorconfig
arquivo para forçar o IDE a usar tabulação para recuo em vez de espaços emMakefile
:fonte
Até GNU Make 4.2
A resposta de Steven Penny funciona.
O motivo pelo qual isso funciona é descrito em meu comentário .
Desde GNU Make 4.3 (lançado em 19 de janeiro de 2020)
O comportamento do
+=
operador foi alterado de maneira incompatível com versões anteriores. Se o operando esquerdo tiver um valor vazio, um espaço não será mais adicionado.Você pode usar
, onde
<space>
está um único espaço. Embora$(.RECIPEPREFIX)
seja expandido como um valor vazio, isso é necessário para não permitir que o GNU Make ignore<space>
. Observe que este código funciona até mesmo no GNU Make anterior à versão 4.3.fonte
no ubuntu: vi Makefiles substitui espaço por tab (ou qualquer outra coisa que você quiser):
Por exemplo, substitua 8 espaços por tabulação:
Atenção: ^ Eu insiro com a tecla tab, não ^ e I caracteres: D
fonte
Não portável. Certos sabores de make requerem absolutamente caracteres de tabulação. Mais uma razão para preferir tabulações a espaços :-)
fonte