2017-08-03 48 views
-1

我试图对所有任务使用相同的值,但变量正在为每个任务进行评估。如何避免它?如何评估一次makefile条件变量?

版本:GNU让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

?=GNU使相当于=是唯一完成后的变量之前未定义。正如你可能知道的那样,=设置了一个递归扩展变量,也就是说,它的值只有在变量本身展开时才展开。

你想要的是一个简单的扩展变量,它的内容只扩展一次并直接赋值给它。有关差异的更多信息,请参见The Two Flavors of Variables。通过将其分配给:=,您可以获得简单扩展变量

您有两个选项来解决您的眼前的问题:

  1. BUILD_TIMESTAMP一个简单扩展变量被重新分配它:

    BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S') 
    BUILD_TIMESTAMP := ${BUILD_TIMESTAMP} 
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP} 
    
  2. 做逻辑时,该变量只分配自己没有定义:

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

只需添加以下语句,您的代码对应的?=分配后:

BUILD_TIMESTAMP := $(BUILD_TIMESTAMP) 
VERSION := $(VERSION)