2017-10-17 68 views
0

我正在写一个Makefile安装的一部分,我想检查,如果该项目建成,如果不安装应该失败。为了这个目的,我想检查是否存在特定的目录,如果没有 - 失败,并显示相应的错误(像“请运行使所有第一”)。Makefile文件 - 如果目录不存在失败 - 跨平台

我也希望这个Makefile到在Linux,Windows(MinGW的)和MacOS工作。

任何人都可以帮助我吗?

回答

3

如果您正在使用GNU拨打或版本作出支持order-only prerequisites,有一个自然的解决方案。将这些目录声明为安装目标的仅限订单的前提条件:

install: | $(DIRS) 
    <install recipe> 

$(DIRS): 
    @echo "please run make all first" && exit 1 
1

如果你使用MinGW的牌子,那么答案sholud是相同的所有平台:

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

在我们使用或运营商如果测试打印失败的消息的第一个目录。然而,即使我们成功打印的消息,我们希望全线失败,所以如果你想在所有情况下,消息我们出口与2 上述逻辑的错误代码可以应用到每一个目录。如果你有很多的目录,类似下面的循环可能会奏效

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

,如果你需要这种与NMAKE和CMD窗口上的工作,唯一的复杂性会;听起来像这不是一个问题。

+0

谢谢!如果其中一个目录不存在,如何输出错误消息? – fx23

+0

我认为你需要周围的回声和出口(由于操作precidence)括号... – HardcoreHenry

1

@ SamHarman的答案是正确的(他更早公布),所以你应该尽快接受他的答案,他修复他的第一个例子。在任何情况下,我想我会张贴此为好,这是同样的事情稍短及略微更混乱的版本... :-)

DIRS=dir1 dir2 dir3 

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

.PHONY: checkdirs