您好我正在尝试创建一个Makefile 我有一个包含依赖目录的Makefile变量,如
DEPDIR := temp foo bar
我需要每个目录的绝对路径。所以,我写了一条规则:
DIRS := $(foreach dirs, $(DEPDIR), $(shell find $(HOME) -name "$$dirs"))
我也试过了:
DIRS := $(notdir $(foreach dirs, $(DEPDIR), $(shell find $(HOME) -name "$$dirs")))
但两种情况下的变量DIRS
都是空的。
我在这里错过了什么吗?
答案 0 :(得分:0)
我不知道你为什么写双$
:$$dirs
。试试这个:
DIRS := $(foreach dir, $(DEPDIR), $(shell find $(HOME) -type d -name "$(dir)" ))
考虑缩小搜索条件,因为根据定义,$(HOME)
可以包含任何内容。
我想您不会争辩说使用专用目录跟踪项目依赖关系会更好。有许多方法可以构建这种类型的目录(生成符号链接,下载/解压缩包,克隆存储库,使用包管理器等)。因此,我也建议采用以下模式。
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
PROJECT_DIR := $(dir $(MAKEFILE_PATH))
DIRS := $(realpath $(addprefix $(PROJECT_DIR)deps/, dir1 dir2 dir3))
这里我们从MAKEFILE_LIST
中提取当前makefile的文件名,然后将其绝对路径存储在MAKEFILE_PATH
变量中。然后,makefile路径的目录部分存储在PROJECT_DIR
中。通过addprefix
,我们将$(PROJECT_DIR)/deps
添加到每个相关目录(dir1 dir2 dir3
)的前面。然后我们解析符号链接,并为依赖目录构造规范绝对名称,然后将它们存储在DIRS
中。
答案 1 :(得分:0)
使用find
这是完全古怪的。目录树中的其他目录可能有相同的名称,无论如何,大概是你想要的目录都在当前目录中。
如果它们可以嵌套在其他目录中,那么在当前目录上运行find
可能会有所帮助,但您可能只是在寻找
$(patsubst %,${PWD}/%,$(DIRS))