根据目标特定变量重建目标

rebuild a target base on target specific variable

假设我有一个名为 install 的目标,它从整个代码库构建二进制文件。

在 makefile 中我有另一个目标 foo.src,它生成一个带有环境变量的源文件 "foo.src",安装需要它。

第三个目标称为测试,它将 run 一堆测试。

显然测试依赖于安装,安装依赖于 foo.src。

我试图避免每次构建测试时都重新生成文件 foo.src,因为 foo.src 是很多目标的先决条件,但我仍然想确保它在我重新生成时重新生成直接构建安装。

到目前为止我得到了什么:

BUILD_INSTALL =
install: BUILD_INSTALL = dummy
install: foo.src
    @echo "INSTALL!!!"
    @echo BUILD_INSTALL=$(BUILD_INSTALL)
    touch install

foo.src: $(BUILD_INSTALL)
    @echo "foo.src!!"
    @echo BUILD_INSTALL=$(BUILD_INSTALL)
    touch foo.src

test: install
    @echo "TEST!!!"

.PHONY: test dummy
dummy:

据我所知,重复构建安装不会重新生成 foo.src。当我第二次构建安装时,$(BUILD_INSTALL) 不会扩展为虚拟作为 foo.src 的先决条件。

您的尝试因此失败,来自 GNU make 手册:

As with automatic variables, these values are only available within the
context of a target’s recipe (and in other target-specific assignments)

您正在尝试使用先决条件列表中的变量,这不是目标配方的一部分。

做你想做的事情的一种方法是声明 foo.src 虚假,如果(且仅当)install 在命令行上给出:

install: foo.src
        @echo "INSTALL!!!"
        @echo BUILD_INSTALL=$(BUILD_INSTALL)
        touch install

foo.src:
        @echo "foo.src!!"
        @echo BUILD_INSTALL=$(BUILD_INSTALL)
        touch foo.src

test: install
        @echo "TEST!!!"

ifeq (install,$(filter install,$(MAKECMDGOALS)))
.PHONY: foo.src
endif