我有一个基于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
,则会执行两个缺失的步骤。
任何想法我可能做错了,或者这是预期的行为还是制造的缺点?
答案 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