2016-04-19 84 views
1

我有一个奇怪的项目是在构建时生成几个文件。他们是其他文件,但有一个特殊的sulffix。 (而不是一个正常的项目,其中装置一些类型的所有文件他们自动产生)Makefile:PHONY模式匹配规则

例如:

然后我有一个图案规则:

DATA=$(get string from template.txt) 
%: %.tpl 
    sed 's/__TEMPLATE__/$(DATA)/g' $< > [email protected] 
templates: src/fileB.js src/fileD.css 

一切都很好。直到下一个版本...现在src/fileB.js不会得到更新,因为那里已经有一个,并且src/fileB.js.tpl没有更改,虽然我使用其他文件template.txt作为数据源来更新它可能。这将我带入了清洁的一步。

现在我干净的步骤是rm ing每个文件。这是丑陋的。

.PHONY: clean 
clean: 
    rm src/fileB.js 
    rm src/fileD.css 
    ... 

你可以看到它是如何变得丑陋。

在一个正常的项目中,我的干净将只是rm *.o,但在这里我不能做rm *.js因为一半的文件不是自动生成的。

有什么办法可以使规则%: %.tpl成为PHONY吗?

如果不是,有没有办法将文件列表从template提供到clean

回答

2

这是怎么回事?

TEMPLATES=$(wildcard src/*.tpl) 
GENERATED=$(TEMPLATES:%.tpl=%) 

clean: 
    rm -f $(GENERATED) 

嗯,我希望备份测试此之前...

+0

真好!现在我的'模板'规则也更清洁,模板:$(GENERATED)'。非常感谢!总是忘记'通配符' – gcb

+0

手动所需的'干净'步骤是make的“代码味道”。你不需要拥有它们。这里的问题的解决方案是使用* always *生成的中间文件,然后只在与中间文件不同时更新实际的'.js'文件。是的,这有点昂贵,但意味着你不能忘记清理并最终破碎。 –