Variáveis de criação específicas de destino

3

Como posso forçar uma variável específica de destino a ser definida imediatamente (linha 2)? Eu quero que a saída de make seja release e make debug seja debug .

X = release
debug: X = debug
debug: all

# the rest is included from an external file; cannot be changed
Y := $(X)
BUILD := $(Y)

all:
    @echo $(BUILD)
    
por benwaffle 11.03.2015 / 14:42

1 resposta

1

Seu problema se deve a como o GNUMake analisa um arquivo make.

GNU make does its work in two distinct phases. During the first phase it reads all the makefiles, included makefiles, etc. and internalizes all the variables and their values, implicit and explicit rules, and constructs a dependency graph of all the targets and their prerequisites. During the second phase, make uses these internal structures to determine what targets will need to be rebuilt and to invoke the rules necessary to do so.

Lendo Makefiles

Parece que quando você executa make debug , a dependência é executar all: , que imprime o valor como se você executasse make all . O que você precisa fazer é modificar seu makefile para que all e debug acionem a mesma dependência. Você geralmente verá algo como

all: $(executable)
debug: $(executable)
$(executable): $(objs)
    <compile objects to executable>

debug nunca aciona all mas em ambos os casos o executável é compilado.

Quanto ao seu código:

X = release

debug: X = debug

Y = $(X)
BUILD = $(Y)

.PHONY: print
print:
        @echo $(BUILD)

all: print
debug: print

Eu tive que tornar a impressão uma dependência falsa, já que ela não é um objeto real sendo criado. Caso contrário, isso seria a sua dependência, que tanto o debug quanto o all exigem, mas compilam de forma diferente, dependendo dos sinalizadores que você definiu.

    
por 11.03.2015 / 16:40

Tags