Makefile 通过覆盖构建变量共享一个目标

Makefile share a target by overriding build variable

我有一个 makefile,其中一部分如下所示:

.PHONY: all
all: master dispatcher

.PHONY: master
master: BUILDTARGET=master
master: buildbin    ## Builds master

.PHONY: dispatcher
dispatcher: BUILDTARGET=dispatcher
dispatcher: buildbin    ## Builds dispatcher

.PHONY: buildbin 
buildbin:
@cd ${BUILD_FOLDER}/${BUILDTARGET} && ${MAKE} build GOBIN=${GOBIN} 
     LDFLAGS="${LDFLAGS}" CMD_FOLDER=${CMD_FOLDER}
@cd ${PROJECT_ROOT}

请假设要设置 BUILD_FOLDER、GOBIN、LDFLAGS、CMD_FOLDER、PROJECT_ROOT。

问题是 运行 make 总是只构建 'master' 然后退出。 改变 'all' 的顺序,我发现它只构建了第一个。 上面的Makefile有什么问题。

你不能像这样使用依赖关系,buildbin 只是另一个目标,每次调用最多重制一次。您可以按如下方式解决此问题:

.PHONY: all master dispatcher
all: master dispatcher

master: BUILDTARGET=master
dispatcher: BUILDTARGET=dispatcher

master dispatcher:
    @cd ${BUILD_FOLDER}/${BUILDTARGET} && ${MAKE} build GOBIN=${GOBIN} LDFLAGS="${LDFLAGS}" CMD_FOLDER=${CMD_FOLDER}
    @cd ${PROJECT_ROOT}

或者更简单地说

.PHONY: all master dispatcher
all: master dispatcher

master dispatcher:
    @cd ${BUILD_FOLDER}/$@ && ${MAKE} build GOBIN=${GOBIN} LDFLAGS="${LDFLAGS}" CMD_FOLDER=${CMD_FOLDER}
    @cd ${PROJECT_ROOT}