gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:55:33 24 4
gpt4 key购买 nike

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

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

最佳答案

GNU make 中的 ?= 等同于 = ,仅在变量之前未定义时才执行。您可能知道,= 设置了一个递归展开的变量,也就是说,只有当变量本身展开时,它的值才会展开。 p>

您想要的是一个简单展开的变量,它的内容只展开一次并直接赋值给它。有关差异的更多信息,请参阅 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}

关于makefile - 如何评估一次makefile条件变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45491333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com