Я работаю над созданием Makefile с несколькими конфигурациями (тот, который поддерживает отдельные задачи "отладки" и "выпуска" ), и столкнулся с странной проблемой, которая, как представляется, является ошибкой в GNU make.
Кажется, что GNU make не расширяет целевые переменные должным образом, когда эти переменные ссылаются на неявное правило. Вот упрощенный Makefile, который показывает эту проблему:
all:
@echo specify configuration 'debug' or 'release'
OBJS := foo.o bar.o
BUILDDIR = .build/$(CONFIG)
TARGET = $(addprefix $(BUILDDIR)/,$(OBJS))
debug: CONFIG := debug
release: CONFIG := release
#CONFIG := debug
debug: $(TARGET)
release: $(TARGET)
clean:
rm -rf .build
$(BUILDDIR)/%.o: %.c
@echo [$(BUILDDIR)/$*.o] should be [[email protected]]
@mkdir -p $(dir [email protected])
$(CC) -c $< -o [email protected]
При указании цели "debug" make, CONFIG устанавливается на "debug", а BUILDDIR и TARGET также правильно расширяются. Однако в неявном правиле для создания исходного файла из объекта, [email protected]расширяется, как будто CONFIG не существует.
Вот результат использования этого Makefile:
$ make debug
[.build/debug/foo.o] should be [.build//foo.o]
cc -c foo.c -o .build//foo.o
[.build/debug/bar.o] should be [.build//bar.o]
cc -c bar.c -o .build//bar.o
Это показывает, что BUILDDIR расширяется отлично, но полученный [email protected]не является. Если я затем буду комментировать спецификацию целевой переменной и вручную установить CONFIG: = debug (прокомментированная строка выше), я получаю то, что ожидаю:
$ make debug
[.build/debug/foo.o] should be [.build/debug/foo.o]
cc -c foo.c -o .build/debug/foo.o
[.build/debug/bar.o] should be [.build/debug/bar.o]
cc -c bar.c -o .build/debug/bar.o
Я тестировал это как с make-3.81 на Gentoo, так и с MinGW, а make-3.82 на Gentoo. Все проявляют одинаковое поведение.
Мне трудно поверить, что я первый столкнулся с этой проблемой, поэтому я предполагаю, что, вероятно, я просто делаю что-то неправильно, но я буду честен: я не вижу, как я может быть.:)
Есть ли какие-нибудь гуру, которые могли бы пролить свет на эту проблему? Спасибо!