Makefile规则创建多个文件,每个文件依赖于不同的目标

时间:2015-10-31 01:37:09

标签: makefile

我正在尝试编写一个执行某些文件聚合的Makefile。类似于以下内容:我有几天的数据,关于我吃早餐午餐和晚餐的情况。文件名称如下:

monday_breakfast.meal
monday_lunch.meal
monday_dinner.meal
tuesday_breakfast.meal
...

或者如果使用数字会更简单:

00_00.meal
00_11.meal
00_22.meal
11_00.meal
...

目标是将每天的三个文件聚合为每天的单个文件,但这样做是为了所有日子。是否可以编写一个执行此操作的规则?棘手的部分是我不知道当我运行make时会有多少天的文件,所以我希望它是通用的。

我在想这样的事情:

DAYS= $(sort $(patsubst _*,,*.meal))
day: %.day: $(DAYS):

但后来我陷入困境。我正在使用它作为一种练习,以了解更多有关Makefile的信息 - 一开始看起来很容易,但我无法想到这一点。

1 个答案:

答案 0 :(得分:1)

制作弦乐的能力并不是人们所希望的。但是这里有。

假设我们有:

monday_breakfast.meal
monday_lunch.meal
monday_dinner.meal
tuesday_breakfast.meal
tuesday_lunch.meal
tuesday_dinner.meal
wednesday_breakfast.meal

首先,获取所有meal个文件的名称:

MEALS := $(wildcard *.meal)

然后我们想以某种方式将此列表缩减为日期的名称。如果我们采用一个文件名:

FIRSTMEAL := monday_breakfast.meal

我们可以通过将下划线转换为空格来分割它,然后抓取第一个片段:

FRAGS := $(subst _, , $(FIRSTMEAL))  #  monday breakfast.meal
FIRSTDAY := $(word 1, $(FRAGS))      #  monday

所以我们可以为所有餐点做到这一点:

DAYS := $(sort $(foreach x,$(MEALS), $(word 1,$(subst _, ,$(x)))))

sort删除列表中的重复。)

现在我们已经DAYS("星期二星期一,星期三"),我们想要编写规则或规则来进行聚合。这将是多么容易取决于你的意思是什么样的聚合,你将使用什么工具,以及它是否接受通配符。