【问题标题】:Is it possible to execute all make commands that match a pattern?是否可以执行所有匹配模式的 make 命令?
【发布时间】:2022-06-22 18:46:01
【问题描述】:

假设我定义了几个 make PHONY 命令:

auto-build-foo
auto-build-bar
auto-build-biz
...
auto-build-inf

我可以通过bash 中配置autocompletion 的以下击键来观察它们:

$: make auto-build-<tab><tab>
auto-build-foo
auto-build-bar
auto-build-biz
...
auto-build-inf

那么我天生的unix本能就是这样写:

make auto-build-*

构建它们。


我知道这种事情需要在make 中作为一个特性来实现,makefile 作为某种规则系统,或者一些将bash-completion 历史与一些make 集成的自定义shell - 专门解释.

但是获得这个“开箱即用”会很酷而且很有用。

在 GNU make 中是否存在或将存在这样的机制?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    不,GNU Make 命令行参数不支持通配符。

    但是,您可以在bash 中轻松完成这项工作:

    • 一个接一个

    $ for t in $(sed -e '/auto-build/!d' -e 's/:.*$//' -e 's/\n/ /' Makefile); do make "$t" ; done

    • 立即

    $ my_targets=$(sed -e '/auto-build/!d' -e 's/:.*$//' -e 's/\n/ /' Makefile)

    $ make "$my_targets"

    从 Makefile 的角度来看,如果您自己创建,一种有效的方法是在每次编写目标时将目标封装在一个变量中:

    TARGET:=auto-build-foo
    $(TARGET):
        @echo "$@"
    
    ALL_TARGETS:=$(ALL_TARGETS) $(TARGET)
    
    TARGET:=auto-build-bar
    $(TARGET):
        @echo "$@"
    
    ALL_TARGETS:=$(ALL_TARGETS) $(TARGET)
    
    auto-all: $(ALL_TARGETS)
    
    .PHONY: auto-all
    

    将给予:

    $ make auto-all
    auto-build-foo
    auto-build-bar
    

    【讨论】:

    • 我很感激,但这似乎超出了限制。这个想法是有一些“运动”的东西,从指尖毫不费力。所以我会继续考虑这个并实施它。
    • 恐怕风险很大:一开始会有什么规则?反正 ?按字母顺序?如果你不写明确的规则/依赖,gnu make 怎么能算出目标的顺序?您的要求有点扭曲。无论如何,感谢您的赞赏,很抱歉没有回答您的问题。
    • 是的,它需要一个限制和一些纪律。
    【解决方案2】:

    我认为这样的功能不存在,因为许多 makefile 是用不完整的依赖图编写的;命令行参数——往往无处记录——是造成这种情况的主要原因。为foo 构建的目标在按原样为bar 重用时可能会引入错误——通常的过程是需要一个中间make clean 来防止这种情况。问题是,鉴于make 的当前(并且不太可能改变)执行逻辑,在一次运行中没有办法多次执行clean,更不用说以不违背@ 目的的顺序执行了987654326@(部分更新)。我认为 makefile 的原始用例更多是围绕单一用途的项目构建,而不是依赖项和批处理的交叉。从现代构建系统的角度来看,这似乎是一个缺点,OTOH 正是这种专注的简单性使其成为许多项目的选择方式。

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2021-10-03
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多