只需要执行一次的makefile目标

makefile goal that only needs to be executed once

我想从目录中的 a.tar.gz 生成 a.txt。我尝试在 Makefile 中编写以下目标:

a.txt: a.tar.gz
  tar xvf a.tar.gz

这有效,但在 运行 压缩一次后 a.tar.gz 被解压缩并且不再存在。随后 make 失败。我如何编写一个目标来检查 a.txt 是否不存在,如果存在 运行 tar,否则什么都不做?

'test' 或“[”和“]”可以做到这一点。

a.txt:
   if [ -e a.tar.gz ]; then \
   tar xvf a.tar.gz \
   fi

wildcard 只会扩展到至少能找到一个文件的内容:

a.txt: $(wildcard a.tar.gz)
    tar xvmf $<

添加 m 标志将避免不必要的重制。

如果这两个文件都不存在,则该规则将失败,但如果不知道您到底要做什么,就很难提供全面的解决方案。