在我的Makefile中,我检查文件是否存在,并根据检查结果执行不同的代码。
以前,只有一个相关文件OUTLIB_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_CACHE_EXISTS
中的所有文件都存在时,我想将OUTLIB_CACHE_LIST
标志设置为true。最好的方法是什么?
答案 0 :(得分:1)
您可以使用命令替换OUTLIB_CACHE_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
取消注释第二行以选择if
的第一个分支。
N.B。您想知道文件是否存在,因此我使用了test -e
而不是-f
或-r
。您将知道哪种测试实际适合您的情况...
答案 1 :(得分:1)
只需按如下方式定义OUTLIB_CACHE_EXISTS
即可OUTLIB_CACHE_EXISTS := $(shell if ls $(OUTLIB_CACHE_LIST) >/dev/null 2>&1; then echo "1"; fi)
答案 2 :(得分:0)
无需使用shell函数来测试make中是否存在多个文件。我使用以下构造为make
输出一个非常复杂的makefile的错误消息。我认为如果需要你可以根据自己的需要采用它。最初的想法(可能)来自https://stackoverflow.com/a/20566812/1905491。
$(foreach p,$(ALL_INCLUDES),$(if $(wildcard $(p)),,$(info $(p) does not exist!) $(eval err:=yes)))
$(if $(err),$(error Aborting),)
答案 3 :(得分:0)
这应该有效
ifeq ($(OUTLIB_CACHE_LIST),$(wildcard $(OUTLIB_CACHE_LIST)))
# do something
endif