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参数的值。显然,只需稍作修改就重写同

考虑以下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
参数的值。显然,只需稍作修改就重写同一命令是一种不好的做法;它打破了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)