2011-01-17 2 views
41

В моем make-файле я хотел бы проверить наличие библиотеки и дать информативное сообщение об ошибке. Я создал условное, который должен выйти из процесса грим, когда файл не найден:GNU make yields «команды начинаются до первой цели» error

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

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

ответ

62

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

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

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

+9

Richer: Я долго задерживался на этом месте, где вместо вкладок я использовал вкладки, а команды '*** начинались раньше первая ошибка цели. Вы спасли день. Много спасибо ... :) – NeonGlow

+0

Спасибо за сохранение моего времени ... –

+2

Отличное наблюдение .. вкладка в запрещенном месте :) –

1

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

+0

Закрыть, это ненужный символ табуляции перед '$ (ошибка ...' подстановка, вызывающая ошибку Удалив его или заменив его пробелами, ошибка исчезнет. –

3

Когда вы получите сделать сообщения об ошибках, всегда проверьте документацию Сообщение об ошибке http://www.gnu.org/software/make/manual/make.html#Error-Messages на GNU Make 3.81 (появляется ошибка, была удалена из более новых версий), он говорит:

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

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

a := b 
    $(error a) 

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

a := b 
a: 
    echo $a 

Примечание: SO в настоящее время конвертирует вкладки в пробелы в коде, поэтому вы не можете просто скопировать приведенный выше код в свой редактор: https://meta.stackexchange.com/questions/143632/tabs-converted-to-spaces

Смежные вопросы