【问题标题】:Use match stem in wildcard in makefile在生成文件中使用通配符中的匹配词干
【发布时间】:2020-07-22 06:03:15
【问题描述】:

像这样的Makefile

list-%: $(wildcard src/modules/%/*.ts)
    echo '?' $? - '@' $@ - '%' $% - '<' $< - '^' $^ - '+' $+ - '|' $| - '*' $*

但依赖项无法按预期工作。 make list-test 的输出是

echo '?'  - '@' list-test - '%'  - '<'  - '^'  - '+'  - '|'  - '*' test
? - @ list-test - % - < - ^ - + - | - * test

如果改为$(wildcard src/modules/test/*.ts),则输出变为

echo '?' src/modules/test/index.ts - '@' list-test - '%'  - '<' src/modules/test/index.ts - '^' src/modules/test/index.ts - '+' src/modules/test/index.ts - '|'  - '*' test
? src/modules/test/index.ts - @ list-test - % - < src/modules/test/index.ts - ^ src/modules/test/index.ts - + src/modules/test/index.ts - | - * test

我怎样才能使$(wildcard src/modules/%/*.ts) 工作?

【问题讨论】:

    标签: makefile build gnu-make


    【解决方案1】:

    有一种方法可以做到这一点,使用Secondary Expansion。它允许在% 与字符串匹配之后 对先决条件进行第二次扩展:

    .SECONDEXPANSION:
    
    list-%: $$(wildcard src/modules/%/*.ts)
        echo '?' $? - '@' $@ - '%' $% - '<' $< - '^' $^ - '+' $+ - '|' $| - '*' $*
    

    注意$$在读入阶段,$$(wildcard src/modules/%/*.ts) 扩展为$(wildcard src/modules/%/*.ts)。然后 Make 选择此模式规则作为构建 list-foo 的一种方式,并在第二个扩展中 $(wildcard src/modules/foo/*.ts) 扩展为文件名列表。

    【讨论】:

      【解决方案2】:

      我怎样才能使这个 $(wildcard src/modules/%/*.ts) 工作?

      很遗憾,你不能。 % 仅在先决条件中以非常有限的方式工作。在所有 make 函数已经被评估之后,它被用作最后一个伪通配符,因此没有模式和函数的交互 - 我可能会想到一些递归构造,但这对于这样一个简单的任务来说太过分了.相反,您可以摆脱编程依赖项:

      MODULES := a b c
      
      all: $(MODULES:%=list-%)
              @echo DONE
      
      # generate dependencies programmatically:
      $(foreach m,$(MODULES),$(eval list-$(m): $(wildcard src/modules/$(m)/*.ts)))
      
      list-%:
              @echo $^
              @echo $@
      

      请注意,对于普通目标而言,将依赖项列表分布在多个目标:先决条件语句和另一个规则中的配方是完全合法的。唯一需要注意的是,如果您的列表中有一个不存在的模块,那么它将使用一个空的先决条件列表来执行该模块,并失败并显示可能难以理解的错误消息。

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 2015-07-24
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        相关资源
        最近更新 更多