2016-06-06 2 views
0

Вот соответствующие правила для переменного:переменных в Makefile не распознается по маркам правильно

LIBAD = libadard.a 

install: $(CRSLIB)/$(LIBAD) 

$(CRSLIB)/$(LIBAD): $(LIBAD) 

$(LIBAD): $(OBJECTS1) 

OBJECTS1 = $(LIBAD)(libadardV.o)\ 
    $(LIBAD)(a_delbb.o)  $(LIBAD)(a_getbkm.o)\ 
    ... 

$(LIBAD)(a_getbkm.o): a_getbkm.p \ 
    $(KINCDIR)/dbug.h \ 
    $(PRIMINC)/systypes.h \ 
    $(PRIMINC)/externs.h \ 
    $(PRIMINC)/reserrs.h \ 
    $(KINCDIR)/ltypes.h \ 
    $(KINCDIR)/except.h \ 
    $(PRIMINC)/u_pr_bkmsg.h \ 
    $(CRSINC)/sqlerrs.h \ 
    $(PDBINC)/systypes.th \ 
    $(PRIMINC)/u_pr_bkmsg.th \ 
    $(INFORMINC)/sqlca.h 

если я бег «сделать установку», вот что я получил:

make: *** No rule to make target `/sqlca.h', needed by `libadard.a(a_getbkm.o)'. Stop. 

Для целей тестирования , я добавил это правило в Makefile просто проверить значение этих переменных $ (INFORMINC):

PHONY: all 
all: ; @echo $(INFORMINC)  

И выход Corre кт:

[email protected] release>make all 
/informix-rv02_1/incl/esql 

я также проверил в каталоге "/ Informix-rv02_1/вкл/ESQL", файл sqlca.h есть. Так что пошло не так?

UPDATE:

переменных $ (INFORMINC) не определены в этом Makefile. Она определяется в файле Makerules сидит на корневом уровне, и что Makerules включен этим Makefile:

include ../../Makerules 

UPDATE 2:

Проблема решена. Спасибо @Roland Illig за подсказку. В Makerules, INFORMINC определяется как:

INFORMIXDIR := $(MY_INFORMIXDIR) 
INFORMIX := $(INFORMIXDIR) 
INFORMINC := $(INFORMIX)/incl/esql 

Я просто скопировал последней строки, где INFORMINC определяется и вставить его в Makefile. И это сработало. Я не уверен, полностью ли я понимаю причину этого, но это, безусловно, дает мне некоторый опыт для решения подобных проблем в будущем.

ответ

2

В BSD Make (и я думаю, что во многих других реализациях тоже) линии зависимостей оцениваются с нетерпением во время разбора. Поэтому, когда вы определяете переменную INFORMINC в более поздней точке, она не будет влиять на правило зависимости.

Команда оболочки в цель all оценивается лениво, непосредственно перед ее выполнением. Поэтому вы видите его значение.

См. Также https://mail-index.netbsd.org/tech-pkg/2016/05/26/msg016900.html, где я объяснил эту тему litle более подробно.

+0

Переменная INFORMING определяется в файле Makerules, и этот файл включен в этот файл makefile в самом начале. Означает ли это, что определение задерживается? – user3242431

+0

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

+0

Как-то определение INFORMINC не было передано из Makerules в этот makefile правильно или вовремя. Мне нужно скопировать определение переменной и вставить ее в make-файл, чтобы она работала. – user3242431

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