Подтвердить что ты не робот

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

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

4b9b3361

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