如何评估一次makefile条件变量?

时间:2017-08-03 17:51:07

标签: makefile gnu-make

我试图对所有任务使用相同的值,但变量正在评估每个任务。如何避免呢?

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

答案 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。您可以通过=分配简单扩展变量

您有两种方法可以解决您的紧急问题:

  1. 通过重新分配来:= 简单地展开变量:

    BUILD_TIMESTAMP
  2. 执行逻辑仅用于在自己未定义变量时进行分配:

    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)