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

Dig*_*uma 12 debugging foreach makefile eval

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

我认为如果我可以在变量扩展之前看到eval/ callexpansion 的实际结果,我会更容易调试.

举例来说,如果我们使用的例子EVAL文档,我们有以下的makefile片段:

 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))))
Run Code Online (Sandbox Code Playgroud)

我认为foreach在变量扩展之前,这应该有效地扩展到以下内容:

server: $(server_OBJS) $(server_LIBS:%=-l%)
ALL_OBJS   += $(server_OBJS)

client: $(client_OBJS) $(client_LIBS:%=-l%)
ALL_OBJS   += $(client_OBJS)
Run Code Online (Sandbox Code Playgroud)

我手动想出了上面的扩展(更正欢迎),但我正在寻找一种通用的方法来展示这个扩展以获得更复杂的例子.这种方法存在吗?

我已经研究过make -dmake -pn选择,据我所知,我认为其中任何一个都不会提供这个特定的输出.

我正在使用make-3.81.

Mad*_*ist 17

替换所有$(eval ...)通话$(info ...).实际上,如果你坚持使用3.81,你可能不得不使用$(warning ...)并忽略额外的输出,因为我认为$(info ...)可能在版本3.82之前不存在.

无论如何,写作:

$(foreach prog,$(PROGRAMS),$(info $(call PROGRAM_template,$(prog))))
Run Code Online (Sandbox Code Playgroud)

(或警告)你会看到解析的内容.