我试图对所有任务使用相同的值,但该变量正在为每个任务进行评估。如何避免?
版本:GNU Make 4.1
生成文件内容:
SHELL = /bin/bash -ex
BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
VERSION ?= 1.2-${BUILD_TIMESTAMP}
t1:
echo ${VERSION}
sleep 1
t2:
echo ${VERSION}
sleep 1
Run Code Online (Sandbox Code Playgroud)
输出:
$ make t1 t2
date +%Y%m%d%H%M%S
echo 1.2-20170803143838
+ echo 1.2-20170803143838
1.2-20170803143838
sleep 1
+ sleep 1
+ date +%Y%m%d%H%M%S
echo 1.2-20170803143839
+ echo 1.2-20170803143839
1.2-20170803143839
sleep 1
+ sleep 1
Run Code Online (Sandbox Code Playgroud)
小智 6
将?=
在GNU化妆相当于一个=
当变量是未定义之前是唯一完成。您可能知道,=
设置一个递归扩展的变量,即只有在扩展变量本身时才扩展其值。
你想要的是一个简单的扩展变量,它的内容只扩展一次并直接分配给它。有关差异的更多信息,请参阅变量的两种风味。您可以通过为它分配一个简单的扩展变量:=
。
您有两种选择来解决您的紧迫问题:
做BUILD_TIMESTAMP
一个简单的扩大通过重新分配它的变量:
BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
BUILD_TIMESTAMP := ${BUILD_TIMESTAMP}
VERSION ?= 1.2-${BUILD_TIMESTAMP}
Run Code Online (Sandbox Code Playgroud)执行仅在变量未定义时进行分配的逻辑:
ifeq ($(origin BUILD_TIMESTAMP), undefined)
BUILD_TIMESTAMP := $(shell date '+%Y%m%d%H%M%S')
endif
VERSION ?= 1.2-${BUILD_TIMESTAMP}
Run Code Online (Sandbox Code Playgroud)