多个特定于目标的变量值

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)

有什么方法可以用简单的方法设置本地环境(特定于目标的变量)?

Mad*_*ist 7

您的第一个问题的直接答案是肯定的,您必须为每个特定于目标的变量使用单独的目标行并逐一设置它们。

你的第二个问题的答案是肯定的:一个是由 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)

注意:第一个参数是目标,每个赋值必须是一个“单词”(没有嵌入的空格)并且赋值之间没有逗号。


uzs*_*olt 6

我会做:

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以运行命令。

  • 在这种情况下,您可以使用 `${or ${${@}_image},default_image}`。 (2认同)