Docker 如何替换";%中的字符串&引用;存档

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) 我试图替换%中的字符串,但它

我已使用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)
我试图替换
%
中的字符串,但它无法工作。有什么建议吗?

您可以通过以下方式来完成:

请注意双
$
符号-因为它们将在最终扩展中扩展为美元符号。您也可以使用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)))