从先决条件动态排除目标文件以避免循环依赖

时间:2014-07-21 21:17:46

标签: makefile target circular-dependency prerequisites

我正在尝试构建目标文件(使用GNU make),如果它的任何周围文件(同一目录中相同类型的文件)已更改。这似乎很简单,但我找不到解决方案。以下是该makefile的关键行:

dir/%.Rd: file1 file2 dir/*.Rd
    ...

/dir中包含40-50 * .Rd文件(包括%.Rd)。虽然make会自动删除循环依赖项(上面的代码确实有效),但我想根据自身删除%.Rd的循环。我试过了:

1)

dir/%.Rd: file1 file2 $(filter-out %, dir/*.Rd)   # doesn't work; likely because % doesn't have meaning at this point -- second expansion
    ...

2)

dir/%.Rd: file1 file2 $(filter-out $@, dir/*.Rd)  # doesn't appear to work: circular dependency warning
    ...

3)

dir/%.Rd: file1 file2 $$(filter-out $$@, dir/*.Rd)  # same
    ...

4)

.SECONDEXPANSION:
dir/%.Rd: file1 file2 $$(filter-out $$@, dir/*.Rd)  # same
    ...

这似乎是一个相对简单的问题,我确信我很接近。非常感谢任何解决方案/建议/解决方法。

提前致谢...

1 个答案:

答案 0 :(得分:0)

这可能是做你想做的最不可怕的方式:

RD := $(wildcard *.Rd)

ifneq ($(TARG),)
RD := $(filter-out $(TARG),$(RD))
$(TARG): $(RD)
    do something to update $@
endif

rebuild_%:
    @$(MAKE) $*.rd TARG=$*.Rd

现在make rebuild_myfile将更新myfile.Rd当且仅当它不是目录中最新的Rd文件时,才会有循环依赖。