É possível exibir variáveis ​​fora das regras usando o GNU Make?

É possível exibir variáveis ​​fora das regras usando o GNU Make?

É 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 ifdefresulta 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 lspara 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, makeesperarí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 maketem um recurso para fazer exatamente isso e é chamado $(info ....).

Você poderia colocar a seguinte linha fora de a rulee 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 macroe 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<<<

informação relacionada