É possível exibir variáveis fora das regras usando o GNU Make?
Considere o seguinte Makefile:
x = foo bar baz
ifdef x
@echo $(x)
endif
Isto resulta emMakefile:4: *** commands commence before first target. Stop.
No entanto, se eu adicionar uma regra, funciona:
x = foo bar baz
ifdef x
t:
@echo $(x)
endif
É realmente necessário adicionar regras para saída de variáveis para depuração, etc.?
Bônus:
Por que a remoção de ifdef
resulta em Makefile:3: *** missing separator. Stop.
?
x = foo bar baz
@echo $(x)
Responder1
ehm, possível, mas inútil.
Você deve entender que um Makefile não é como um shell script. Um Makefile especifica alvos e o que deve ser feito para torná-los alvos. Se você tiver isso em mente, a execução de um comando espúrio no Makefile se torna um problema conceitual. Quando esse comando será executado? Não há alvo que acione esse comando.
Você poderia:
MY_VAR := $(shell ls)
all:
@echo MY_VAR IS $(MY_VAR)
Observe que eu assumi GNU make
. Isso será executado ls
para você e colocará a saída em MY_VAR
. Mas esse é um hack que deve ser evitado.
Você também pode tentar um alvo extra
extra:
@echo $(x)
e adicione isso como pré-requisito para todos os outros alvos.
Quanto ao bônus: é porque a linha @echo $(x)
não tem separador. Neste ponto do arquivo, make
esperaríamos um alvo com a :
e não há nenhum :
nessa linha. (existem outras possibilidades, como uma nova atribuição de variável, etc., é claro)
Responder2
GNU make
tem um recurso para fazer exatamente isso e é chamado $(info ....)
.
Você poderia colocar a seguinte linha fora de a rule
e o GNU make irá executá-la:
$(info variable x = $x))
E se você estiver fazendo esse tipo de tarefa repetidamente, você pode abstraí-la em a macro
e chamá-la sempre que necessário:
make -f - <<\eof
dumpvar = $(info variable `$1' value is >>>$($1)<<<)
ssl_enable = NO
$(call dumpvar,ssl_enable)
.PHONY: all
all:;@:
eof
Ele exibirá o seguinte em stout:
variable `ssl_enable' value is >>>NO<<<