【发布时间】:2013-10-16 20:15:03
【问题描述】:
我正在尝试为一个大型项目调试 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。
【问题讨论】:
标签: gnu-make debugging foreach makefile eval