多个特定于目标的变量值

时间:2018-05-14 03:03:25

标签: docker makefile gnu-make

将文档发送到manage Target-specific Variable Values

prog : CFLAGS = -g
prog : prog.o foo.o bar.o

我可以设置特定于目标的变量。

现在我的问题是,如何设置多个特定于目标的变量。我是否必须逐一设置它们?

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"

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

2 个答案:

答案 0 :(得分:2)

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

你的第二个问题的答案是肯定的:一个是由uzsolt描述的。这也是我推荐的方法。 uzsolt解决方案与特定于目标的变量解决方案之间的一个区别是,特定于目标的变量为inherited by prerequisites。你似乎不需要这种行为,但如果你这样做,那么这个解决方案对你不起作用。

如果您需要特定于目标的变量,或者每个变量赋值的一行仍然太痛苦(例如,您拥有非常多的这些并且您确实希望每个组有一行),那么可能有更多选项理解起来很复杂,但以后更容易使用。

例如,如果您知道没有任何变量值包含空格,那么您可以创建一个用户定义的宏,该宏使用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)

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

答案 1 :(得分:1)

我会这样做:

            CPU           |  cache   |  lookup (µs)   |     array (µs)  | speedup (x)
Xeon E5-1650 v3 @ 3.50GHz | 15360 KB |  60011 ±  3667 |   29313 ±  2137 | 0.49
Xeon E5-2697 v3 @ 2.60GHz | 35840 KB |  66571 ±  7477 |   33197 ±  3619 | 0.50
Celeron G1610T  @ 2.30GHz |  2048 KB | 172090 ±   629 |  162328 ±   326 | 0.94
Core i3-3220T   @ 2.80GHz |  3072 KB | 111025 ±  5507 |  114415 ±  2528 | 1.03
Core i5-7200U   @ 2.50GHz |  3072 KB |  92447 ±  1494 |   95249 ±  1134 | 1.03
Xeon X3430      @ 2.40GHz |  8192 KB | 111303 ±   936 |  127647 ±  1503 | 1.15
Core i7 920     @ 2.67GHz |  8192 KB | 123161 ± 35113 |  156068 ± 45355 | 1.27
Xeon X5650      @ 2.67GHz | 12288 KB | 106015 ±  5364 |  140335 ±  6739 | 1.32
Core i7 870     @ 2.93GHz |  8192 KB |  77986 ±   429 |  106040 ±  1043 | 1.36
Core i7-6700    @ 3.40GHz |  8192 KB |  47854 ±   573 |   66893 ±  1367 | 1.40
Core i3-4150    @ 3.50GHz |  3072 KB |  76162 ±   983 |  113265 ±   239 | 1.49
Xeon X5650      @ 2.67GHz | 12288 KB | 101384 ±   796 |  152720 ±  2440 | 1.51
Core i7-3770T   @ 2.50GHz |  8192 KB |  69551 ±  1961 |  128929 ±  2631 | 1.85

查看命令(我使用的是FreeBSD,GNU make命令是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 ):

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