makefile

时间:2016-10-03 11:42:06

标签: bash makefile

我使用makefile使用亚马逊的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^^})但是不起作用:/。这是{I} $ 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默认)。修复此问题的好机会将解决问题。

1 个答案:

答案 0 :(得分:0)

  

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

这是因为$(S3_NAME_...)部分正在通过make进行扩展,而您希望${t^^}部分可以按bash进行扩展,但bash部分不会被make扩展。 1}}扩展变量。

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

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

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

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