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,则需要将其加倍。