2011-05-19 18 views
0

我有一个基于生成文件的构建系统,它构建一些库和依赖关系,并将它们放入压缩归档中。 我有一个问题,在依赖链中删除中间依赖只会导致make构建整个部分。删除制造中的中间依赖关系

我的链看起来是这样的:

.PHONY: all 
all: targets 

objs/myprog: src/myprog.c 
    gcc -c $< -o [email protected] 

bin/myprog: objs/myprog 
    cp $< [email protected] 

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

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

如果我删除斌/ MYPROG然后运行make然后objs/myprog被编译,但它是复制到bin/myprog,归档重建。如果我再次运行make,则执行两个缺失的步骤。

任何想法,我可能做错了,或者这是打算的行为或缺点?

+1

'targets:archive.tar.gz bin/myprog objs/myprog'有点多余。它也可以是'targets:archive.tar.gz' – 2011-05-19 15:12:20

回答

0

你希望你的最终输出的规则是Makefile中的第一(即默认)规则 - 这个工程:

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

objs/myprog.o: src/myprog.c 
    gcc -c $< -o [email protected] 

bin/myprog.o: objs/myprog.o 
    cp $< [email protected] 
+0

对不起,我写了我的例子时有点太快了。我确实有一个“全部”的规则,这确实是第一个。我已更新我的问题以反映这一点。 – 2011-05-19 14:48:16

+0

@kigurai您更新的makefile对我来说工作正常。 – 2011-05-19 14:53:39

+0

这既是好消息,也是坏消息。好,因为它表明make实际上是理智的(在这种情况下),但是不好,因为那么问题就在我的makefile中。 :/ – 2011-05-19 14:56:04

-1

为我工作。

只要确保你的第一行是:

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

all: archive.tar.gz 
+0

我有一个初始的“全部”规则,请参阅更新的问题。为什么我需要首先有一个空行? – 2011-05-19 14:51:35

+0

IIRC,Makefile的结构说第一行是用于变量赋值的,并且在第一个规则之前需要一个空行作为分隔符。 – 2011-05-19 15:10:18

+1

*什么?*你有这方面的参考?什么版本的Make?我只是在第一行中尝试了一些实验(GNUMake 3.81),规则和变量似乎正常工作。 – Beta 2011-05-19 16:08:43

0

如果我删除斌/ MYPROG然后运行make然后OBJ文件/ MYPROG被编译,但不会复制到斌/ MYPROG和存档不会重建。如果我再运行make,那么执行两个缺失的步骤。

我似乎记得看到类似这样的行为时,一些在链中的目标是目录。目录的修改时间会随着更改中的任何内容而更新,因此目录通常比您预期的更新(具有合理性)。

它通常是最好的改写这样的规则,使目标和先决条件是代表相同的东西,适当的文件,即使你必须引入stampfile刚刚得到touched信号,它代表的目录已经长大-至今。

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