显示foreach / eval / call扩展的结果

时间:2013-10-16 20:15:03

标签: debugging foreach makefile eval

我正在尝试为大型项目调试makefile,而我正在努力define TEMPLATE / endefforeach / eval / call构造。特别是我认为我很难确定需要使用$引用哪些变量以及我需要使用$$引用哪些变量。

如果我在变量扩展之前看到eval / call展开的实际结果,我认为调试会更容易。

例如,如果我们在eval documentation中使用中的示例,我们有以下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 -dmake -pn选项,据我所知,我认为其中任何一项都不会提供此特定输出。

我正在使用make-3.81。

2 个答案:

答案 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 ...)的结果