GNU делает выход "команда начинается до первой цели"
В моем 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 мой файл makefile имеет свои цели.
Я попытался поместить этот условный блок в цель (например, цель с именем isJSONLibraryInstalled
), но это не выполняется правильно.
Как проверить наличие файла и обработать случай ошибки, прежде чем обрабатывать цели? Извиняюсь, если это глупый вопрос.
Ответы
Ответ 1
Прежде всего, вы смотрите на содержимое переменной, названной в честь текущего пути, что, вероятно, не то, что вы хотите. Простая ссылка на переменную среды - $(имя) или ${name}, а не $($ {name}). В связи с этим всегда оценивается строка 13.
Во-вторых, я думаю, что он задыхается от отступа выражения $(error...). В то время как выражение разрешает пустую строку, в начале строки все еще есть символ табуляции, который указывает на команду, которая, в свою очередь, не может существовать вне правила.
Я думаю, что использование пробелов, а не вкладок в отступ, будет работать.
Ответ 2
Когда вы получаете сообщения об ошибке, всегда проверяйте документацию с сообщением об ошибке http://www.gnu.org/software/make/manual/make.html#Error-Messages В GNU Make 3.81 (ошибка, кажется, была удалена из более новых версий), он говорит:
Это означает, что первая вещь в make файле, по-видимому, является частью команды script: она начинается с символа TAB и не кажется законной командой make (например, назначение переменной). Командные сценарии всегда должны быть связаны с целью.
Что еще более сбивает с толку, так это то, что часть "не является частью юридической команды". Это объясняет, почему в:
a := b
$(error a)
ошибка происходит в строке 2, а не 1: просто принимает утверждения, которые он может анализировать, как назначение, поэтому работает следующее:
a := b
a:
echo $a
Примечание. SO теперь преобразует вкладки в пробелы в коде, поэтому вы не можете просто скопировать вышеуказанный код в свой редактор: https://meta.stackexchange.com/questions/143632/tabs-converted-to-spaces
Ответ 3
Для меня это было ненужное пустое пространство перед коннектором, который вызывал это.
На slickEdit я выбрал опцию для просмотра всех специальных символов и заметил черных овец.