如何将 makefile 函数的输出分配给变量

How can i assign the output of a makefile function to a variable

我在 makefile 中有一个函数 returns google 云存储中的存储桶名称

define get_composer_bucket
    gcloud beta composer environments describe --location=europe-west2 ${COMPOSER_SANDBOX_NAME} \
    | grep -hnr "dagGcsPrefix"
endef

我想在 makefile 命令中使用它的输出。我如何将其输出分配给变量?我试过下面的方法,其中 returns 是一个空变量。我做错了什么吗?

run:

    BUCKET=$(call get_composer_bucket)  
    echo ${BUCKET}

请参阅下面的代码,这将帮助您提取名称

define get_composer_bucket
    `gcloud beta composer environments describe --location=europe-west2 ${COMPOSER_SANDBOX_NAME} \
    | grep -hnr "dagGcsPrefix"`
endef
BUCKET:= $(call get_composer_bucket)
run:
    @echo "BUCKET=> $(BUCKET)"

有很多SO答案会向你描述make变量和shell变量之间的区别;了解这种差异对于编写 makefile 至关重要。

也有很多 SO 答案会解释食谱中的每个命令在不同的 shell 中是 运行,并且不能在一个 shell 中设置变量传递给另一个 shell,因此在一个配方命令行中设置变量在另一个配方命令行中是看不到的(您可以使用 \ 将多个物理行组合成一个逻辑行,但是您可能还需要添加 ; 以满足 shell).

而且,有很多答案讨论 makefile 为什么不是 shell 脚本(尽管它可以包含 shell 脚本)所以你不能只写一个 shell 脚本生成文件中的任何位置并对其进行评估。

最简单的方法是使用 make shell 函数将 make 变量设置为 运行 shell 脚本:

BUCKET := $(shell gcloud beta composer environments describe --location=europe-west2 ${COMPOSER_SANDBOX_NAME} | grep -hnr "dagGcsPrefix")

run:
         echo $(BUCKET)

当然,这在很多方面都与您在上面尝试做的不同。所以也许它不符合你的要求,但你实际上没有说明这些是什么。