如何计算一次makefile条件变量?
我试图对所有任务使用相同的值,但变量会对每个任务进行求值。如何避免呢 版本:GNU Make 4.1 生成文件内容:如何计算一次makefile条件变量?,makefile,gnu-make,Makefile,Gnu Make,我试图对所有任务使用相同的值,但变量会对每个任务进行求值。如何避免呢 版本: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 输出: $ make
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
GNU make中的?=
相当于一个=
,它只在变量之前未定义时执行。您可能知道,=
设置了一个递归展开的变量,也就是说,只有当变量本身展开时,它的值才会展开
相反,您需要的是一个简单的展开变量,它的内容只展开一次并直接分配给它。有关差异的更多信息,请参阅。通过将变量赋值为:=
,可以得到一个简单的展开变量
您有两种选择来解决眼前的问题:
BUILD\u TIMESTAMP
使其成为简单扩展的变量:
BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
BUILD_TIMESTAMP := ${BUILD_TIMESTAMP}
VERSION ?= 1.2-${BUILD_TIMESTAMP}
ifeq ($(origin BUILD_TIMESTAMP), undefined)
BUILD_TIMESTAMP := $(shell date '+%Y%m%d%H%M%S')
endif
VERSION ?= 1.2-${BUILD_TIMESTAMP}
只需在相应的
?=
赋值后向代码中添加以下语句:
BUILD_TIMESTAMP := $(BUILD_TIMESTAMP)
VERSION := $(VERSION)