Makefile - 如果目录不存在则失败 - 跨平台

时间:2017-10-17 20:43:59

标签: makefile directory install cross-platform

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

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

任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:3)

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

install: | $(DIRS)
    <install recipe>

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

答案 1 :(得分:1)

如果您正在使用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;听起来这不是问题。

答案 2 :(得分:1)

@SamHarman的回答是正确的(他早些时候发布过),所以你应该在他修复他的第一个例子后立即接受他的回答。在任何情况下,我都认为我也会发布这个,这是一个稍短且稍微混淆相同的版本......: - )

DIRS=dir1 dir2 dir3

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

.PHONY: checkdirs