【问题标题】:How to avoid "No such file or directory" Error for `make clean` Makefile target如何避免`make clean` Makefile目标的“没有这样的文件或目录”错误
【发布时间】:2014-03-23 20:11:57
【问题描述】:

我有一个 Makefile,它定义了一个用于清理 .o 文件和可执行文件的 .PHONY 清理目标,该目标如下所示:

...
.PHONY : clean
clean:
    rm $(addprefix $(vq_DIR),$(vq_OBJS)) \
       $(addprefix $(vq_DIR),vq) \
       $(addprefix $(covq_DIR),$(covq_OBJS)) \
       $(addprefix $(covq_DIR),covq) \
       $(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \
       $(addprefix $(covq_2_DIR),covq_2) \
       $(addprefix $(covq_2_DIR),$(test_OBJS)) \
       $(addprefix $(covq_2_DIR),test)

一切正常,但是当其中一些文件不存在时,rm 会引发错误(没有这样的文件或目录),并且输出显示 Makefile 目标失败,而它显然做了我想要的.

有没有一种好方法可以基本上告诉rm 命令“如果这些文件存在则删除它们,如果它们不存在则不要抱怨”?我在手册页中查找了rm,并没有找到这样的标志。

编辑:实际上我没有注意到手册页中-f标志的描述,这是解决方案。

【问题讨论】:

    标签: linux makefile rm


    【解决方案1】:

    在您的cleanrule 中使用rm -f(或者更好的$(RM),由内置make 规则提供,可以使用make -p 找到)而不是rm

    【讨论】:

    • 谢谢!我实际上必须略过那个选项。手册页正是我所需要的,即ignore nonexistent files and arguments, never prompt
    • 更好:使用$(RM),它是由GNU Makefile自动定义的。
    【解决方案2】:

    rm -f

    将 FORCE 并且不输出任何错误

    【讨论】:

      【解决方案3】:

      当目标失败时

      当一个目标被执行时,它会根据是否返回一个状态 它是成功的——如果一个目标失败,那么 make 将不会执行任何 依赖它的目标。例如,在上面的例子中,如果 “clean”失败,那么rebuild将不会执行“build”目标。 不幸的是,如果没有要删除的核心文件,这可能会发生。 幸运的是,这个问题可以很容易地通过包含一个 应忽略状态的命令前面的减号:

      clean:
              -rm -f *.o core
      

      ~http://www.cprogramming.com/tutorial/makefiles.html

      【讨论】:

      • 如果你执行make clean,它不会被忽略。在我看来,只有当这个目标是对另一个目标的依赖时,它才会被忽略。
      【解决方案4】:

      聚会迟到了,但这里有另一个解决方案适用于我们古怪的构建环境:

      if exist *.exe rm -f *.exe
      

      不是免费输出,而是减少并干净退出:

      # make clean
              if exist *.exe rm -f *.exe
      

      在解决这个问题之前,我尝试了很多替代方案。

      【讨论】:

        【解决方案5】:

        我已经放弃了 rm。 以下命令将删除文件和目录。

        find . -delete
        

        要仅删除文件或仅删除目录,可以使用 -type 选项:

        # remove only files
        find . -type f -delete
        
        
        # remove only dirs
        find . -type d -delete
        

        实际上,我创建了一个小脚本(基于那个 sn-p),命名为炸弹,它可以删除文件而不会抱怨:https://github.com/lingtalfi/bomb

        【讨论】:

          猜你喜欢
          • 2018-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-11
          相关资源
          最近更新 更多