【问题标题】:How to use brace expansnsion in makefile prerequisites?如何在 makefile 先决条件中使用大括号扩展?
【发布时间】:2021-09-20 05:47:39
【问题描述】:

在 bash 中,我可以使用 src/{foo/{one,two},bar/{three,four}}.o 来描述文件:

src/foo/one.o
src/foo/two.o
src/bar/three.o
src/bar/four.o

我想以类似的方式描述生成文件目标的先决条件。有没有办法在 GNU Make 中实现这一点?

这就是我所拥有的:

SHELL:=/bin/bash

all: src/{foo/{one,two},bar/{three,four}}.o
    @echo "$(^)"

我得到:

make: *** No rule to make target 'src/{foo/{one,two},bar/{three,four}}.o', needed by 'all'.  Stop.

我遇到了thisthis 建议将SHELL=/usr/bin/bash 添加到makefile 的问题。但我仍然无法让它工作。

谢谢。

【问题讨论】:

  • make 使用自己的语言。这不是贝壳。阅读您的版本的文档,看看是否有可以使用的东西。
  • 感谢您让我阅读手册,我怎么没想到?
  • 您引用的链接提到将SHELL=/usr/bin/bash 添加到makefile,或通过make SHELL=/bin/bash 添加到操作系统级调用;在您的示例中,您在SHELL= 之间添加了一个额外的:;您可以尝试从您的代码中删除:,看看是否有效?显然验证你有正确的路径到你的本地bash,并且验证bash --version返回一个消息它确实是bash不会有什么坏处......“Duh,Mark!” ?
  • @markp-fuso,感谢您的投入,感谢您的宝贵时间。 bash 实际上位于 /bin/bash 中。和 := 几乎等同于 =。对于这种情况,没有区别。此外,我想出了一个问题的答案,我只是发布了希望将来其他人发现它有用。
  • @markp-fuso,您的方法似乎比我的方法麻烦得多。但是,我只是将:= 替换为=,并且行为是相同的。我错过了什么吗?

标签: bash makefile brace-expansion


【解决方案1】:

好的,所以 GNU make 有这个 shell 命令,单独在这里并不重要,因为大括号扩展是一个 bash 的东西,并且 make 使用 Bourne shell (/bin/sh)。但是,结合引用问题的建议,我可以这样做:

SHELL:=/bin/bash

all: $(shell echo src/{foo/{one,two},bar/{three,four}}.o)
    @echo "$(^)"

这样,大括号就正确展开了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多