Makefile 为什么转义变量$$起作用而不起作用$

Makefile 为什么转义变量$$起作用而不起作用$,makefile,Makefile,这是我在帖子中提出的前一个问题的后续问题: 在以下方面: 有一个rules makefile,它添加了各种标准定义, 包括.mak。它有一个定义: RESOLVED_PATH=$(subst $(abspath .)/,,$(abspath $(1))) 它正在另一个生成文件中使用: include Include.mak ROOT:=. define UPDATE_GUI d:= $$(strip $(1)) GUI_FOLDER:= $(ROOT)/$(d) GUI_ALL:=$(ca

这是我在帖子中提出的前一个问题的后续问题:

在以下方面:

有一个rules makefile,它添加了各种标准定义, 包括.mak。它有一个定义:

RESOLVED_PATH=$(subst $(abspath .)/,,$(abspath $(1)))
它正在另一个生成文件中使用:

include Include.mak

ROOT:=.
define UPDATE_GUI
d:= $$(strip $(1))
GUI_FOLDER:= $(ROOT)/$(d)
GUI_ALL:=$(call RESOLVED_PATH,$(GUI_FOLDER)/$(d)_generated.txt)
$$(warning GUI_ALL is set to $$(GUI_ALL))
endef

TARGET_FILE:= ProjectParms.rb

ACTIVE_GUIS = $(wildcard GUI*/$(TARGET_FILE))
GUIS_OF_INTEREST = $(dir $(ACTIVE_GUIS))
GUIS= $(patsubst %/,%,$(GUIS_OF_INTEREST))
$(foreach GUI, $(GUIS), $(eval  $(call UPDATE_GUI, $(GUI))))
这并不能提供所需的输出,但如果我在行中展开相同的输出:

GUI_ALL:=$$(subst $$(abspath .)/,,$$(abspath $$(GUI_FOLDER)/$$(d)_generated.txt)

$$(warning GUI_ALL is set to $$(GUI_ALL))
它很好用,有人能告诉我为什么吗?$(call RESOLVED_PATH,Param)在整个make项目的不同位置使用(尽管没有$(警告“”)正在其他任何地方使用,我只是使用它来快速检查是否正常。

除了实际的
调用
参数外,您必须转义函数中的所有内容。有时您不希望这样做,但几乎每次都这样做。因此应该是:

define UPDATE_GUI
d := $$(strip $(1))
GUI_FOLDER := $$(ROOT)/$$(d)
GUI_ALL := $$(call RESOLVED_PATH,$$(GUI_FOLDER)/$$(d)_generated.txt)
$$(warning GUI_ALL is set to $$(GUI_ALL))
endef
对于调试,您可以将
eval
函数替换为
info
函数;这将为您打印出
eval
可以使用的makefile语法。如果您这样做,您将看到在
eval
获取要分析的文本时,它已经错误,因为
call
扩展了它。例如

$(foreach GUI,$(GUIS),$(info $(call UPDATE_GUI,$(GUI))))
埃塔

我要指出的是,通过完全删除
call
函数,您可以大大简化这一过程。为了做到这一点,您必须对
UPDATE\u GUI
定义与
foreach
紧密绑定感到满意。由于您只是将一个参数传递给
call
函数,因此您不能这样做,而是将
GUI
变量(foreach中的循环变量)直接输入到
UPDATE\u GUI
define;然后您不需要调用。如下所示:

define UPDATE_GUI
d := $(strip $(GUI))
GUI_FOLDER := $(ROOT)/$(d)
GUI_ALL := $(call RESOLVED_PATH,$(GUI_FOLDER)/$(d)_generated.txt)
$(warning GUI_ALL is set to $(GUI_ALL))
endef

$(foreach GUI,$(GUIS),$(eval $(UPDATE_GUI)))

您得到的输出是什么?您想要的输出是什么?我期待$(d)要扩展,先是GUI1/GUI1_-generated.txt,然后是GUI2/GUI2_-generated.txt。我得到了/_-generated.txt注意我的第二句话:并不是所有这些转义都是必需的。但是它们也不会有什么坏处,如果你只转义它们,除了
调用
参数之外,它可以简化工作。这是留给读者的一个练习,以确定哪些是转义CAPE是非常必要的,而不是…一旦你真的想知道你将很好地掌握
eval
call
和makefile扩展。非常感谢你所有的输入MadScientist!我现在就试试并更新!感谢你所有的帮助MadScientist。我犯了一些新手错误,最终我成功了你的很多建议都很有帮助!