Bash GNU Make-如果存在多个文件,则设置一个标志

Bash GNU Make-如果存在多个文件,则设置一个标志,bash,makefile,gnu-make,Bash,Makefile,Gnu Make,在Makefile中,我检查文件是否存在,并根据检查结果执行不同的代码 以前,只有一个相关文件,OUTLIB\u CACHE OUTLIB_CACHE := filename OUTLIB_CACHE_EXITS := $(shell if [ -f $(OUTLIB_CACHE) ]; then echo "1"; fi;) ifneq ($(OUTLIB_CACHE_EXISTS),1) # do something endif 现在,我将介绍第二个相关文件,将两个文件名存

在Makefile中,我检查文件是否存在,并根据检查结果执行不同的代码

以前,只有一个相关文件,
OUTLIB\u CACHE

OUTLIB_CACHE := filename
OUTLIB_CACHE_EXITS := $(shell if [ -f $(OUTLIB_CACHE) ]; then echo "1"; fi;)
ifneq ($(OUTLIB_CACHE_EXISTS),1)    
    # do something
endif
现在,我将介绍第二个相关文件,将两个文件名存储在一个列表中:

OUTLIB_CACHE_LIST := filename1 filename2

当且仅当
OUTLIB\u CACHE\u列表中的所有文件存在时,我想将
OUTLIB\u CACHE\u EXISTS
标志设置为true。执行此操作的最佳方法是什么?

您可以用命令替换
大纲视图缓存列表
的每个元素,然后在shell中执行生成的命令:

OUTLIB_CACHE_MISSING := $(shell $(patsubst %,test -e "%" || echo missing;,$(OUTLIB_CACHE_LIST)))
如果所有成员都存在,那么shell命令的输出将为空,否则它将为每个缺少的文件包含一个单词。您可以测试空性:

ifneq ($(OUTLIB_CACHE_MISSING),)    
    # do something
endif

如果你想知道哪些文件丢失了,你不能只替换
%
,因为
patsubst
只替换它找到的第一个
%
。相反,您可以使用
foreach

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";))

将所有这些放在一个可测试的示例中:

OUTLIB_CACHE_LIST := /etc /bin
#OUTLIB_CACHE_LIST += /nonexistent

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";))

.PHONY: all

all:
ifneq ($(OUTLIB_CACHE_MISSING),)
    false "$(OUTLIB_CACHE_MISSING)"
else
    true "No missing files"
endif
如果
,则取消第二行的注释以选择
的第一个分支



注意:您想知道这些文件是否存在,所以我使用了
test-e
,而不是
-f
-r
。您将知道哪个测试实际上适合您的情况…

您可以用命令替换
OUTLIB\u CACHE\u LIST
的每个元素,然后在shell中执行生成的命令:

OUTLIB_CACHE_MISSING := $(shell $(patsubst %,test -e "%" || echo missing;,$(OUTLIB_CACHE_LIST)))
如果所有成员都存在,那么shell命令的输出将为空,否则它将为每个缺少的文件包含一个单词。您可以测试空性:

ifneq ($(OUTLIB_CACHE_MISSING),)    
    # do something
endif

如果你想知道哪些文件丢失了,你不能只替换
%
,因为
patsubst
只替换它找到的第一个
%
。相反,您可以使用
foreach

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";))

将所有这些放在一个可测试的示例中:

OUTLIB_CACHE_LIST := /etc /bin
#OUTLIB_CACHE_LIST += /nonexistent

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";))

.PHONY: all

all:
ifneq ($(OUTLIB_CACHE_MISSING),)
    false "$(OUTLIB_CACHE_MISSING)"
else
    true "No missing files"
endif
如果
,则取消第二行的注释以选择
的第一个分支



注意:您想知道这些文件是否存在,所以我使用了
test-e
,而不是
-f
-r
。您将知道哪种测试实际上适合您的情况…

只需定义OUTLIB_CACHE_,如下所示

OUTLIB_CACHE_EXISTS := $(shell if ls $(OUTLIB_CACHE_LIST) >/dev/null 2>&1; then echo "1"; fi)

只需按如下方式定义OUTLIB_缓存_

OUTLIB_CACHE_EXISTS := $(shell if ls $(OUTLIB_CACHE_LIST) >/dev/null 2>&1; then echo "1"; fi)

不需要使用shell函数来测试make中是否存在多个文件。我使用以下构造使
make
为非常复杂的makefile输出适当的错误消息。如果需要的话,我想你可以根据自己的需要来采用它。最初的想法(可能)来自


不需要使用shell函数来测试make中是否存在多个文件。我使用以下构造使
make
为非常复杂的makefile输出适当的错误消息。如果需要的话,我想你可以根据自己的需要来采用它。最初的想法(可能)来自

这应该行得通

ifeq ($(OUTLIB_CACHE_LIST),$(wildcard $(OUTLIB_CACHE_LIST)))
# do something
endif
这应该行得通

ifeq ($(OUTLIB_CACHE_LIST),$(wildcard $(OUTLIB_CACHE_LIST)))
# do something
endif