Makefile 在每次构建时增加变量

Makefile increase variable on each build

我有一个带变量的 makefile DOCKER_TAG = 0.0.1

并且我希望在调用的每个目标上它都会被碰撞(仅补丁版本)是否可能

例如

DOCKER_TAG = 0.0.1

push: 
    docker push docker.io/testasm:$(DOCKER_TAG)

现在如果我 运行 make push 它将使用版本 0.0.1 但如果我第二次这样做它会被撞到 0.0.2 等等(在 make push) 的每个 运行 上,可能吗?

更新 我尝试了以下

DOCKER_TAG = 0.0.1
DOCKER_REGISTRY = testreg/vsp


VERSION_FILE   := version.txt
-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)



NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)


build:
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

并且 version.txt 文件获得 .. 两个点的值...知道如何解决吗?

如果我选择答案中的最后一个选项 原样 我看到 version.txt 文件包含 DOCKER_TAG := ..

更新 2

我已经创建了空的 version.txt 文件并按原样使用以下内容

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1.

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))

NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)
build:
    docker build -t docker.io/vcd/test:$(DOCKER_TAG) .
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

我在 version.txt 文件中得到以下内容 DOCKER_TAG := ..

最好的办法是使用一些 docker 命令 (docker search?) 查询存储库并从那里获取最新版本。如果不可能,您可以将其存储在文本文件中,每次 运行 时阅读并更新。类似于:

VERSION_FILE   := version.txt
DOCKER_TAG     := $(shell [ -f "$(VERSION_FILE)" ] && cat "$(VERSION_FILE)" || echo '0.0.1')
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

当然,您必须妥善保管您的版本文件,避免误删。为了更高的安全性,您可以自己编写第一个版本文件并指示 make 在文件不存在的情况下引发错误:

VERSION_FILE   := version.txt

ifneq ($(wildcard $(VERSION_FILE)),$(VERSION_FILE))

$(error $(VERSION_FILE) not found)

else

DOCKER_TAG     := $(shell cat "$(VERSION_FILE)")
VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "$(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

endif

变体,其中版本文件本身是主文件包含的 Makefile:

VERSION_FILE   := version.txt
DOCKER_TAG     := 0.0.1

-include $(VERSION_FILE)

VERMAJMIN      := $(subst ., ,$(DOCKER_TAG))
VERSION        := $(word 1,$(VERMAJMIN))
MAJOR          := $(word 2,$(VERMAJMIN))
MINOR          := $(word 3,$(VERMAJMIN))
NEW_MINOR      := $(shell expr "$(MINOR)" + 1)
NEW_DOCKER_TAG := $(VERSION).$(MAJOR).$(NEW_MINOR)

push:
    docker push docker.io/testasm:$(DOCKER_TAG)
    echo "DOCKER_TAG := $(NEW_DOCKER_TAG)" > "$(VERSION_FILE)"

(把-include $(VERSION_FILE)前面的-去掉,如果文件不存在会报错,最后这个是我最喜欢的