如何在makefile中用点分割字符串

时间:2016-08-23 03:51:27

标签: makefile gnu-make

我已经制作了像这样的目标

1,2,3,4...178,179

我喜欢test.% export var1=$(basename $*) && export var2=$(subst .,,$(suffix $*))

现在我想再做一个像test.var1.var2这样的关卡如何在makefile中获取

编辑:

我想这样做的原因是因为我使用Make文件来部署多个应用程序,我想要很多变量。以便用户可以部署

test.var1.var2.var3

1 个答案:

答案 0 :(得分:7)

使用subst将空格替换为空格,以便它成为一个列表。然后使用word访问特定元素:

word-dot = $(word $2,$(subst ., ,$1))

test.%:
    export var1=$(call word-dot,$*,1) && export var2=$(call word-dot,$*,2) && export var3=$(call word-dot,$*,3)

哪个输出:

$ make test.foo.bar.baz
export var1=foo && export var2=bar && export var3=baz

作为一个(这实际上将占用我的大部分答案),如果你事先知道选项是什么,你可以选择一些强大的元编程。假设您要为某些test-{app}生成APPS目标:

tmpl-for = $(foreach x,$2,$(call $1,$x))
rule-for = $(foreach x,$2,$(eval $(call $1,$x)))

APPS := foo bar baz

tmpl-test = test-$1

define test-vars-rule
$(call tmpl-test,$1): APP := $1
.PHONY: $(call tmpl-test,$1)
endef

$(call rule-for,test-vars-rule,$(APPS))
$(call tmpl-for,tmpl-test,$(APPS)):
        @echo Testing app: $(APP)

前两行是"库"将调用"模板"的函数(tmpl-for)或为您提供的列表中的每个元素生成规则(rule-for)作为第二个参数。我创建一个tmpl-test,其中包含应用名称并提供test-{app}。我定义了一个规则模板,该模板获取应用程序名称并为相应的APP目标设置特定于目标的test-{app}变量(顺便说一下,这也是假的)。然后,我使用rule-for创建了设置APP的所有规则。最后,我编写了目标的实际主体,并使用tmpl-for获取了所有可能目标的列表。

$ make test-foo
Testing app: foo
$ make test-bar
Testing app: bar
$ make test-baz
Testing app: baz
$ make test-blah
make: *** No rule to make target 'test-blah'.  Stop.

这听起来很复杂,但如果你正确地抽象模板功能,它可以生成灵活且易于维护的构建系统。