我正在尝试为大型项目调试makefile,而我正在努力define TEMPLATE
/ endef
和foreach
/ eval
/ call
构造。特别是我认为我很难确定需要使用$
引用哪些变量以及我需要使用$$
引用哪些变量。
如果我在变量扩展之前看到eval
/ call
展开的实际结果,我认为调试会更容易。
例如,如果我们在eval documentation中使用gnu-make中的示例,我们有以下makefile-fragment:
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
...
define PROGRAM_template =
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
我认为在变量扩展之前,foreach
应该有效地扩展到以下内容:
server: $(server_OBJS) $(server_LIBS:%=-l%)
ALL_OBJS += $(server_OBJS)
client: $(client_OBJS) $(client_LIBS:%=-l%)
ALL_OBJS += $(client_OBJS)
我手动找出了上述扩展(欢迎更正),但我正在寻找一种通用的方法来展示更复杂的例子。这种方法存在吗?
我已查看了make -d
和make -pn
选项,据我所知,我认为其中任何一项都不会提供此特定输出。
我正在使用make-3.81。
答案 0 :(得分:13)
将所有$(eval ...)
来电替换为$(info ...)
。实际上,如果你遇到3.81,你可能不得不使用$(warning ...)
并忽略额外的输出,因为我认为{3.}}可能在版本3.82之前不存在。
无论如何,写作:
$(info ...)
(或警告)你会看到解析的内容。
答案 1 :(得分:1)
我已经编写了一个宏来帮助查看$(eval ...)的结果:
# This version prints out rules for debugging
#c = $(eval $(call $(strip $1),$(strip $2),$(strip $3),$(strip $4),$(strip $5),$(strip $6),$(strip $7),$(strip $8),$(strip $9))) $(info $(call $(strip $1),$(strip $2),$(strip $3),$(strip $4),$(strip $5),$(strip $6),$(strip $7),$(strip $8),$(strip $9)))
# This version is the production version
c = $(eval $(call $(strip $1),$(strip $2),$(strip $3),$(strip $4),$(strip $5),$(strip $6),$(strip $7),$(strip $8),$(strip $9)))
像这样使用:
$(call c,function,arg1,arg2,...)
要查看eval生成的内容,只需使用调试版即可。我需要这个,而不是简单地用$(info ...)替换$(eval ...),因为makefile后面的功能取决于$(eval ...)的结果