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.
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.