Makefile目标永远不会满足

时间:2012-06-05 22:58:03

标签: makefile dependencies target

我觉得这是一个相当普遍的问题,但我无法在任何地方找到答案。我有一个像这样的目标:

initfs.tar: $(INITFS_FILES)
    rm -f ./initfs.tar
    cd initfs_root
    tar --format ustar --exclude-vcs -cf ../initfs.tar ./

定义INITFS_FILES:

INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f)

每次拨打make initfs.tar时,都会运行此目标。在initfs_root目录中没有触及任何文件(并且使用该find命令找到所有文件)。确实创建了initfs.tar。

有没有人知道为什么会这样?这对我来说没有意义,根据我在互联网上遇到的所有其他帖子以及我目前的专业知识,我认为一切都是正确的(尽管显然,我在Makefile领域缺乏专业知识;)

1 个答案:

答案 0 :(得分:5)

make中的每个命令都在每个命令行的新子shell中执行。这意味着命令

cd initfs_root
tar --format ustar --exclude-vcs -cf ../initfs.tar ./

在两个不同的子壳中执行。因此,tar命令不会以initfs_root目录作为其工作目录执行。

您可以通过将两者合并为一个命令行来避免这种情况:

cd initfs_root; tar --format ustar --exclude-vcs -cf ../initfs.tar ./

顺便提一下,如果您尝试tar的任何文件的路径或名称中都有空格,请务必小心。这些将在变量$INITFS_FILES中分成多个名称,您的机制将会中断。