如何评估一个Makefile条件变量?

3

我想要在所有任务中使用相同的值,但是变量会为每个任务进行评估。如何避免这种情况?

版本: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
2个回答

7
在GNU make中,?= 相当于只有在变量之前未定义时才执行的 =。如您所知,= 设置一个“递归展开变量”,即仅在展开变量本身时才展开其值。
相反,您需要一个“简单展开变量”,它的内容仅展开一次并直接分配给它。有关差异的更多信息,请参见The Two Flavors of Variables。通过使用:=进行分配,您可以获得一个“简单展开变量”。
解决您立即面临的问题有两个选项:
  1. Make BUILD_TIMESTAMP a simply expanded variable by reassigning it:

    BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
    BUILD_TIMESTAMP := ${BUILD_TIMESTAMP}
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP}
    
  2. Do the logic for only assigning when the variable was undefined yourself:

    ifeq ($(origin BUILD_TIMESTAMP), undefined)
    BUILD_TIMESTAMP := $(shell date '+%Y%m%d%H%M%S')
    endif
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP}
    

4
只需在相应的?=赋值后,将以下语句添加到您的代码中即可:
BUILD_TIMESTAMP := $(BUILD_TIMESTAMP)
VERSION := $(VERSION)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接