我试图对所有任务使用相同的值,但变量正在评估每个任务。如何避免呢?
版本:GNU Make 4.1
Makefile内容:
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
输出:
$ 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
答案 0 :(得分:4)
GNU make 中的sqlContext.sql("select cast(nm as string) from df
union all select cast(date as string) + ' '
+ cast(id as string) + ' '
+ cast(amount as string) from df")
等同于?=
,只有在之前未定义变量时才会这样做。正如您 知道的那样,=
设置递归扩展变量,也就是说,只有在扩展变量本身时才会扩展其值。
您想要的只是简单扩展变量,其内容仅展开一次并直接分配给它。有关差异的更多信息,请参阅The Two Flavors of Variables。您可以通过=
分配简单扩展变量。
您有两种方法可以解决您的紧急问题:
通过重新分配来:=
简单地展开变量:
BUILD_TIMESTAMP
执行逻辑仅用于在自己未定义变量时进行分配:
BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
BUILD_TIMESTAMP := ${BUILD_TIMESTAMP}
VERSION ?= 1.2-${BUILD_TIMESTAMP}
答案 1 :(得分:2)
在相应的?=
分配后,只需在代码中添加以下语句:
BUILD_TIMESTAMP := $(BUILD_TIMESTAMP)
VERSION := $(VERSION)