我觉得这是一个相当普遍的问题,但我无法在任何地方找到答案。我有一个像这样的目标:
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领域缺乏专业知识;)
答案 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
中分成多个名称,您的机制将会中断。