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

时间:2015-01-06 11:23:29

标签: makefile gnu-make

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

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

第三个名为test的目标,它将运行一系列测试。

所以显然测试取决于安装,安装取决于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)不会扩展为dummy作为foo.src的先决条件。

1 个答案:

答案 0 :(得分:1)

您的尝试因此而失败,来自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