我定义的两个函数有问题,它们如下:
#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)。这两个函数都是独立工作的,但我的问题是当我一起使用它们时。
在生成文件中,我有以下几行:
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 或类似的东西有关,但我真的无法弄清楚这一点。如果有人能解释一下我正在尝试的正确方法,那就太好了。一如既往地感谢您的时间。
这当然是一个愚蠢的错误,没有机会为其他人找到它。我之前在一个单独的makefile中定义了clean_path函数,我包括的是Unix系统或Windows系统的系统命令,因为我不需要清理Unix系统的路径,它是空白的。我想在两个不同的地方定义函数会搞砸制作,所以它什么也没做。我发现问题在于将所有内容注释掉,直到它起作用,然后逐个添加内容。一旦我取消注释掉 windows 命令包括它再次中断,所以我在那里查看,有clean_path功能。感谢您的帮助和时间。