代码之家  ›  专栏  ›  技术社区  ›  Ezk13

Make:如何将模式匹配的变量传递到列表

  •  0
  • Ezk13  · 技术社区  · 1 年前

    假设我在makefile中有一些变量:

    SUB_TEST1=PRJ1
    SUB_TEST2=PRJ2
    SUB_TEST3=PRJ3
    …
    

    我想获取这个变量列表,并将其放在列表中,然后将其传递给目标

    SUB_TEST1=PRJ1
    SUB_TEST2=PRJ2
    SUB_TEST3=PRJ3
    
    MYLIST:= $(wildcard SUB_*)
    # or
    # MYLIST:= $(foreach i,$(SUB_%),$(i))
    
    test:
        echo "my variables list: $(MYLIST)"
    …
    

    预期输出:

    my variables list: PRJ1 PRJ2 PRJ3 …
    

    我怎么能做那件事?

    2 回复  |  直到 1 年前
        1
  •  2
  •   Renaud Pacalet    1 年前

    使用GNU make,您可以尝试:

    MYLIST:= $(foreach v,$(filter SUB_%,$(.VARIABLES)),$(value $v))
    

    这个 .VARIABLE special变量扩展为迄今为止定义的所有全局变量的名称列表。 filter 只保留以开头的变量名 SUB_ . foreach 迭代找到的变量名。 value 展开变量。

    如果你 make 不是GNU制造的,您不能安装它,但您的 制作 支持GNU的一种或另一种形式 制作 shell 函数,或 != 变量赋值,您可以处理自己的 Makefile 例如。, sed :

    MYLIST != sed -n 's/^SUB_.*=\(.*\)/\1/p' Makefile
    

    但这与其说是一个可行的健壮解决方案,不如说是一种肮脏的黑客攻击。

        2
  •  0
  •   tripleee    1 年前

    不,没有将通配符应用于变量名的机制。

    如果像您的例子一样,您的变量是这样系统地命名的,那么您可以执行以下操作

    MYLIST := $(patsubst %,SUB_TEST%,$(shell bash -c 'echo  {1..3}'))
    

    但中缺乏任何算术工具 make 本身,以及默认shell的非常有限的算术功能 /bin/sh 基本上强制您使用外部实用程序来生成要循环的数字列表,并且您需要自己跟踪范围的顶部。(如果你不喜欢Bash,也许你喜欢 jot ; 或者您可以使用一个简单的Perl单行 perl -le 'print for 1..3' .)

    (您的语法表明您使用的是GNU 制作 。此语法不可移植到POSIX 制作 或其他变体,如BSD Make、Windows nmake