递归Makefile:想要运行伪目标然后运行所有目标

时间:2014-01-09 19:14:15

标签: build makefile

鉴于此Makefile片段:

TARGETS =       ${SHARED_LIB_A} ${SHARED_LIB_B}

.PHONY: subdirs $(SUBDIRS) 

subdirs: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -C $@

all: $(TARGETS)

我想修改这个Makefile,以便在运行PHONY目标之后构建TARGETS 。 IE浏览器。 TARGETS取决于正在构建的SUBDIRS中的代码 - 目标需要在SUBDIRS之后运行。现在它的工作方式是PHONY目标运行(子目录是构建的),但不是所有目标(除非我专门运行它像'make all' - 但我想避免这样做,如果可能的话,我只是想要运行'make'并让它构建子目录,然后构建TARGETS。

1 个答案:

答案 0 :(得分:1)

首先,您应该将all作为第一条规则,而不是最后一条规则。除非您在make命令行上指定特定目标,否则它将运行makefile中的第一个目标(此处为subdirs)。

其次,您应该将subdirs声明为$(TARGETS)的先决条件;这将确保在subdirs完成后才构建它们:

all: $(TARGETS)

$(TARGETS): subdirs

现在,因为subdirs是PHONY,这意味着$(TARGETS)始终视为被视为过时并且始终被构建,即使调用subdirs没有'改变任何文件。但是,没有其他选择,因为你在这里写了你的makefile,因为make无法知道你想用什么文件(由子制作创建)来查看库是否过时。

或者,您可以指定subdirs是仅限订单的先决条件:

$(TARGETS): | subdirs