鉴于此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。
答案 0 :(得分:1)
首先,您应该将all
作为第一条规则,而不是最后一条规则。除非您在make
命令行上指定特定目标,否则它将运行makefile中的第一个目标(此处为subdirs
)。
其次,您应该将subdirs
声明为$(TARGETS)
的先决条件;这将确保在subdirs
完成后才构建它们:
all: $(TARGETS)
$(TARGETS): subdirs
现在,因为subdirs
是PHONY,这意味着$(TARGETS)
将始终视为被视为过时并且始终被构建,即使调用subdirs
没有'改变任何文件。但是,没有其他选择,因为你在这里写了你的makefile,因为make无法知道你想用什么文件(由子制作创建)来查看库是否过时。
或者,您可以指定subdirs
是仅限订单的先决条件:
$(TARGETS): | subdirs