Bash GNU Make-如果存在多个文件,则设置一个标志
在Makefile中,我检查文件是否存在,并根据检查结果执行不同的代码 以前,只有一个相关文件,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 现在,我将介绍第二个相关文件,将两个文件名存
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