【问题标题】:rebuild a target base on target specific variable基于目标特定变量重建目标
【发布时间】:2015-01-06 11:23:28
【问题描述】:

假设我有一个名为 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) 不会作为 foo.src 的先决条件扩展为 dummy。

【问题讨论】:

  • 那么,当你在命令行中输入make install 时,你想重建foo.src,而不是当install 是其他东西的先决条件时?这可能是可能的,但会很丑……我怀疑重新考虑设计会是一种更好的方法……

标签: makefile gnu-make


【解决方案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)

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

当(且仅当)install 在命令行中给出时,一种方法是声明foo.src phony:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2023-04-02
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多