代码之家  ›  专栏  ›  技术社区  ›  seladb

Makefile-目录不存在时失败-跨平台

  •  0
  • seladb  · 技术社区  · 7 年前

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

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

    有人能帮我吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Renaud Pacalet    7 年前

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

    install: | $(DIRS)
        <install recipe>
    
    $(DIRS):
        @echo "please run make all first" && exit 1
    
        2
  •  1
  •   Sam Hartman    7 年前

    如果您使用的是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
  •  1
  •   HardcoreHenry    7 年前

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

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