【问题标题】:Uppercasing variable in a makefile生成文件中的大写变量
【发布时间】:2016-10-03 11:42:05
【问题描述】:

我正在使用 makefile 通过 Amazon 的 CLI 将静态内容部署到 s3 存储桶。我想输入一个变量来选择目标目的地,这样我就不需要在不同的 make 动词中重复相同的脚本。

我似乎已经让它工作了,但我想让参数在执行时从终端不区分大小写。这是我所拥有的:

S3_NAME_DEV = com-mydomain-application-dev
S3_NAME_LIVE = com-mydomain-application
deploy:
    # e.g. make deploy t=LIVE
    aws s3 sync dist/ s3://$(S3_NAME_${t})

我尝试添加两个插入符号(bash 4 支持并且我正在使用)$(S3_NAME_${t^^}) 但不起作用:/。这是我执行$ make deploy t=live 时的输出(变量消失了)。

$ make deploy t=live
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://

我认为包含 aws 命令的外观可能会很有用(这样不知道 AWS CLI 不会让您失望)。

aws s3 sync dist/ s3://com-mydomain-application

在shell中我调用make我可以成功地做到这一点:

$ t=live
$ echo ${t^^}
LIVE

任何帮助将不胜感激。

奖励积分:设置默认值

更新:

所以 make 不会像我假设的那样继承执行它的 bash。如果我在 make 文件中 @echo "my version is: $$BASH_VERSION" 我得到版本 3.2(OS X 默认)。解决这个问题的机会很大。

【问题讨论】:

  • @Sundeep 对不起,我没有包括在内;我已经编辑了帖子。
  • 没有问题,如果你把所有的大写都给它工作吗?
  • @Sundeep 一旦我包含了^^,就会给出t=livet=LIVE 的空值。如果我删除 ^^ $ make deploy t=LIVE 将再次工作。
  • 好的,你可以试试$(S3_NAME_"${t^^}") 吗?
  • @Sundeep 试了一下。不幸的是,同样的输出。

标签: bash makefile


【解决方案1】:

我尝试添加两个插入符号(bash 4 支持并且我正在使用)$(S3_NAME_${t^^}),但不起作用。

这是因为$(S3_NAME_...) 部分正在被make 扩展,而您希望${t^^} 部分被bash 扩展,但bashmake 扩展变量时不涉及。

在 makefile 的早期将 t 转换为大写:

override t := $(shell X="${t}"; echo $${X^^})

如果没有override,它将需要一个新的变量名:

u := $(shell X="${t}"; echo $${X^^})
# use ${u} instead of ${t}

【讨论】:

  • 这行得通,尽管 make 脚本似乎没有它以前执行的行的上下文,所以我必须内联,即aws s3 sync dist/ s3://S3_NAME_$(shell X="${t}"; echo $${X^^})。我说的对吗
  • @freebie make 脚本似乎没有它先前执行的行的上下文 - 不应该是这种情况。如果您调用其他 makefile,请确保您 export 变量,例如export u := ... 并使用 ${u} 而不是 ${t}
  • 我确实尝试将 export 放在变量赋值的前面,但它似乎不起作用。对不起,我的手机,所以我手头没有错误。这个答案是正确的,并且解决了我的问题。我猜make变量的范围是一个不同的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多