【问题标题】:Makefile - fail if directory doesn't exist - cross platformMakefile - 如果目录不存在则失败 - 跨平台
【发布时间】:2023-03-25 05:04:01
【问题描述】:

我正在编写 Makefile 的安装部分,我想检查项目是否已构建,如果未构建,则安装应该失败。为此,我想检查某些目录是否存在,如果不存在 - 失败并出现适当的错误(例如“请先运行 make all”)。

我还希望这个 Makefile 可以在 Linux、Windows (mingw) 和 MacOS 上运行。

谁能帮我解决这个问题?

【问题讨论】:

    标签: makefile directory installation cross-platform


    【解决方案1】:

    如果您使用的是 GNU make 或支持 order-only prerequisites 的 make 版本,则有一个自然的解决方案。将这些目录声明为安装目标的仅订购先决条件:

    install: | $(DIRS)
        <install recipe>
    
    $(DIRS):
        @echo "please run make all first" && exit 1
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 mingw make,那么所有平台的答案都应该相同:

      dirs-exist:
              test -d dir1 || echo Run make install first && exit 2
              test -d dir2
      

      在第一个目录中,如果测试失败,我们使用 or 运算符打印一条消息。然而,即使我们成功打印了消息,我们也希望整行都失败,所以我们以错误代码 2 退出。 如果您希望在所有情况下都有消息,则可以将上述逻辑应用于每个目录。如果您有很多目录,可能会使用如下循环

      test_dirs:
          for d in dir1 dir2; do if test \!  -d $$d; then echo run make install first; exit 2; fi
      

      唯一的复杂性是如果您需要在 Windows 上使用 nmake 和 cmd;听起来这不是问题。

      【讨论】:

      • 谢谢!如果其中一个目录不存在,如何输出错误消息?
      【解决方案3】:

      @SamHarman 的回答是正确的(他之前发布过),所以你应该在他修复他的第一个例子后立即接受他的回答。无论如何,我想我也会发布这个,它是同一件事的一个略短且更令人困惑的版本...... :-)

      DIRS=dir1 dir2 dir3
      
      checkdirs:
              [[ 1 ${DIRS:%= && -d %} ]] || ( echo "uh oh..." && false );
      
      .PHONY: checkdirs
      

      【讨论】:

        猜你喜欢
        • 2016-01-23
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        相关资源
        最近更新 更多