Make não avalia atribuições de variáveis em linhas de receita de construção; eles são estritamente código shell.
No GNU Make, você pode usar uma atribuição de variável específica de destino para alterar temporariamente o valor de uma variável sobre a execução de regras que atualizam um determinado alvo. Para aproveitar isso, dividimos a regra em duas partes:
.PHONY: clean-lib-32 clean-lib-64 clean-lib
clean-lib: clean-lib-32 clean-lib-64
# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64
clean-lib-32 clean-lib-64:
rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
Para que isso funcione, NEWLIB
tem que ser uma variável atrasada, não uma variável imediata. Isso é para dizer:
NEWLIB = whatever$(ARCH)whateverelse
# NOT this:
NEWLIB := whatever$(ARCH)whateverelse
As variáveis criadas usando =
armazenam o texto não expandido, que é expandido no momento em que são substituídas (como macros semelhantes), enquanto que :=
variables armazenam o texto expandido que não contém mais expansões quando é substituído posteriormente. Obviamente, precisamos de $(ARCH)
para ser substituído tardiamente, para que sua designação específica do alvo tenha efeito.
Caso de teste completo:
$ cat Makefile
.PHONY: clean-lib-32 clean-lib-64 clean-lib
NEWLIB = newlib/
LIBNAME = lib-$(ARCH)
clean-lib: clean-lib-32 clean-lib-64
# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64
clean-lib-32 clean-lib-64:
echo rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
Podemos limpar a biblioteca de 32 bits usando seu destino específico:
$ make clean-lib-32
echo rm -rf newlib/lib-32.so newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
Da mesma forma com a biblioteca de 64 bits
$ make clean-lib-64
echo rm -rf newlib/lib-64.so newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a
Podemos limpar os dois usando o destino genérico clean-lib
:
$ make clean-lib
echo rm -rf newlib/lib-32.so newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
echo rm -rf newlib/lib-64.so newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a