0

我对我定义的两个函数有疑问,它们如下:

#return the full path of the passed in dir/file with the drive letter removed
define clean_path
$(patsubst $(DRIVE_ROOT)/%,/%,$(abspath $(1)))
endef

#appends the root directory name to the paths except for paths that are absolute.
define qualify_path
$(addprefix $(1),$(filter-out /%,$(2))) $(filter /%,$(2))
endef

qualify_path 函数是查看路径列表和任何不以 / 开头的目录,它将向其添加 $(1)。这两个功能独立工作,但我的问题是当我一起使用它们时。

在makefile中,我有以下几行:

TEMP_DIRS := $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS))
$(info TEMP_DIRS = $(TEMP_DIRS))
CLEAN_DIRS := $(call clean_path, $(TEMP_DIRS))
$(info CLEAN_DIRS = $(CLEAN_DIRS))

当这些行运行时,我最终得到 $(TEMP_DIRS) 具有分配给它的适当值,但 $(CLEAN_DIRS) 具有与 $(TEMP_DIRS) 相同的值。我有 $(TEMP_DIRS) 只是为了在这一点上进行调试,我真的只想像这样组合它们:

CLEAN_DIRS := $(call clean_path, $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS)))

现在,如果我使用它而不是调用 clean_path:

TEMP_DIRS := $(call qualify_path, $(lastword $(dirstack)), $(SRC_INCDIRS))
$(info TEMP_DIRS = $(TEMP_DIRS))
CLEAN_DIRS := $(patsubst $(DRIVE_ROOT)/%,/%,$(abspath $(TEMP_DIRS)))
$(info CLEAN_DIRS = $(CLEAN_DIRS))

$(CLEAN_DIRS) 包含所有正确的值。我确信它与扩展订单、使用 eval 或类似的东西有关,但我真的无法弄清楚这一点。如果有人可以请解释做我正在尝试的正确方法,那就太好了。一如既往地感谢您的时间。

4

1 回答 1

0

好吧,这当然是一个愚蠢的错误,没有机会为其他人找到它。我之前在一个单独的 makefile 中定义了 clean_path 函数,我将它包含在 unix 系统或 windows 系统的系统命令中,因为我不需要清理 unix 系统的路径,它是空白的。我猜想在两个不同的地方定义函数会搞砸 make 所以它什么也没做。我发现问题是把所有东西都注释掉,直到它起作用,然后一点一点地添加东西。一旦我取消注释了 windows 命令,它就再次损坏了,所以我在那里查看了 clean_path 函数。感谢您的帮助和时间。

于 2012-05-29T11:33:32.183 回答