假设我有一个名为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的先决条件。
答案 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