Makefile:在不同的目标上使用不同的参数运行相同的命令 代码
考虑以下makefile片段:Makefile:在不同的目标上使用不同的参数运行相同的命令 代码,makefile,Makefile,考虑以下makefile片段: COMMIT := $(shell git rev-parse HEAD) build: docker build -f Dockerfile --no-cache=false -t $(COMMIT) . rebuild: docker build -f Dockerfile --no-cache=true -t $(COMMIT) . 问题 build和rebuild之间的唯一区别是--no cache参数的值。显然,只需稍作修改就重写同
COMMIT := $(shell git rev-parse HEAD)
build:
docker build -f Dockerfile --no-cache=false -t $(COMMIT) .
rebuild:
docker build -f Dockerfile --no-cache=true -t $(COMMIT) .
问题
build
和rebuild
之间的唯一区别是--no cache
参数的值。显然,只需稍作修改就重写同一命令是一种不好的做法;它打破了DRY原则,如果我需要更改命令中的其他内容(例如,-t
),我必须在所有相关目标中更改它
我有这样的想法:
COMMIT := $(shell git rev-parse HEAD)
NO_CACHE := false
build:
docker build -f Dockerfile --no-cache=$(NO_CACHE) -t $(COMMIT) .
rebuild:
NO-CACHE = true
make build
我试着玩变量,但运气不好
我的问题
编写一次docker build命令并让每个目标更改其参数的优雅方式是什么?您可以使用:
或者您可以使用:
使用
位置参数从1到n指定,并在命令定义中使用为$(1)
,$(2)
,$(n)
非常感谢。清晰而中肯。然而,我似乎有一个更深层次的问题-你介意看一下吗?特定于目标的变量是由先决条件继承的(请参阅手册)。最初的想法正是您所想的:例如,您在
debug
目标上设置了一些调试标志,然后创建debug:all
,如果您运行make debug
,则调试标志将由构建链中的所有先决条件继承。这会起作用,但我认为使用特定于目标的变量更具可读性和优雅性。
COMMIT := $(shell git rev-parse HEAD)
build_NOCACHE = false
rebuild_NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$($@_NOCACHE) -t $(COMMIT) .
COMMIT := $(shell git rev-parse HEAD)
build: NOCACHE = false
rebuild: NOCACHE = true
build rebuild:
docker build -f Dockerfile --no-cache=$(NOCACHE) -t $(COMMIT) .
COMMIT := $(shell git rev-parse HEAD)
DOCKER_BUILD_CMD = docker build -f Dockerfile --no-cache=$(1) -t $(COMMIT) .
build:
$(call DOCKER_BUILD_CMD, false)
rebuild:
$(call DOCKER_BUILD_CMD, true)