Makefile:在不同的目标上使用不同的参数运行相同的命令

Ada*_*tan 3 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) .
Run Code Online (Sandbox Code Playgroud)

问题

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
Run Code Online (Sandbox Code Playgroud)

我试着玩变量,没有运气.

我的问题

docker build一次编写命令并让每个目标改变其参数的优雅方法是什么?

Mad*_*ist 7

您可以使用构造的变量名称:

COMMIT := $(shell git rev-parse HEAD)

build_NOCACHE   = false
rebuild_NOCACHE = true

build rebuild:
        docker build -f Dockerfile --no-cache=$($@_NOCACHE) -t $(COMMIT) .
Run Code Online (Sandbox Code Playgroud)

或者您可以使用特定于目标的变量:

COMMIT := $(shell git rev-parse HEAD)

build:   NOCACHE = false
rebuild: NOCACHE = true

build rebuild:
        docker build -f Dockerfile --no-cache=$(NOCACHE) -t $(COMMIT) .
Run Code Online (Sandbox Code Playgroud)