删除Make中的中间依赖项

时间:2011-05-19 14:28:11

标签: dependencies makefile

我有一个基于makefile的构建系统,它构建了一些库和依赖项,并将它们放在一个压缩的存档中。 我有一个问题,即在依赖链中删除中间依赖项只会导致make构建整个部分。

我的链看起来像这样:

.PHONY: all
all: targets

objs/myprog: src/myprog.c
    gcc -c $< -o $@

bin/myprog: objs/myprog
    cp $< $@

archive.tar.gz: bin/myprog
    cd bin && tar -czf ../archive.tar.gz *

.PHONY: targets
targets: archive.tar.gz bin/myprog objs/myprog

如果我删除了bin / myprog,然后运行make,那么objs/myprog就会被编译,但 >被复制到bin/myprog并且存档重建。如果我再次运行make,则会执行两个缺失的步骤。

任何想法我可能做错了,或者这是预期的行为还是制造的缺点?

3 个答案:

答案 0 :(得分:0)

您希望最终输出规则成为Makefile中的第一个(即默认)规则 - 这有效:

archive.tar.gz: bin/myprog.o
    cd bin && tar -czf ../archive.tar.gz *

objs/myprog.o: src/myprog.c
    gcc -c $< -o $@

bin/myprog.o: objs/myprog.o
    cp $< $@

答案 1 :(得分:0)

  

如果我删除bin / myprog然后运行make,则编译objs / myprog,但不会将其复制到bin / myprog并且不会重建存档。如果我再次运行make,那么就会执行两个缺失的步骤。

当链中的某些目标是目录时,我似乎回想起这样的行为。无论何时发生变化,目录的修改时间都会更新,因此目录通常比您预期的更新(在构思上)。

通常最好重写这些规则,以便目标和先决条件是代表相同内容的正确文件,即使你必须引入一个只有touched才能发出信号的戳文件它所代表的目录已经更新了。

你说你问题中的makefile是你真实的。真正的目录是否有任何目录作为此链中的目标?

答案 2 :(得分:-1)

适合我。

请确保您的第一行是:

 # don't forget an empty line at the beginning of the Makefile.

 all: archive.tar.gz