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

Gab*_*uis 2 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
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

小智 6

?=GNU化妆相当于一个=当变量是未定义之前是唯一完成。您可能知道,=设置一个递归扩展的变量,即只有在扩展变量本身时才扩展其值。

你想要的是一个简单的扩展变量,它的内容只扩展一次并直接分配给它。有关差异的更多信息,请参阅变量的两种风味。您可以通过为它分配一个简单的扩展变量:=

您有两种选择来解决您的紧迫问题:

  1. BUILD_TIMESTAMP一个简单的扩大通过重新分配它的变量:

    BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S')
    BUILD_TIMESTAMP := ${BUILD_TIMESTAMP}
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行仅在变量未定义时进行分配的逻辑:

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