【问题标题】:GNU Make - Set a flag if multiple files existGNU Make - 如果存在多个文件,则设置一个标志
【发布时间】:2016-07-25 22:45:12
【问题描述】:

在我的 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_LIST 中的所有文件都存在时,我想将OUTLIB_CACHE_EXISTS 标志设置为true。最好的方法是什么?

【问题讨论】:

    标签: bash makefile gnu-make


    【解决方案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 的第一个分支。


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

    【讨论】:

      【解决方案2】:

      不需要使用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】:

        如下简单定义 OUTLIB_CACHE_EXISTS

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

        【讨论】:

          【解决方案4】:

          这应该可以工作

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-28
            • 2020-05-21
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多