根据目标特定变量重建目标
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
假设我有一个名为 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