具有使用相同规则的不同依赖关系的多个目标

时间:2017-02-20 20:34:35

标签: makefile

我的Makefile看起来像这样:

MODULES = core models pages admin
CMXSFILES = $(patsubst %,%.cmxs,$(MODULES))

all : $(CMXSFILES)

core.cmxs : core
  make -C $< ../$@

models.cmxs : models core.cmxs
  make -C $< ../$@

pages.cmxs : pages core.cmxs models.cmxs
  make -C $< ../$@

admin.cmxs : admin core.cmxs models.cmxs
  make -C $< ../$@

考虑到构建命令完全相同,有没有办法以更简洁的方式表达最后四条规则?

这样的事情:

core.cmxs: core
models.cmxs: models core.cmxs
pages.cmxs: pages core.cmxs models.cmxs
admin.cmxs: admin core.cmxs models.cmxs
  make -C $< ../$@

1 个答案:

答案 0 :(得分:1)

请注意,在调用递归make时,切勿使用make。如果您愿意,请始终使用$(MAKE)(或${MAKE},同样的事情。)

你可以这样做:

all: $(CMXFILES)

$(CMXFILES):
        $(MAKE) -C $< ../$@

core.cmxs: core
models.cmxs: models core.cmxs
pages.cmxs: pages core.cmxs models.cmxs
admin.cmxs: admin core.cmxs models.cmxs

但这里有问题。首先,您需要将所有这些目录声明为.PHONY,否则它们可能无法在您预期时生成。此外,如果你正在使用GNU make(你可能在这里,因为很多make版本没有在显式规则上设置$<),那么你可以使用模式规则来简化事情:

all: $(CMXFILES)
.PHONY: $(CMXFILES:%.cmxs=%)

%.cmxs: %
        $(MAKE) -C $< ../$@

models.cmxs: core.cmxs
pages.cmxs: core.cmxs models.cmxs
admin.cmxs: core.cmxs models.cmxs