【问题标题】:Makefile target is never satisfiedMakefile 目标永远不会满足
【发布时间】:2012-06-09 23:51:15
【问题描述】:

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

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

【问题讨论】:

  • INITFS_FILES 变量的内容是什么?
  • 我不认为INITFS_FILES 列表中的任何文件在未来都有疯狂的最后修改时间?
  • @sarnold 它包含“二进制文件 test.txt”

标签: makefile dependencies target


【解决方案1】:

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 中拆分为多个名称,您的机制将中断。

【讨论】:

  • @Reinier 解决了!我只是在 initfs 驱动程序的测试阶段,所以我没有对 initfs_root 进行任何重大更改。因为真的没有任何变化,我从来没有注意到它没有更新。另外,我强调不要在文件名中包含空格,除非我绝对必须(这基本上是从不,哈哈),但这是一个很好的观点。
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多