我的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 $< ../$@
答案 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