makefile - 如何为特定目标上的变量赋值?
makefile - How to assign a value to a variable on specific target?
在下面的代码片段中:
IMAGES_TO_DELETE := $(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)
.PHONY: target1 target2 cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) --image-ids "$(IMAGES_TO_DELETE)" || true
${DISPLAYINFO} "Done"
target1:
# do something
target2:
# do something
IMAGES_TO_DELETE
以 JSON 格式给出图像列表。
IMAGES_TO_DELETE
应该在 make cleanimage
执行时分配
如何给cleanimage
目标下的变量赋值?
Make 变量必须始终用括号括起来。如果不是,那么只有下一个字符是变量的一部分。
所以当你写 $ECR_REGION
时,make 会扩展变量 $E
(可能是空的)然后追加字符串 CR_REGION
。不是你想要的。
您必须写 $(ECR_REGION)
(如果您愿意,也可以写 ${ECR_REGION}
:它们等同于 make)。
同上 $(ECR_REPO)
和 $(IMAGES_TO_DELETE)
。
见https://www.gnu.org/software/make/manual/html_node/Reference.html
您似乎对 make
变量有持续的误解。
目前尚不清楚为什么 this 需要成为一个变量。只需将其内联到目标中即可:
.PHONY: cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) \
--image-ids "$$(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) \
--filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
${DISPLAYINFO} "Done"
顺便说一句 $(aws...)
不是一个有效的 make
函数;你是说 $(shell aws ...)
;但同样,如果仅在单个目标中需要它,则根本不需要在 make
中对其进行评估。
在重复信息的地方,将其重构为变量是有意义的,这样您只需在一个地方更改它。
ECRFLAGS := --region $(ECR_REGION) --repository-name $(ECR_REPO)
.PHONY: cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image $(ECRFLAGS) \
--image-ids "$$(aws ecr list-images $(ECRFLAGS) \
--filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
${DISPLAYINFO} "Done"
请记住,单个美元符号由 make
计算。如果要将文字美元符号传递给 shell,则需要将其加倍。
在下面的代码片段中:
IMAGES_TO_DELETE := $(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)
.PHONY: target1 target2 cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) --image-ids "$(IMAGES_TO_DELETE)" || true
${DISPLAYINFO} "Done"
target1:
# do something
target2:
# do something
IMAGES_TO_DELETE
以 JSON 格式给出图像列表。
IMAGES_TO_DELETE
应该在 make cleanimage
执行时分配
如何给cleanimage
目标下的变量赋值?
Make 变量必须始终用括号括起来。如果不是,那么只有下一个字符是变量的一部分。
所以当你写 $ECR_REGION
时,make 会扩展变量 $E
(可能是空的)然后追加字符串 CR_REGION
。不是你想要的。
您必须写 $(ECR_REGION)
(如果您愿意,也可以写 ${ECR_REGION}
:它们等同于 make)。
同上 $(ECR_REPO)
和 $(IMAGES_TO_DELETE)
。
见https://www.gnu.org/software/make/manual/html_node/Reference.html
您似乎对 make
变量有持续的误解。
目前尚不清楚为什么 this 需要成为一个变量。只需将其内联到目标中即可:
.PHONY: cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image --region $(ECR_REGION) --repository-name $(ECR_REPO) \
--image-ids "$$(aws ecr list-images --region $(ECR_REGION) --repository-name $(ECR_REPO) \
--filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
${DISPLAYINFO} "Done"
顺便说一句 $(aws...)
不是一个有效的 make
函数;你是说 $(shell aws ...)
;但同样,如果仅在单个目标中需要它,则根本不需要在 make
中对其进行评估。
在重复信息的地方,将其重构为变量是有意义的,这样您只需在一个地方更改它。
ECRFLAGS := --region $(ECR_REGION) --repository-name $(ECR_REPO)
.PHONY: cleanimage
cleanimage:
${DISPLAYINFO} "Clean untagged image from AWS ECR "
aws ecr batch-delete-image $(ECRFLAGS) \
--image-ids "$$(aws ecr list-images $(ECRFLAGS) \
--filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json)" || true
${DISPLAYINFO} "Done"
请记住,单个美元符号由 make
计算。如果要将文字美元符号传递给 shell,则需要将其加倍。