Spec-Zone.ru › GNU Make

Ошибки, генерируемые Make

Вот список наиболее распространённых ошибок, которые могут быть сгенерированы make, а также информация о том, что они означают и как их исправить.

Иногда make ошибки не являются фатальными, особенно в присутствии префикса - в строке рецепта или опции командной строки -k. Фатальные ошибки предваряются строкой ***.

Все сообщения об ошибках начинаются с имени программы (обычно «make»), или, если ошибка найдена в файле makefile, с имени файла и номера строки, содержащих проблему.

В таблице ниже эти общие префиксы опущены.

‘[foo] Error NN’
‘[foo] signal description’

Эти ошибки на самом деле не являются make ошибками. Они означают, что программа, которая make вызывалась в рамках рецепта, вернула код ошибки, отличный от 0 («Error NN»), который make интерпретирует как ошибку, или она завершилась каким-то другим аномальным образом (со сигналом определённого типа). См. Ошибки в рецептах.

Если к сообщению не прикреплён ***, то дочерний процесс завершился ошибкой, но правило в makefile имело префикс - специальным символом, поэтому make проигнорировало ошибку.

‘missing separator. Stop.’
‘missing separator (did you mean TAB instead of 8 spaces?). Stop.’

Это означает, что make не смогло понять большую часть того, что касается строки makefile, которую оно только что прочитало. GNU make ищет различные разделители (:, =, символы префикса рецепта и т.д.), чтобы определить, какой тип строки оно анализирует. Это сообщение означает, что оно не смогло найти допустимый.

Одной из наиболее частых причин этого сообщения является то, что вы (или, возможно, ваш очень полезный редактор, как это происходит во многих редакторах MS Windows) пытались отступать в своих строках рецепта пробелами вместо символа табуляции. В этом случае make использует вторую форму ошибки выше. Помните, что каждая строка в рецепте должна начинаться с символа табуляции (если вы не задали .RECIPEPREFIX; см. Специальные переменные). Восемь пробелов не считаются. См. Синтаксис правил.

‘recipe commences before first target. Stop.’
‘missing rule before recipe. Stop.’

Это означает, что первое, что встречается в файле makefile, является частью рецепта: оно начинается с символа префикса рецепта и не является законной make директивой (такой как присвоение переменной). Рецепты всегда должны быть связаны с целевым объектом.

Вторая форма генерируется, если первой не-пробельной строкой в строке является точка с запятой; make интерпретирует это как то, что вы опустили раздел «цель: предшественники» правила. См. Синтаксис правил.

‘No rule to make target `xxx'.’
‘No rule to make target `xxx', needed by `yyy'.’

Это означает, что make определило, что ему необходимо создать целевой объект, но не смогло найти в makefile никаких инструкций о том, как это сделать, ни явных, ни неявных (включая в базе данных стандартных правил).

Если вы хотите, чтобы этот файл был создан, вам необходимо добавить правило в свой makefile, описывающее, как этот целевой объект может быть создан. Другими возможными причинами этой проблемы являются опечатки в файле makefile (если имя файла неверно) или повреждённое дерево исходных данных (если этот файл не должен создаваться, а является лишь предшественником).

‘No targets specified and no makefile found. Stop.’
‘No targets. Stop.’

Первое означает, что вы не указали каких-либо целевых объектов для создания в командной строке, и make не смог найти какие-либо makefiles для чтения. Второе означает, что был найден makefile, но он не содержал никакой стандартной цели, и такая цель не была указана в командной строке. GNU make не имеет ничего делать в этих ситуациях. См. Аргументы для указания makefile.

‘Makefile `xxx' was not found.’
‘Included makefile `xxx' was not found.’

Не был найден makefile, указанный в командной строке (первая форма) или включённый (вторая форма).

‘warning: overriding recipe for target `xxx'’
‘warning: ignoring old recipe for target `xxx'’

GNU make позволяет указать только один рецепт на целевой объект (за исключением правил с двойными двоеточиями). Если вы указываете рецепт для целевого объекта, который уже определён с рецептом, выводится это предупреждение, и второй рецепт перезапишет первый. См. Несколько правил для одного целевого объекта.

‘Circular xxx <- yyy dependency dropped.’

Это означает, что make обнаружил цикл в графе зависимостей: после прослеживания предшественника yyy целевого объекта xxx и его предшественников и т.д., один из них зависел от xxx снова.

‘Recursive variable `xxx' references itself (eventually). Stop.’

Это означает, что вы определили обычную (рекурсивную) make переменную xxx, которая при расширении будет ссылаться на себя (xxx). Это запрещено; либо используйте просто расширяемые переменные (‘:=’ или ‘::=’), либо используйте оператор присоединения (‘+=’). См. Использование переменных.

‘Unterminated variable reference. Stop.’

Это означает, что вы забыли указать соответствующую закрывающую скобку или фигурную скобку в вашей ссылке на переменную или функцию.

‘insufficient arguments to function `xxx'. Stop.’

Это означает, что вы не предоставили необходимое количество аргументов для этой функции. См. документацию по функции для описания её аргументов. См. Функции для преобразования текста.

‘missing target pattern. Stop.’
‘multiple target patterns. Stop.’
‘target pattern contains no `%'. Stop.’
‘mixed implicit and static pattern rules. Stop.’

Эти ошибки генерируются для неправильно сформированных статических правил шаблонов (см. Синтаксис статических правил шаблонов). Первая означает, что часть шаблона цели в правиле пуста; вторая означает, что в части шаблона цели есть несколько символов шаблонов (%); третья означает, что в части шаблона цели нет символов шаблонов; и четвёртая означает, что все три части статического правила шаблона содержат символы шаблонов (%) – первая часть не должна содержать символов шаблонов.

Если вы видите эти ошибки, и не пытаетесь создать статическое правило шаблона, проверьте значения любых переменных в ваших списках целей и предшественников, чтобы убедиться, что они не содержат двоеточий.

‘warning: -jN forced in submake: disabling jobserver mode.’

Это предупреждение и следующее генерируются, если make обнаруживает условия ошибки, связанные с параллельной обработкой на системах, где под-make могут обмениваться данными (см. Передача опций дочернему процессу). Это предупреждение генерируется, если рекурсивный вызов процесса make вынужден иметь ‘-jN’ в списке аргументов (где N больше единицы). Это может произойти, например, если вы зададите переменную среды MAKE равной ‘make -j2’. В этом случае подпроцесс не общается с другими make процессами и просто будет притворяться, что у него есть два собственных задания.

‘warning: jobserver unavailable: using -j1. Add `+' to parent make rule.’

Для того, чтобы make процессы могли обмениваться данными, родительский процесс передаёт информацию дочернему процессу. Поскольку это может привести к проблемам, если дочерний процесс на самом деле не является make, родительский процесс сделает это только в том случае, если он считает, что дочерний процесс является make. Родительский процесс использует стандартные алгоритмы для определения этого (см. Как работает переменная MAKE). Если makefile построен таким образом, что родительский процесс не знает, что дочерний процесс является процессом make, то дочерний процесс получит только часть информации, необходимой для работы. В этом случае дочерний процесс сгенерирует это предупреждение и продолжит свою сборку в последовательном режиме.

‘warning: ignoring prerequisites on suffix rule definition’

Согласно POSIX, правило суффикса не может содержать предшественников. Если правило, которое может быть правилом суффикса, имеет предшественники, оно интерпретируется как простое явное правило с необычным именем целевого объекта. Это требование соблюдается, когда включён режим соответствия POSIX (определён целевой объект .POSIX). В версиях GNU make до 4.3 не выдавалось никакого предупреждения, и создавалось правило суффикса, однако все предшественники игнорировались и не были частью правила суффикса. Начиная с GNU make 4.3 поведение такое же, и в дополнение к этому генерируется это предупреждение. В будущей версии поведение, соответствующее POSIX, будет единственным поведением: никакое правило с предшественниками не может быть правилом суффикса, и это предупреждение будет удалено.

Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Error-Messages.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API