Makefile中的变量无法被make正确识别

时间:2016-06-06 22:08:18

标签: 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 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中。它奏效了。我不确定我是否完全理解这背后的原因,但这确实给了我一些处理类似问题的经验。

1 个答案:

答案 0 :(得分:2)

在BSD Make中(我认为在许多其他实现中),在解析时急切地评估依赖行。因此,当您稍后定义INFORMINC变量时,它不会影响依赖关系规则。

all目标中的shell命令在执行之前被懒惰地评估。因此,你会看到它的价值。

另见https://mail-index.netbsd.org/tech-pkg/2016/05/26/msg016900.html,我更详细地解释了这个主题。