【问题标题】:Specifying wild card patterns when invoking make targets在调用 make 目标时指定通配符模式
【发布时间】:2021-12-30 16:07:57
【问题描述】:

假设我定义:

# makefile
.FORCE:

foo-bar: .FORCE
  @echo "$@"

foo-biz: .FORCE
  @echo "$@"

.PHONY: foo-bar foo-biz

我在命令行上写:

$: make foo-bar foo-biz

那么有没有办法让我以某种方式写:

$: make foo-*

例如?

【问题讨论】:

  • 您必须在您的 makefile 中添加一个虚假的无操作规则 foo: foo-bar foo-baz。换句话说,不是真的。
  • 可以写一个makefile来做你想做的事,即从目标foo-*推断你想要构建所有以foo-开头的目标,但是这将是一个非常可怕的野兽。所以如果你真的需要它,或者你想挑战自己,当然;如果您正在寻找一种快速的解决方案来节省一些工作量,那就不用了。
  • @Beta 如果我们将解决方案限制为一个原生支持的% 通配符,则解决方案并不可怕,请参阅下面的答案

标签: makefile gnu-make


【解决方案1】:

这可行,但它只支持原生make 模式匹配的一个% 通配符。而且我没有分析它对模式规则等的影响。

PATTERN_GOALS := $(foreach g,$(MAKECMDGOALS),$(if $(findstring %,$(g)),$(g)))
force-on-pattern = $$(if $$(filter $(PATTERN_GOALS),$$@),$$(eval FORCE+=$$@))

# make FORCE a simple expanded variable
FORCE := 


.SECONDEXPANSION:

foo: $(force-on-pattern)
    echo $@

fooa: $(force-on-pattern)
    echo $@

fooab: $(force-on-pattern)
    echo $@

foob: $(force-on-pattern)
    echo $@

$(PATTERN_GOALS): $$(FORCE) ;

测试:

$ make foo%
fooab
fooa
foob
foo

$ make fooa%
fooab
fooa

$ make fooab%
fooab

$ make fooab
echo fooab
fooab

$ make foo%b
fooab
foob

您可以查看GNUmake table toolkit,特别是glob-match 函数,用于make-native glob 匹配器,但正如@Beta 所注意到的,这是“可怕的野兽”make 编程的领域。

【讨论】:

    【解决方案2】:

    这是一个想法。由于在 make 程序启动之前就在 shell 中进行了 globbing,因此您可以在存储库中将文件命名为您希望 globbable 的规则:

    touch foo-bar foo-biz
    make foo-*
    # executes 'make foo-bar foo-biz'
    

    这也适用于真实文件(不仅仅是 .FORCE 或 PHONY),但前提是文件已经存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多