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

时间:2017-06-11 20:59:10

标签: 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) .

问题

buildrebuild之间的唯一区别是--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命令并让每个目标改变其参数的优雅方法是什么?

2 个答案:

答案 0 :(得分:6)

您可以使用constructed variable names

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

build_NOCACHE   = false
rebuild_NOCACHE = true

build rebuild:
        docker build -f Dockerfile --no-cache=$($@_NOCACHE) -t $(COMMIT) .

或者您可以使用target-specific variables

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

build:   NOCACHE = false
rebuild: NOCACHE = true

build rebuild:
        docker build -f Dockerfile --no-cache=$(NOCACHE) -t $(COMMIT) .

答案 1 :(得分:0)

使用the call function

位置参数从1到n指定,并在命令定义中用作$(1)$(2)$(n)

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)