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

时间:2016-04-05 19:49:35

标签: bash makefile gnu-make

在我的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。最好的方法是什么?

4 个答案:

答案 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