0

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

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 领域缺乏专业知识;)

4

1 回答 1

5

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

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

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

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

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

顺便说一句,如果您尝试tar在其路径或名称中包含空格的任何文件,请小心。这些将在变量中拆分为多个名称,$INITFS_FILES您的机制将中断。

于 2012-06-05T23:40:39.523 回答