Сделать ошибку смешанных неявных и нормальных правил - программирование
Подтвердить что ты не робот

Сделать ошибку смешанных неявных и нормальных правил

При создании проекта с открытым исходным кодом я встретил ошибку:

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]
4b9b3361

Ответ 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}