测试一个目录是否存在于makefile中

在他的回答@Grundlefleck解释如何检查一个目录是否存在。 我尝试了一些在makefile使用它,如下所示:

foo.bak: foo.bar
    echo "foo"
    if [ -d "~/Dropbox" ]; then
        echo "Dir exists"
    fi

运行make foo.bak (因为foo.bar存在)会产生以下错误:

echo "foo"
foo
if [ -d "~/Dropbox" ]; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [foo.bak] Error 2

我所做的解决方法是在独立的bash脚本中执行测试,并从makefile调用脚本。 但是,这听起来很麻烦。 有没有更好的方法来检查目录是否存在于makefile


如果shell命令必须在一行中,或者在多行上使用反斜线进行行扩展,则使命令生效。 所以,这种方法将起作用:

foo.bak: foo.bar
    echo "foo"
    if [ -d "~/Dropbox" ]; then echo "Dir exists"; fi

要么

foo.bak: foo.bar
    echo "foo"
    if [ -d "~/Dropbox" ]; then 
        echo "Dir exists"; 
    fi

这种方法具有最小的回声功能:

.PHONY: all
all:
ifneq ($(wildcard ~/Dropbox/.*),)
        @echo "Found ~/Dropbox."
else
        @echo "Did not find ~/Dropbox."
endif

在没有目录的情况下采取行动

如果您只需要知道某个目录是否不存在,并希望通过创建该目录来执行该操作,则可以使用普通的Makefile目标:

directory = ~/Dropbox

all: | $(directory)
    @echo "Continuation regardless of existence of ~/Dropbox"

$(directory):
    @echo "Folder $(directory) does not exist"
    mkdir -p $@

.PHONY: all

备注:

  • | 表明make不应该关心时间戳(这是一个仅限订单的先决条件)。
  • 而不是编写mkdir -p $@ ,您可以写入false来退出,或以不同的方式解决您的问题。
  • 如果您还需要在存在目录时运行特定的一系列指令,则不能使用上述内容。 换句话说,它相当于:

    if [ ! -d "~/Dropbox" ]; then
        echo "The ~/Dropbox folder does not exist"
    fi
    

    没有else声明。

    根据目录的存在采取行动

    如果你想要相反的if语句,这也是可能的:

    directory = $(wildcard ~/Dropbox)
    
    all: | $(directory)
        @echo "Continuation regardless of existence of ~/Dropbox"
    
    $(directory):
        @echo "Folder $(directory) exists"
    
    .PHONY: all $(directory)
    

    这相当于:

    if [ -d "~/Dropbox" ]; then
        echo "The ~/Dropbox folder does exist"
    fi
    

    再次,没有else声明。

    根据目录的存在和不存在进行处理

    这会变得更加麻烦,但最终会为这两种情况提供很好的目标:

    directory = ~/Dropbox
    dir_target = $(directory)-$(wildcard $(directory))
    dir_present = $(directory)-$(directory)
    dir_absent = $(directory)-
    
    all: | $(dir_target)
        @echo "Continuation regardless of existence of ~/Dropbox"
    
    $(dir_present):
        @echo "Folder $(directory) exists"
    
    $(dir_absent):
        @echo "Folder $(directory) does not exist"
    
    .PHONY: all
    

    这相当于:

    if [ -d "~/Dropbox" ]; then
        echo "The ~/Dropbox folder does exist"
    else
        echo "The ~/Dropbox folder does not exist"
    fi
    

    自然,通配符扩展可能比if-else语句慢。 但是,第三种情况可能非常罕见,只是为了完整而添加。

    链接地址: http://www.djcxy.com/p/17485.html

    上一篇: Test whether a directory exists inside a makefile

    下一篇: Checking if a directory exists in Unix (system call)