我正在学习一些Makefile的基础知识,并编写如下的简单示例:
urname=Chang
givenname=SJ
fullname=$(givenname) $(surname)
hello:
@echo $(fullname)
surname=Lin
ALL_PACKAGES=
hello1:
ifeq (,$(ALL_PACKAGES))
@echo There is no package
$(error $(ALL_PACKAGES) is empty)
else
@echo there are some packages
endif
@echo $(ALL_PACKAGES)
ALL_PACKAGES += package1
我能理解make hello
结果将是“SJ Lin”,因为$(姓氏)最终是“林”。
然而,在make hello1
的结果中,为什么$(ALL_PACKAGES)在if条件中为空(我想在make hello
上以相同的方式将是“package1”)?
此外,为什么第一条回音信息(“没有包裹”)不会被打印,只会出现错误信息?
感谢老师。
答案 0 :(得分:1)
make hello
将产生“Jay Lin”,而不是“SJ Lin”。我不知道你从哪里得到“SJ”。
ALL_PACKAGES
在解析中的那一点是空的,这就是你得到那个结果的原因。 ifeq
在解析makefile时处理,然后才真正开始运行并构建目标。
在开始运行和构建目标之前,错误消息在解析makefile时打印出来(导致make
退出)。
如果您要对$(error
行发表评论,则会从make hello1
获得两次打印输出 - There is no package
消息(因ALL_PACKAGES
状态而包含1}}在解析中的那一点),然后package1
,在$(ALL_PACKAGES)
处理的实际make
处理过程中,{{1}}稍后展开。