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 я выбрал опцию для просмотра всех специальных символов и заметил паршивую овцу.