Сделать ошибку смешанных неявных и нормальных правил
При создании проекта с открытым исходным кодом я встретил ошибку:
make subdir=manual -C manual ..=../ subdir_lib
Makefile:235: *** mixed implicit and normal rules. Stop.
Код из строки 235 файла Makefile следующим образом:
235: $(objpfx)stubs ../po/manual.pot $(objpfx)stamp%:
236: $(make-target-directory)
237: touch [email protected]
Ответы
Ответ 1
Это сообщение об ошибке выводится GNU make, когда у вас есть что-то похожее на вывод правила шаблона (содержащий %
), а также что-то похожее на нормальный вывод (no %
) на левый стороне a :
в объявлении правила. Например:
%.pat normal:
@echo [email protected]
Итак, в строке 235 вашего файла Makefile вам удалось собрать что-то, что "выглядит", которое создается. Чтобы избежать ошибки, исправьте это объявление, скорее всего, разделив его на две части:
%.pat:
@echo [email protected]
normal:
@echo [email protected]
Не видя полного make файла, создавшего эту ошибку, мы не можем дать вам больше советов.
Ответ 2
Я здесь, чтобы напомнить преемнику, проверить свой путь, есть ли в нем пробел?
Мы потратили весь день на это!
Ответ 3
В моем случае ошибка была вызвана идиотским помещением постороннего: в конце строки зависимости:
%.o: %.cpp:
g++ -c -o %@ $<
Ответ 4
Здесь описывается проблема, описанная в этом вопросе
http://sourceware.org/bugzilla/show_bug.cgi?id=11873
Исправление действительно заключалось в том, чтобы разделить это правило, как было предложено Эриком.
Ответ 5
Просто так было у меня, и это было из-за скрытого пробела после "/" в определении переменной, т.е.
#accidental/invisible space left after the final "/" i.e...
DESTDIR=path/to/the/destination/directory/
# ...just here ^
#rule to make copies of text files...
$(DESTDIR)%.txt:$(SRCDIR)%.txt
Ответ 6
Завершая ответ Эрика Мелского, вы можете сделать это, чтобы избежать дублирования кода везде:
define DEFAULTTARGET :=
@echo [email protected]
endef
%.pat:
${DEFAULTTARGET}
normal:
${DEFAULTTARGET}