Docker 如何替换";%中的字符串&引用;存档
我已使用Dockerfile跟踪文件夹Docker 如何替换";%中的字符串&引用;存档,docker,makefile,Docker,Makefile,我已使用Dockerfile跟踪文件夹 建造 路径1 v1 Dockerfile v2 Dockerfile 路径2 v1 Dockerfile 我将其收集为$(DOCKER_TARGES)--->build-path1-v1 build-path1-v2 build-path2-v2 现在我的目标 build-%: build/$(subst -,/,%))/Dockerfile $(shell find build -type f) 我试图替换%中的字符串,但它
- 建造
- 路径1
- v1
- Dockerfile
- v2
- Dockerfile
- v1
- 路径2
- v1
- Dockerfile
- v1
- 路径1
build-%: build/$(subst -,/,%))/Dockerfile $(shell find build -type f)
我试图替换%
中的字符串,但它无法工作。有什么建议吗?您可以通过以下方式来完成:
请注意双$
符号-因为它们将在最终扩展中扩展为美元符号。您也可以使用define来执行此操作,尽管我讨厌这样做,因为它会导致看不见的膨胀:
define MKRULE
build-$1: build/$$(subst -,/,$1) $$(shell find build -type f)
endef
foreach(f,$(TARGS),$(eval $(call MKRULE $f)))
铁杆亨利有一个很好的解决办法。但我想知道,有什么理由你不能直接命名你的目标
build-path1/v1
和build-path2/v2
等等。?没有规则禁止make变量的名称中包含/
,或者几乎任何其他特殊字符。如果您这样做了,您可能不需要在转换文件名时耍花招。另外,$(shell build-typef)
真的正确吗?如果是,这并不取决于与特定目标相关的任何内容,我建议您使用:=
将其分配到一个单独的变量中,因此它只被调用一次:BUILD\u FILES:=$(shell find BUILD-type f)
,然后将该变量用作先决条件。但很可能,您的意思是它只依赖于特定子目录中的文件,这是错误的(如果有任何更改,将重建所有内容)
define MKRULE
build-$1: build/$$(subst -,/,$1) $$(shell find build -type f)
endef
foreach(f,$(TARGS),$(eval $(call MKRULE $f)))