嗨,我想了解并编写GNU Makefile。我有一个包含从属目录的变量

时间:2016-05-06 04:34:07

标签: unix makefile

您好我正在尝试创建一个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都是空的。 我在这里错过了什么吗?

2 个答案:

答案 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))