如何检查Makefile中的目录是否“不存在”?如果 [ !-d ... ] 始终返回 true

Cha*_*Kim 5 makefile

我想添加几行,以便如果某个目录(由 Makefile 变量 DIR1 设置)不存在,则 make 过程可能会出错。这是添加的部分,但即使我 DIR1 设置的目录存在,也会出错。例如,我创建了名为“dir1”的目录,但出现错误。怎么了?

DIR1 = dir1

.PHONY : check_dir

$(info DIR1 = $(DIR1))

check_dir:  
    if [ ! -d $(DIR1) ]; then \
        $(error "DIR1 does not exist! check Makefile!"); \
    fi
Run Code Online (Sandbox Code Playgroud)

这是运行结果。(我dir1在当前目录中有一个名为的目录)。

> ckim@chan-ubuntu:~/testmake/test1$ make  
> DIR1 = dir1 Makefile:8:
> *** "DIR1 does not exist! check Makefile!".  Stop.
Run Code Online (Sandbox Code Playgroud)

Ren*_*let 4

$(error ...)在将配方传递到 shell 之前,会通过 make 系统地扩展。因此,每次运行此配方时都会引发错误,与 shellif语句的结果无关。

仅使用 shell 结构:

check_dir:  
    if [ ! -d "$(DIR1)" ]; then \
        echo "$(DIR1) does not exist! check Makefile!"; \
        exit 1; \
    fi
Run Code Online (Sandbox Code Playgroud)

或者(更紧凑一点,如果不是更容易理解的话):

MESSAGE := $(DIR1) does not exist! check Makefile!
check_dir:  
    @[ -d "$(DIR1)" ] || { echo "$(MESSAGE)"; exit 1; }
Run Code Online (Sandbox Code Playgroud)

还有其他可能性,例如:

check_dir: $(DIR1)

$(DIR1):
    $(error $(DIR1) does not exist! check Makefile!)
Run Code Online (Sandbox Code Playgroud)

但这并不影响命名的文件$(DIR1)和目录。

注意:如果您想在 make 解析 Makefile 并发现目录不存在时引发错误,您可以使用该shell函数和 make 条件:

OK := $(shell if [ -d $(DIR1) ]; then echo "ok"; fi)

ifeq ($(OK),)
$(error $(DIR1) does not exist! check Makefile!)
endif
Run Code Online (Sandbox Code Playgroud)