【问题标题】:How to execute all makefile targets that match a wildcard如何执行与通配符匹配的所有makefile目标
【发布时间】:2019-08-16 08:50:40
【问题描述】:

给定一个 Makefile:

all: build/a build/b build/c    # need to change this to    all: build/*

build/a:
   ...

build/b:
   ...

build/c:
   ...

我想更改all 目标以自动构建与build/* 匹配的所有目标。 This question 似乎非常相似,只是它打印结果而不是对其进行操作。另外,我不确定该答案是否适用于 Linux 和 Mac。

【问题讨论】:

  • make $(grep -o ^build/[^:]* Makefile) 做你想做的事吗?
  • 这会让人感觉很hacky并且可能随时中断,包括潜在的无限循环......我希望有一个更“正确”的解决方案:)
  • 不确定这如何导致无限循环(参见 Make 在设计上对循环依赖是安全的),但是,正如您从引用的问题中看到的那样,任何解决方案都将包含某种正则表达式匹配/替换事物。所以它不可能是完美的,除非你重写 Makefile 本身。
  • 你能依赖 GNUmake 还是需要它是一个可移植的解决方案?
  • 很遗憾,它应该是便携的 :(

标签: makefile


【解决方案1】:

Make 没有内置这样的功能。而且,事实上,手动更新目标列表比任何替代解决方案都更简洁、更容易。就个人而言,我可能会从这样的事情开始:

# second expansion is needed to get the value of
# $(targets) after the whole file was preprocessed
.SECONDEXPANSION:
all: $$(targets)

targets += build/a
build/a:
    ...
targets += build/b
build/b:
    ...
targets += build/c
build/c:
    ...

我认为为每个目标添加一行 (targets+=xxx) 的要求对您来说不会那么烦人。

然而,这就是我们自己“预处理” Makefile 的方式:

# assume all targets are explicitly defined in Makefile
targets != grep -o '^ *build/\w* *:' Makefile | sed 's/^ *//;s/ *:$$//'
all: $(targets)

build/a:
    ...

build/b:
    ...

build/c:
    ...

当然,如果目标在包含的文件中,或者包含替换等,这将失败。但是,它适用于“简单情况”。

【讨论】:

  • 您能否介绍如何将make 的输出转换为makefile 本身内的目标列表?例如我在某个地方看到了我可以做的all: $(targets) - 我将如何创建 $targets ?谢谢!
  • 这正是我所需要的 - 纯粹在 Makefile 中,但我尝试这样做并迷失在 $$s 中:) 我的目标只是修改上面的 Makefile 以便运行 make all真正构建所有目标,即使其他人对其进行编辑并添加更多 build/... 条目。如果您可以稍微修改一下答案以以最跨平台的方式(如果可能)解决此问题,那就太好了。谢谢!!
  • 我希望 $targets 能够自动获取与模式匹配的 makefile 目标列表,而不是手动手动添加它们。我的问题中的示例——我希望第一行是all: $(targets),仅此而已。并且应该以某种方式为 $targets 分配一个值,而无需我列出“build/prog1 build/prog2 ...”,而不是重复下面列出的名称。我想避免有人添加新目标并忘记更新“全部:”中的列表的情况。我也不想要任何 CLI 参数 - 只是一个简单的 make all
  • Matt 你能用它更新主要答案,以便它更适合这个问题吗?我不想接受用户通过 cmets 实际获得结果所需的答案。谢谢你的好建议。另外,您能否将all: ;@$(MAKE) $$(grep -o ^build/[^:]* $(lastword $(MAKEFILE_LIST))) 分成两行——一行生成 $(target) var,另一行使用它?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多