Você pode imprimir variáveis à medida que o makefile é lido (assumindo que o GNU make tenha marcado essa pergunta adequadamente) usando este método (com uma variável chamada "var"):
$(info $$var is [${var}])
Você pode adicionar essa construção a qualquer receita para ver o que a marca passará para o shell:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
Agora, o que acontece aqui é que torna as lojas armazenam toda a receita ( $(info $$var is [${var}])echo Hello world
) como uma única variável expandida recursivamente. Quando make decide executar a receita (por exemplo, quando você manda construir all
), ela expande a variável e passa cada linha resultante separadamente para o shell.
Então, com detalhes dolorosos:
- Expande
$(info $$var is [${var}])echo Hello world
- Para fazer isso, ele primeiro se expande
$(info $$var is [${var}])
$$
torna-se literal $
${var}
torna-se :-)
(digamos)
- O efeito colateral é o que
$var is [:-)]
aparece na saída padrão
- A expansão do
$(info...)
pensamento está vazia
- Make fica com
echo Hello world
- Faça impressões
echo Hello world
no stdout primeiro para que você saiba o que ele solicitará ao shell
- O shell é impresso
Hello world
no stdout.
De acordo com o manual GNU Make e também apontado por 'bobbogo' na resposta abaixo, você pode usar informações / aviso / erro para exibir texto.
Para imprimir variáveis,
'error' interromperia a execução do make , depois de mostrar a string de erro
fonte
de um "Mr. Make post" https://www.cmcrossroads.com/article/printing-value-makefile-variable
Adicione a seguinte regra ao seu Makefile:
Então, se você deseja descobrir o valor de uma variável makefile, apenas:
e retornará:
fonte
Se você simplesmente deseja alguma saída, deseja usar
$(info)
por si só. Você pode fazer isso em qualquer lugar do Makefile e ele será exibido quando a linha for avaliada:Produzirá
VAR="<value of VAR>"
sempre que criar processos nessa linha. Esse comportamento depende muito da posição; portanto, você deve garantir que a$(info)
expansão ocorra APÓS tudo o que possa ser modificado$(VAR)
já aconteceu!Uma opção mais genérica é criar uma regra especial para imprimir o valor de uma variável. De um modo geral, as regras são executadas depois que as variáveis são atribuídas, e isso mostra o valor que está realmente sendo usado. (Porém, é possível que uma regra altere uma variável .) A boa formatação ajudará a esclarecer como uma variável está definida e a
$(flavor)
função informará que tipo de variável é algo. Então, nesta regra:$*
expande para a raiz que o%
padrão corresponde à regra.$($*)
expande para o valor da variável cujo nome é dado por por$*
.[
e]
claramente delinear a expansão variável. Você também pode usar"
e"
ou similar.$(flavor $*)
informa qual é o tipo de variável. NOTA:$(flavor)
recebe um nome de variável e não sua expansão. Então, se você dizmake print-LDFLAGS
, recebe$(flavor LDFLAGS)
, e é isso que você deseja.$(info text)
fornece saída. Faça impressõestext
em stdout como efeito colateral da expansão. A expansão do$(info)
pensamento está vazia. Você pode pensar assim@echo
, mas o mais importante é que não usa o shell, portanto, não precisa se preocupar com as regras de citação do shell.@true
existe apenas para fornecer um comando para a regra. Sem isso, make também produziráprint-blah is up to date
. Eu sinto que@true
deixa mais claro que é para ser um não-op.Executando, você obtém
fonte
@echo $ (NDK_PROJECT_PATH) é a boa maneira de fazer isso. Eu não acho que o erro vem daí. Geralmente, esse erro aparece quando você digitou incorretamente a intenção: Acho que você tem espaços em que deveria ter uma guia.
fonte
Todas as versões de
make
exigem que as linhas de comando sejam recuadas com uma TAB (não espaço) como o primeiro caractere na linha. Se você nos mostrou a regra inteira, em vez de apenas as duas linhas em questão, poderíamos dar uma resposta mais clara, mas deve ser algo como:onde o primeiro caractere na segunda linha deve ser TAB.
fonte
Corra
make -n
; mostra o valor da variávelMakefile ...
Comando:
Resultado:
fonte
--just-print
é a mesma em vez de ExecuçãoIsso
makefile
irá gerar a mensagem de erro 'separador ausente':Há uma guia antes do
@echo "All done"
(embora adone:
regra e a ação sejam amplamente supérfluas), mas não antes do@echo PATH=$(PATH)
.O problema é que a linha de partida
all
deve ter dois pontos:
ou igual=
para indicar que é uma linha de destino ou uma linha de macro e não possui nenhuma, portanto o separador está ausente.A ação que ecoa o valor de uma variável deve estar associada a um destino, possivelmente um destino fictício ou PHONEY. E essa linha de destino deve ter dois pontos nela. Se você adicionar um
:
depoisall
no exemplomakefile
e substituir os espaços em branco à esquerda na próxima linha por uma guia, ele funcionará de maneira saudável.Você provavelmente tem um problema análogo próximo à linha 102 no original
makefile
. Se você mostrasse cinco linhas sem comentários e sem comentários antes das operações de eco que estão falhando, provavelmente seria possível concluir o diagnóstico. No entanto, como a pergunta foi feita em maio de 2013, é improvável que o problemamakefile
ainda esteja disponível agora (agosto de 2014), portanto, essa resposta não pode ser validada formalmente. Só pode ser usado para ilustrar uma maneira plausível pela qual o problema ocorreu.fonte
Não há necessidade de modificar o Makefile.
fonte
O problema é que o eco funciona apenas em um bloco de execução. ou seja, qualquer coisa após "xx:"
Portanto, qualquer coisa acima do primeiro bloco de execução é apenas inicialização, portanto, nenhum comando de execução pode ser usado.
Então crie um blocl de execução
fonte
Isso pode ser feito de uma maneira genérica e pode ser muito útil ao depurar um makefile complexo. Seguindo a mesma técnica descrita em outra resposta , você pode inserir o seguinte em qualquer makefile:
Então você pode simplesmente fazer "make print" para despejar o valor de qualquer variável:
fonte
Você pode criar uma regra de vars no seu arquivo make, assim:
Existem algumas maneiras mais robustas de despejar todas as variáveis aqui: gnu make: lista os valores de todas as variáveis (ou "macros") em uma execução específica .
fonte
Se você não quiser modificar o Makefile, poderá usar
--eval
para adicionar um novo destino e executar o novo destino, por exemplomake --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
Você pode inserir o caractere TAB necessário na linha de comando usando
CTRL-V, TAB
exemplo Makefile de cima:
fonte
make: *** missing separator. Stop.
make --eval='print-tests: ; @echo TESTS $(TESTS)' print-tests
se você usar o android make (mka)
@echo $(NDK_PROJECT_PATH)
não funcionará e fornecer erro,*** missing separator. Stop."
use esta resposta se você estiver tentando imprimir variáveis no android makeisso funcionou para mim
fonte
Eu geralmente echo com um erro se eu quiser ver o valor da variável. (Somente se você quiser ver o valor. Ele interromperá a execução.)
fonte