Dependencies 删除Make中的中间依赖项

Dependencies 删除Make中的中间依赖项,dependencies,makefile,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

我有一个基于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,那么将执行缺少的两个步骤


你知道我可能做错了什么,或者这是make的预期行为还是缺点吗?

你希望最终的输出规则是make文件中的第一条,即默认规则-这是有效的:

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 $< $@
对我有用

只需确保您的第一行是:

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

 all: archive.tar.gz
如果删除bin/myprog,然后运行make,则会编译objs/myprog,但不会将其复制到bin/myprog,也不会重建存档。如果我再次运行make,那么将执行缺少的两个步骤

我似乎记得当链中的一些目标是目录时,会看到这样的行为。每当目录中的任何内容发生更改时,目录的修改时间都会更新,因此目录通常比您预期的更为最新

通常最好重写这样的规则,以便目标和先决条件是表示相同内容的适当文件,即使您必须引入一个stampfile,该stampfile只是用来表示它所表示的目录已被更新


你说你问题中的makefile是你真实问题的精确答案。在这个链中,真正的一个是否有任何目录作为目标?

对不起,我在编写示例时有点太快了。我确实有一个所有规则,这确实是第一条。我更新了我的问题以反映这一点。这既是好消息也是坏消息。很好,因为它表明make在这种情况下实际上是正常的,但不好,因为问题出在我的make文件中的某个地方/我有一个初始的all规则,请参见更新的问题。为什么我需要先有一个空行?IIRC,Makefile的结构说,第一行用于变量赋值,在第一条规则之前需要一个空行作为分隔符。什么?你有这方面的参考资料吗?什么版本的Make?我刚刚尝试了一些实验,GNUMake 3.81在第一行有一条规则,规则和变量似乎工作正常。这肯定不是真的。您可以在任何地方分配变量,并且不需要初始空行。任何数量的教程和手册都会证实这一点。这个知识可能已经过时,您当然可以在任何软件中分配变量,但是,好吧,在第一个空行之前的规则可能不会达到您预期的效果。目标:archive.tar.gz bin/myprog objs/myprog有点多余。它也可以是目标:archive.tar.gz