如您所知,模式规则如下:
static/admin_%.mjs: js2/.legacy_admin.built.mjs
recipe...
不指定任何目标,只是一个用于发现的模板
您指定的目标的先决条件否则,
以及根据先决条件制作这些目标的配方。
所以你的makefile中必须有一些东西else来决定
目标是什么。假设它只是一个列表,如下所示:
$ cat Makefile
MJS_STEMS := app admin_unit admin_source admin_module
MJS_FILES := $(addprefix static/,$(MJS_STEMS:%=%.mjs))
.PHONY: all clean
all: $(MJS_FILES)
$(MJS_FILES): js2/.legacy_admin.built.mjs
static/%.mjs: | static
@echo $< > $@
@echo "$@ depends on $<"
js2/.legacy_admin.built.mjs: | js2
touch $@
static js2:
mkdir -p $@
clean:
$(RM) $(MJS_FILES) js2/.legacy_admin.built.mjs
这里,
$(MJS_FILES): js2/.legacy_admin.built.mjs
说每个$(MJS_FILES) 都依赖于js2/.legacy_admin.built.mjs。
这是没有模式规则的最简洁的方法。 make 运行如下:
$ make
mkdir -p static
mkdir -p js2
touch js2/.legacy_admin.built.mjs
static/app.mjs depends on js2/.legacy_admin.built.mjs
static/admin_unit.mjs depends on js2/.legacy_admin.built.mjs
static/admin_source.mjs depends on js2/.legacy_admin.built.mjs
static/admin_module.mjs depends on js2/.legacy_admin.built.mjs
如果您愿意,可以将 MJS_STEMS 列表的维护移出
makefile 到另一个文件中:
$ cat ./mjs_stems
app
admin_unit
admin_source
admin_module
$ cat Makefile
MJS_STEMS := $(shell cat ./mjs_stems)
MJS_FILES := $(addprefix static/,$(MJS_STEMS:%=%.mjs))
.PHONY: all clean
all: $(MJS_FILES)
$(MJS_FILES): js2/.legacy_admin.built.mjs
static/%.mjs: | static
@echo $< > $@
@echo "$@ depends on $<"
js2/.legacy_admin.built.mjs: | js2
touch $@
static js2:
mkdir -p $@
clean:
$(RM) $(MJS_FILES) js2/.legacy_admin.built.mjs
$ make clean
rm -f static/app.mjs static/admin_unit.mjs static/admin_source.mjs static/admin_module.mjs js2/.legacy_admin.built.mjs
$ echo "admin_foobar" >> mjs_stems
$ make
touch js2/.legacy_admin.built.mjs
static/app.mjs depends on js2/.legacy_admin.built.mjs
static/admin_unit.mjs depends on js2/.legacy_admin.built.mjs
static/admin_source.mjs depends on js2/.legacy_admin.built.mjs
static/admin_module.mjs depends on js2/.legacy_admin.built.mjs
static/admin_foobar.mjs depends on js2/.legacy_admin.built.mjs
或者您可以从环境中获取MJS_STEMS 列表:
$ cat Makefile
MJS_STEMS := $(strip $(MJS_STEMS))
MJS_FILES := $(addprefix static/,$(MJS_STEMS:%=%.mjs))
.PHONY: all clean
all: $(MJS_FILES)
$(MJS_FILES): js2/.legacy_admin.built.mjs
static/%.mjs: | static
@echo $< > $@
@echo "$@ depends on $<"
js2/.legacy_admin.built.mjs: | js2
touch $@
static js2:
mkdir -p $@
clean:
$(RM) $(MJS_FILES) js2/.legacy_admin.built.mjs
$ make clean
rm -f static/app.mjs static/admin_unit.mjs static/admin_source.mjs static/admin_module.mjs static/admin_foobar.mjs js2/.legacy_admin.built.mjs
$ export MJS_STEMS=$(cat ./mjs_stems)
$ make
touch js2/.legacy_admin.built.mjs
static/app.mjs depends on js2/.legacy_admin.built.mjs
static/admin_unit.mjs depends on js2/.legacy_admin.built.mjs
static/admin_source.mjs depends on js2/.legacy_admin.built.mjs
static/admin_module.mjs depends on js2/.legacy_admin.built.mjs
static/admin_foobar.mjs depends on js2/.legacy_admin.built.mjs
$ make clean
rm -f static/app.mjs static/admin_unit.mjs static/admin_source.mjs static/admin_module.mjs static/admin_foobar.mjs js2/.legacy_admin.built.mjs
$ export MJS_STEMS="aa bb cc"
$ make
touch js2/.legacy_admin.built.mjs
static/aa.mjs depends on js2/.legacy_admin.built.mjs
static/bb.mjs depends on js2/.legacy_admin.built.mjs
static/cc.mjs depends on js2/.legacy_admin.built.mjs
$ make clean
rm -f static/aa.mjs static/bb.mjs static/cc.mjs js2/.legacy_admin.built.mjs
但无论如何,您必须在某处指定目标列表,并且
要添加新目标,您必须更新一些内容。