如何计算一次makefile条件变量?

如何计算一次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

我试图对所有任务使用相同的值,但变量会对每个任务进行求值。如何避免呢

版本: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 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)