以下是变量的相关规则:
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 install",这就是我得到的:
make: *** No rule to make target `/sqlca.h', needed by `libadard.a(a_getbkm.o)'. Stop.
出于测试目的,我在makefile中添加了这个规则,只是为了检查这个变量$(INFORMINC)的值:
PHONY: all
all: ; @echo $(INFORMINC)
输出正确:
mtang@rv02 release>make all
/informix-rv02_1/incl/esql
我还在目录" / informix-rv02_1 / incl / esql"下检查,文件sqlca.h就在那里。出了什么问题?
更新:
变量$(INFORMINC)未在此makefile中定义。它在位于根级别的Makerules文件中定义,并且此Makefile包含Makerules:
include ../../Makerules
更新2:
问题解决了。谢谢@Roland Illig的线索。在Makerules中,INFORMINC定义为:
INFORMIXDIR := $(MY_INFORMIXDIR)
INFORMIX := $(INFORMIXDIR)
INFORMINC := $(INFORMIX)/incl/esql
我刚刚复制了定义INFORMINC的最后一行,并将其粘贴到makefile中。它奏效了。我不确定我是否完全理解这背后的原因,但这确实给了我一些处理类似问题的经验。
答案 0 :(得分:2)
在BSD Make中(我认为在许多其他实现中),在解析时急切地评估依赖行。因此,当您稍后定义INFORMINC
变量时,它不会影响依赖关系规则。
all
目标中的shell命令在执行之前被懒惰地评估。因此,你会看到它的价值。
另见https://mail-index.netbsd.org/tech-pkg/2016/05/26/msg016900.html,我更详细地解释了这个主题。