BMW*_*BMW 10 makefile gnu-make docker
prog : CFLAGS = -g
prog : prog.o foo.o bar.o
Run Code Online (Sandbox Code Playgroud)
我可以设置特定于目标的变量。
现在我的问题是,如何设置多个特定于目标的变量。我必须一一设置吗?
dev_deploy: env = dev
dev_deploy: image = abc
dev_deploy: tag = 1.0.4-dev
dev_deploy:
docker run -t --rm -e env=$(env) \
$(image):$(tag) \
sh -c "test.sh"
prod_deploy: env = prod
prod_deploy: image = abc
prod_deploy: tag = 1.0.3-prod
prod_deploy:
docker run -t --rm -e env=$(env) \
$(image):$(tag) \
sh -c "test.sh"
Run Code Online (Sandbox Code Playgroud)
有什么方法可以用简单的方法设置本地环境(特定于目标的变量)?
您的第一个问题的直接答案是肯定的,您必须为每个特定于目标的变量使用单独的目标行并逐一设置它们。
你的第二个问题的答案是肯定的:一个是由 uzsolt 描述的。这也是我推荐的方法。uzsolt 的解决方案与特定于目标的变量解决方案之间的一个区别在于,特定于目标的变量由先决条件继承。您在这里似乎不需要这种行为,但如果您这样做了,那么此解决方案对您不起作用。
如果您需要特定于目标的变量,或者如果每个变量分配一行仍然太痛苦(例如,您有非常多的这些变量,而您确实希望每组有一行),则可能有更复杂的选项难以理解但以后使用更简单。
例如,如果您知道所有变量值都不会包含空格,那么您可以创建一个用户定义的宏,使用 eval 来设置特定于目标的变量,如下所示:
assign-vars = $(foreach A,$2,$(eval $1: $A))
$(call assign-vars, dev_deploy, env=devenv image=abc tag=1.0.4-dev)
$(call assign-vars, prod_deploy, env=prod image=abc tag=1.0.3-prod)
Run Code Online (Sandbox Code Playgroud)
注意:第一个参数是目标,每个赋值必须是一个“单词”(没有嵌入的空格)并且赋值之间没有逗号。
我会做:
dev_deploy_env= devenv
dev_deploy_image= abc
dev_deploy_tag= 1.0.4-dev
prod_deploy_env= prod
prod_deploy_image= abc
prod_deploy_tag= 1.0.3-prod
dev_deploy prod_deploy:
@echo docker run -t --rm -e env=${${@}_env} \
${${@}_image}:${${@}_tag} \
sh -c "test.sh"
.PHONY: dev_deploy prod_deploy
Run Code Online (Sandbox Code Playgroud)
查看命令(我使用的是 FreeBSD,在它上面的 GNU make 命令是gmake):
$ gmake prod_deploy
docker run -t --rm -e env=prod abc:1.0.3-prod sh -c test.sh
$ gmake dev_deploy
docker run -t --rm -e env=devenv abc:1.0.4-dev sh -c test.sh
Run Code Online (Sandbox Code Playgroud)
当然,您应该删除@echo以运行命令。
| 归档时间: |
|
| 查看次数: |
2244 次 |
| 最近记录: |