如何执行与通配符匹配的所有makefile目标

如何执行与通配符匹配的所有makefile目标,makefile,Makefile,给定一个Makefile: all: build/a build/b build/c # need to change this to all: build/* build/a: ... build/b: ... build/c: ... 我想将all目标更改为自动生成与build/*匹配的所有目标。似乎非常相似,只是它打印结果而不是对结果执行操作。另外,我不确定这个答案是否适用于Linux和Mac。Make没有内置这样的功能。事实上,手动更新目标列表比任

给定一个Makefile:

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

build/a:
   ...

build/b:
   ...

build/c:
   ...


我想将
all
目标更改为自动生成与
build/*
匹配的所有目标。似乎非常相似,只是它打印结果而不是对结果执行操作。另外,我不确定这个答案是否适用于Linux和Mac。

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:
    ...

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

是否
生成$(grep-o^build/[^:]*Makefile)
做你想做的事?这会让人感觉非常不舒服,并且可能随时中断,包括潜在的无限循环。。。我希望有一个更“合适”的解决方案:)不确定这如何会导致无限循环(参见Make在设计上对循环依赖是安全的),但是,正如您从引用的问题中所看到的,任何解决方案都将包含某种regex匹配/替换内容。所以它不可能是完美的,除非你重写Makefile本身。你能依赖GNUmake吗,或者它需要是一个可移植的解决方案吗?不幸的是,它应该是可移植的:(你能介绍一下如何将
make
的输出转换成Makefile本身中的目标列表吗?例如,我看到了一个我可以做
all:$(目标)的地方)
--我将如何创建$targets?Thx!这正是我所需要的-纯粹在生成文件中,但我尝试过这样做,但在$$s:)中迷失了方向。我的目标只是修改上面的生成文件,以便运行
make all
可以真正构建所有目标,即使其他人编辑了它并添加了一些
build/…
条目。如果您可以修改一下答案,以最跨平台的方式解决这个问题(如果可能的话),那就太好了。非常感谢。我希望$targets能够自动获得与模式匹配的makefile目标列表,而不是手动添加它们。我问题中的示例——我希望第一行是
all:$(targets)
,而不是其他任何内容。而且,应该以某种方式为$targets分配一个值,而不需要我列出“build/prog1 build/prog2…”,而不是重复下面列出的名称。我希望避免出现这样的情况:有人添加了一个新目标,却忘记了更新“all:”中的列表。我也不想要任何CLI参数-只是一个简单的
make all
。Matt您能用它更新主要答案吗,这样它会更适合这个问题吗?我不想接受用户需要通过评论才能真正得到结果的答案。谢谢你的建议。另外,您是否可以拆分
all:@$(MAKE)$$(grep-o^build/[^::::]*$(lastword$(MAKEFILE_LIST))
分成两行——一行生成$(target)var,另一行使用它?谢谢