GNU make выдает ошибку «команды начинаются раньше первой цели» - PullRequest
48 голосов
/ 17 января 2011

В моем make-файле я хотел бы проверить наличие библиотеки и дать информативное сообщение об ошибке.Я создал условие, которое должно выйти из процесса make, когда файл не найден:

 9: ifeq ($(${JSONLIBPATH}),)
10:    JSONLIBPATH = ${ALTJSONLIBDIR}/${LIBJSON}
11: endif
12: ifeq ($(${JSONLIBPATH}),)
13:    $(error JSON library is not found. Please install libjson before building)
14: endif 

Мой make-файл застревает в строке 13:

Makefile:13: *** commands commence before first target.  Stop.

После строки 13 мой make-файл имеетего цели.

Я попытался поместить этот условный блок в цель (например, цель с именем isJSONLibraryInstalled), но это не выполняется правильно.

Как бы я проверил существование файла и обработалв случае ошибки, до обработки целей?Извиняюсь, если это тупой вопрос.

Ответы [ 3 ]

74 голосов
/ 17 января 2011

Прежде всего, вы смотрите на содержимое переменной, которая названа в честь текущего пути, что, вероятно, не то, что вы хотите. Простая ссылка на переменную окружения - $(name) или ${name}, а не $(${name}). В связи с этим всегда оценивается строка 13.

Во-вторых, я думаю, что задыхается от выражения $(error ...). Хотя выражение разрешается в пустую строку, в начале строки по-прежнему имеется символ табуляции, который указывает на команду, которая, в свою очередь, не может существовать вне правила.

Я думаю, что для отступа будет лучше использовать пробелы, а не табуляцию.

6 голосов

Когда вы получаете сообщения об ошибках Make, всегда проверяйте документацию сообщений об ошибках

В GNU Make 3.81 (error, похоже, был удален из более новых версий), там написано:

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

Что делает вещи более запутанными, так это то, что часть «не является допустимой командой make».Это объясняет, почему в:

    a := b
    $(error a)

ошибка происходит в строке 2, а не в 1: make просто принимает операторы, которые он может анализировать, например, присваивание, поэтому работает следующее:

    a := b
a:
    echo $a

Примечание: В настоящее время SO преобразует табуляции в пробелы в коде , поэтому вы не можете просто скопировать приведенный выше код в свой редактор.

1 голос
/ 11 августа 2014

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

...