一个目标相当于多个目标

问题描述 投票:0回答:2

是否可以在 Makefile 中拥有一个与其他几个目标等效的目标,而无需明确列出它们?比如:

all: task-*

task-name1:
    do something
task-name2:
    do something else
...
task-name(a big number):
    do yet something else

任务可能非常不同,并且是一一指定的,但我想通过键入 make 来完成所有任务。由于名称中没有系统性,因此保留所有目标的明确列表是乏味的。

makefile
2个回答
2
投票

make 本身没有类似的东西。

如果您愿意遵守某些命名约定,您可以使用以下内容自行搜索 makefile:

ALL_TASKS := $(sort $(shell sed -n 's/^ *\(task-[^:]*\):.*/\1/p' Makefile))

all: $(ALL_TASKS)

0
投票

如果您不介意将

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:
目标
!)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.