【问题标题】:Dictionaries/Maps/Lookup Tables in MakefilesMakefile 中的字典/地图/查找表
【发布时间】:2023-03-30 03:19:01
【问题描述】:

我需要在我的 Makefile 中创建一个查找表/字典/映射来查找键值信息。

我一直在尝试使用 ifeq 语句来做同样的事情,但我的语句似乎失败了:

# this gets the account id from the current user's ARN, you must have the AWS CLI and jq installed
AWS_ACCOUNT_ID:=$(shell aws iam get-user | jq -r '.User.Arn' | awk -F ':' '{print $$5;}')

# define a friendly account name for output
ifeq ($(AWS_ACCOUNT_ID), 123456)
AWS_ACCOUNT_FRIENDLY:=staging
endif

ifeq ($(AWS_ACCOUNT_ID), 789012)
AWS_ACCOUNT_FRIENDLY:=preprod
endif

ifeq ($(AWS_ACCOUNT_ID), 345678)
AWS_ACCOUNT_FRIENDLY:=production
endif

它似乎只适用于第一个值123456,但不适用于其他值。

有没有办法在 Make 中定义字典/映射,以便通过帐户 ID 的键简单地查找帐户友好名称?

【问题讨论】:

  • 我对您的代码进行了剪切和粘贴,并对 AWS_ACCOUNT_ID 进行了硬编码,它似乎可以正常工作。可能你的 shell 命令没有返回正确的值。

标签: makefile gnu-make


【解决方案1】:

我无法解释为什么您看不到您期望的行为:我会验证 AWS_ACCOUNT_ID 的值是否符合您的期望:也许您的 shell 脚本没有执行您想要的操作。尝试添加类似:

AWS_ACCOUNT_ID := $(shell ...)
$(info AWS_ACCOUNT_ID = '$(AWS_ACCOUNT_ID)')

看看你会得到什么。

但是与您的更一般的问题有关,我更喜欢在处理此类情况时使用constructed macro names,而不是大量的ifeq 值:

AWS_123456_FRIENDLY := staging
AWS_789012_FRIENDLY := preprod
AWS_345678_FRIENDLY := production


AWS_ACCOUNT_ID := $(shell ...)

AWS_ACCOUNT_FRIENDLY := $(AWS_$(AWS_ACCOUNT_ID)_FRIENDLY)

【讨论】:

  • 宏正是我想要做的。谢谢!
【解决方案2】:

构建和配置管理正在成为一项独立的编程任务。不幸的是,这样做的工具缺乏连贯性和广泛的接受度。团队通常最终会推出自己的脚本库,以将构建、测试和发布粘合在一起。如果你想避免make 和它之外的必要帮助脚本带来的一些稀释,你可以使用gmtt,它允许为你想要通过板载GNUmake 调用完成的那些类型的任务选择表格:

include gmtt/gmtt.mk

AWS_ACCOUNT_ID:=$(shell aws iam get-user | jq -r '.User.Arn' | awk -F ':' '{print $$5;}')

# define a table of 3 columns: <AWS-id> <name> <admin>                                                          
define AWS_ACCOUNT_TBL                                                                                          
3                                                                                                               
123456   staging      kay                                                                                       
789012   preprod      catbert                                                                                   
345678   production   pointyhairedboss                                                                          
endef                                                                                                           

# select column 2 & 3 from table AWS_ACCOUNT_TBL where column 1 string-equals AWS_ACCOUNT_ID                    
AWS_ACCOUNT := $(call select,2 3,$(AWS_ACCOUNT_TBL),$$(call str-eq,$$1,$(AWS_ACCOUNT_ID)))                     

AWS_NAME := $(word 1,$(AWS_ACCOUNT))                                                                            
ADMIN := $(word 2,$(AWS_ACCOUNT))                                                                               

$(info AWS account $(AWS_NAME) administered by $(ADMIN))

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2016-07-19
    • 2021-02-27
    • 2020-10-05
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多