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

в моем makefile я хотел бы проверить наличие библиотеки и дать информативное сообщение об ошибке. Я создал условие, которое должно выйти из процесса 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 

мой makefile застревает на строке 13:

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

после строки 13 мой makefile имеет свои цели.

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

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

3 ответов


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

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

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


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

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

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

что делает вопросы более запутанными, так это то, что" не кажется законной командой". Это объясняет, почему в:

    a := b
    $(error a)

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

    a := b
a:
    echo $a

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


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