我们假设我有一个程序generator
接受带有后缀.source
的文件名列表,并生成一个带有后缀.source
的文件每个参数都替换为.target
。
我有一组带有后缀.source
的文件,并希望编写一个规则,为所有比目标更新的文件调用此程序一次。
我只想优化这个为每个更改的源调用generator
的Makefile。
SOURCES=$(wildcard *.source)
TARGETS=$(SOURCES:%.source=%.target)
all: $(TARGETS)
%.target : %.source
./generator $<
这可以按要求运作:
SOURCES=$(wildcard *.source)
all: target.timestamp
target.timestamp : $(SOURCES)
./generator $?
touch target.timestamp
我可以避免创建时间戳文件吗?
答案 0 :(得分:1)
您可以通过收集每个食谱中列表中的先决条件来实现 然后在假目标中进行综合操作:
SOURCES=$(wildcard *.source)
TARGETS=$(SOURCES:%.source=%.target)
all: collective_build
%.target : %.source
$(eval collective_src += $<)
# we do a cp to update the .target files
collective_build: $(TARGETS)
$(foreach f,$(collective_src),cp $(f) $(subst source,target,$(f)); )
但是您正在打破Pauls rule #2&#34;每个非.PHONY规则都必须使用其目标的确切名称更新文件。&#34;并且正在解开make的基础。
答案 1 :(得分:-1)
需要一个时间戳来知道是否运行 generator ;但您的生成器会构建一个文件列表,因此没有一个时间戳。
你写了两个有效的makefile,你知道的优点和缺点,没有别的选择。