是否可以在 Makefile 中拥有一个与其他几个目标等效的目标,而无需明确列出它们?比如:
all: task-*
task-name1:
do something
task-name2:
do something else
...
task-name(a big number):
do yet something else
任务可能非常不同,并且是一一指定的,但我想通过键入 make 来完成所有任务。由于名称中没有系统性,因此保留所有目标的明确列表是乏味的。
make 本身没有类似的东西。
如果您愿意遵守某些命名约定,您可以使用以下内容自行搜索 makefile:
ALL_TASKS := $(sort $(shell sed -n 's/^ *\(task-[^:]*\):.*/\1/p' Makefile))
all: $(ALL_TASKS)
如果您不介意将
Makefile
分成多个文件,另一种方法是让主版 Makefile
简单地包含:
all: $(addsuffix .done,$(wildcard tasks/*))
include tasks/*
然后创建一个子目录
tasks
,其中包含一个名为 name1
的文件,其中包含针对目标 tasks/name1.done
的单个规则等(如果您愿意将各个任务目标文件放在同一目录中,则可以可以使用前缀 task-
或类似的前缀来代替 tasks/
。)
为了减少必须记住在
tasks/abc.done:
的第一行输入 tasks/abc
的开销,您可以通过 generate 自动在这些行前面添加,例如:
all: $(addsuffix .done,$(wildcard tasks/*))
generated/tasks/%: tasks/%
mkdir -p $(@D)
perl -lne 'BEGIN { print "$<.done:" } print "\t$$_"' > $@
include $(addprefix generated/,$(wildcard tasks/*))
上面还在
tasks/*
下生成文件时对generated/tasks
文件中的每一行进行制表缩进,以便它们看起来更像普通的shell脚本(但请记住,当前目录和其他状态不会在行之间保留,除非你添加特殊的.ONESHELL:
目标!)