2013-10-01 8 views
0

Можно ли принудительно установить определенное условие до того, как будут оцениваться правила?Предварительные требования к Makefile перед правилами

Ex:

FOOPATH = $(shell which foo) 
ifndef $(FOOPATH) 
    echo "Error: foo is not avaliable." 
    # abort make 
endif 

PS: Я не ищу решение, чтобы добавить предпосылки сделать каждое правило, которое зависит от Foo (потому что весь Makefile должен зависеть от Foo)

ответ

2

FOOPATH = $ (оболочка, Foo)

ifeq ($(FOOPATH),) 
$(error foo is not available) 
endif 

(Обратите внимание, что FOOPATH определяется, даже если он пуст.)

EDIT: Correction-- Я ошибся ifndef; он возвращает true, если переменная определена, но имеет пустое значение. Но он не будет работать, как написано, так как пути FOOPATH присваивается значение:

FOOPATH = $(shell which foo) 

Значение FOOPATH буквально «$ (оболочка которых Foo)», поэтому ifndef никогда не будет оценивать как истинное , и вы никогда не увидите ошибку. Решение состоит в том, чтобы использовать simply expanded variable:

FOOPATH := $(shell which foo) # <-- note the colon 

Кроме того, ifndef должен быть применен к переменной именем, а не его значение (например FOOPATH не $(FOOPATH)).

ifndef FOOPATH 
$(error foo is not available) 
endif 
+1

согласно [страницы] (Http: //www.chemie.fu-berlin. de/chemnet/use/info/make/make_7.html) 'ifdef' присваивает значение true, когда переменная var имеет непустое значение. – RSFalcon7

+0

@ RSFalcon7: Вы абсолютно правы. Исправление ... – Beta

+0

Вы правы в 'ifndef', но значение' $ (FOOPATH) 'при назначении' = 'является результатом' $ (shell, который foo) ', я тестировал – RSFalcon7

0

Для получения дополнительной информации, это мое окончательное решение, с большим помощь от @Beta

FOOPATH = $(shell which ls 2>/dev/null) 

ifeq ($(FOOPATH),) 
$(error foo is not avaliable) 
else 
$(warning foo is avaliable in $(FOOPATH)) 
endif 

all: 
    @echo "rule all executed" 
Смежные вопросы