代码之家  ›  专栏  ›  技术社区  ›  Jeremy L.

在变量名中查找子字符串

  •  0
  • Jeremy L.  · 技术社区  · 6 月前

    我试图检查一个变量是否包含特定的字符串。我在这里尝试了一个解决方案: Makefile : contains string 但就我而言,这似乎行不通。

    @echo $(findstring 2025, $(basename $(<F)))`
    

    退货 2025 ,但是:

    ifeq ($(findstring 2025, $(basename $(<F))),2025)
        @echo $(findstring 2025, $(basename $(<F)))
    endif
    

    不返回 2025 为什么?

    2 回复  |  直到 6 月前
        1
  •  1
  •   MadScientist    6 月前

    如果你需要帮助,特别是在makefile方面,你必须提供一个最小但功能齐全的示例。Makefile是 极其 依赖于上下文,所以通常某物的行为完全取决于它在makefile中的位置:它在配方中吗?在变量赋值中?等。

    在您的情况下,您正在使用 ifeq 既然你没有说你有语法错误,那一定是 在食谱中。 ifeq make关键字不是有效的shell命令,因此它不能在配方中。

    如果您查看以下文档 automatic variables 喜欢 $(<F) 你会发现它们只在食谱上下文中设置。所以你永远不能在 ifeq 条件语句:它们将始终是空字符串。

    如果没有更多关于你想做什么的信息,我们只能说这些。

        2
  •  0
  •   HardcoreHenry    6 月前

    您的问题与makefile的运行阶段有关。我假设你运行的是这样的东西:

    file:=file2025.c
    
    
    all: $(file)
            @echo "building $@ (echo)  F=$(<F)"
            $(info building $@ (info)  F=$(<F))
    ifeq ($(findstring 2025, $(basename $(<F))),2025$(info processing ifeq... F=[$(<F)]))
            $(info this is not run, as it is ifeqed out)
            @echo "2: (in ifeq)" $(findstring 2025, $(basename $(<F)))
    endif
    
    
    .PHONY: $(file)
    

    这将输出:

    > make
    processing ifeq... <F=[]
    building all (info)
    building all (echo)
    1: 2025
    

    说明:

    注: $(info) 的是makefile构造——它们什么也不展开,但它们有向控制台吐出文本的副作用 此时,它们正在扩展 (这意味着我可以坚持 $(info...) 到最后 ifeq 在不影响其功能的前提下。。。它将在评估ifeq时输出一些东西)。

    Make将首先解析全局上下文中的所有内容(不以制表符开头的行…)。一旦完成此操作,它将决定运行哪些食谱等,它将在运行食谱之前解析食谱行,以及 然后 执行他们。

    在这种情况下,请注意 ifeq 该语句在考虑运行配方之前就已被解析,因为它不是以制表符开头的。此时 $(<F) 是空白的,里面什么都没有 ifeq 扩大。

    您还应该注意到 info 在输出之前运行 echo ,作为 $(信息) 在配方实际运行之前进行扩展。

    简而言之,你应该避免在食谱中使用makefile条件语句,除非你真的知道自己在做什么。更好的方法是在配方中的bash条件中使用makefile变量,如下所示:

    all2: $(file)
        @echo building $@ -- F=$(<F)
        @if [ $(findstring 2025, $(basename $(<F))) ]; then \
             echo "file has 2025" \
         fi