GNU make yields командите започват преди първата целева грешка

В моя makefile бих искал да проверя за съществуването на библиотека и да дам информативно съобщение за грешка. Създадох условие, което трябва да излезе от процеса на създаване, когато файлът не бъде намерен:

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

Как да проверя за съществуването на файл и да се справя със случая на грешка, преди да обработя цели? Извинете, ако това е тъп въпрос.


person Alex Reynolds    schedule 17.01.2011    source източник


Отговори (3)


Първо, гледате съдържанието на променлива, която е кръстена на текущия път, което вероятно не е това, което искате. Една проста препратка към променлива на средата е $(name) или ${name}, а не $(${name}). Поради това ред 13 винаги се оценява.

Второ, мисля, че се задушава от вдлъбнатината на израза $(error ...). Докато изразът се преобразува в празен низ, все още има табулатор в началото на реда, който указва команда, която от своя страна не може да съществува извън правило.

Мисля, че използването на интервали вместо табулатори за отстъп би свършило работа.

person Simon Richter    schedule 17.01.2011
comment
Richer : Бях заседнал с това дълго, когато използвах раздели вместо интервали и получих *** commands commence before first target грешка. Ти спаси положението. Много благодаря... :) - person NeonGlow; 18.12.2012
comment
Страхотно наблюдение .. раздел на забраненото място :) - person hesham_EE; 24.08.2016

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

В GNU Make 3.81 (error изглежда е премахнат от по-новите версии), се казва:

Това означава, че първото нещо в make-файла изглежда е част от команден скрипт: то започва с TAB знак и не изглежда като законна команда make (като например присвояване на променлива). Командните скриптове винаги трябва да бъдат свързани с цел.

Това, което прави нещата по-объркващи, е частта „не изглежда да е законна команда за създаване“. Това обяснява защо в:

    a := b
    $(error a)

грешката възниква на ред 2, а не на 1: make просто приема изрази, които може да анализира, като присвояването, така че следното работи:

    a := b
a:
    echo $a

Забележка: SO в момента преобразува раздели в интервали в код, така че не можете просто да копирате горния код във вашия редактор.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 15.08.2015
comment
Функцията error все още работи с GNU Make 4.2.1 - person Johannes Bittner; 17.04.2018

За мен това беше ненужно бяло пространство преди конектора, което причиняваше това. В slickEdit избрах опцията за преглед на всички специални символи и забелязах черната овца.

person RobGajula    schedule 11.08.2014
comment
Затвори, това е ненужният табулатор преди заместването $(error ..., което причинява грешката. Ако го изтриете или замените с интервали, грешката ще изчезне. - person Ross Ridge; 11.08.2014