Make не оценивает назначения переменных в строках рецептов сборки; они строго код оболочки.
В GNU Make вы можете использовать назначение переменной цели для временного изменения значения переменной во время выполнения правил, которые обновляют данную цель.Чтобы воспользоваться этим, мы разделили правило на два:
.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
Чтобы это работало, NEWLIB
должна быть переменной с задержкой, а не немедленной переменной. То есть:
NEWLIB = whatever$(ARCH)whateverelse
# NOT this:
NEWLIB := whatever$(ARCH)whateverelse
Переменные, созданные с использованием =
, хранят нерасширенный текст, который раскрывается при замене (что-то вроде макроса), тогда как : =
переменные хранят расширенный текст, который не содержит дополнительных расширений, когда он будет заменен позже. Конечно, нам нужно, чтобы $ (ARCH)
было заменено поздно, чтобы его целевое назначение вступило в силу.
Полный тестовый пример:
$ 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
Мы можем очистить 32-битную библиотеку, используя ее конкретную цель:
$ 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
Аналогично с 64-битной библиотекой
$ 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
Мы можем очистить и то, и другое, используя общую 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
Похоже, вы пытаетесь заново изобрести колесоуправление версиями .