Makefile中的词典/地图/查找表

时间:2016-12-01 20:08:52

标签: makefile gnu-make

我需要在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的键查找帐户友好名称?

2 个答案:

答案 0 :(得分:9)

我无法解释为什么你没有看到你期望的行为:我会验证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)

答案 1 :(得分:0)

构建和配置管理正逐渐成为一项编程任务。不幸的是,这样做的工具缺乏一致性和广泛的接受度。团队通常最终会滚动自己的脚本动物园来共同构建,测试和发布。如果您想避免make带来的一些稀释以及它之外的必要辅助脚本,则可以使用gmtt来为您希望在机载{{1 }}通话:

GNUmake