Makefile:如果通过调用一个程序可以满足一组目标会怎么样?

时间:2017-10-14 11:40:37

标签: makefile

我们假设我有一个程序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

我可以避免创建时间戳文件吗?

2 个答案:

答案 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,你知道的优点和缺点,没有别的选择。