Команды GNU make yields начинаются до первой целевой ошибки

В моем 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), но это не выполняется правильно.

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


person Alex Reynolds    schedule 17.01.2011    source источник


Ответы (3)


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

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

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

person Simon Richter    schedule 17.01.2011
comment
Богаче: я долго застрял с этим, когда использовал табуляцию вместо пробелов и получил ошибку *** commands commence before first target. Вы спасли день. Огромное спасибо... :) - person NeonGlow; 18.12.2012
comment
Отличное наблюдение.. вкладка в запретном месте :) - person hesham_EE; 24.08.2016

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

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

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

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

    a := b
    $(error a)

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

    a := b
a:
    echo $a

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 15.08.2015
comment
Функция error по-прежнему работает с GNU Make 4.2.1. - person Johannes Bittner; 17.04.2018

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

person RobGajula    schedule 11.08.2014
comment
Закройте, это ненужный символ табуляции перед заменой $(error ... вызывает ошибку. Если его удалить или заменить пробелами, ошибка исчезнет. - person Ross Ridge; 11.08.2014