Makefile目标永远不会满足

Cal*_*994 0 dependencies makefile target

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

initfs.tar: $(INITFS_FILES)
    rm -f ./initfs.tar
    cd initfs_root
    tar --format ustar --exclude-vcs -cf ../initfs.tar ./
Run Code Online (Sandbox Code Playgroud)

INITFS_FILES定义为:

INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f)
Run Code Online (Sandbox Code Playgroud)

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

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

Rei*_*eek 5

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

cd initfs_root
tar --format ustar --exclude-vcs -cf ../initfs.tar ./
Run Code Online (Sandbox Code Playgroud)

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

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

cd initfs_root; tar --format ustar --exclude-vcs -cf ../initfs.tar ./
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您试图tar在其路径或名称中包含空格,请务必小心.这些将在变量中分成多个名称$INITFS_FILES,您的机制将会中断.