在函数调用中使用makefile模式

在函数调用中使用makefile模式,makefile,Makefile,我正在编写一个makefile,它为不同的配置(调试、发布)构建多个平台(windows、iOS等)。我设法使它工作,它的建设正确,但我想使我的一些规则更通用,这样我就不必重复他们的每一个配置 每个文件都保存在给定的文件夹结构中。例如,如果使用调试配置构建iOS,则生成的文件将保存在iOS/debug中。例如,我有创建这些目录的规则: define libdir $(BINDIR)/$(strip $1)/$(strip $2) endef $(call libdir, ios, debug)

我正在编写一个makefile,它为不同的配置(调试、发布)构建多个平台(windows、iOS等)。我设法使它工作,它的建设正确,但我想使我的一些规则更通用,这样我就不必重复他们的每一个配置

每个文件都保存在给定的文件夹结构中。例如,如果使用调试配置构建iOS,则生成的文件将保存在iOS/debug中。例如,我有创建这些目录的规则:

define libdir
$(BINDIR)/$(strip $1)/$(strip $2)
endef

$(call libdir, ios, debug):
    mkdir -p $(call libdir, ios, debug)

$(call libdir, ios, release):
    mkdir -p $(call libdir, ios, release)
ios android osx windows linux: %: $(LIBDIR)/%/debug $(LIBDIR)/%/release
我必须为每个配置重复这些规则。这并不多,但维持下去可能会很痛苦。我想让这些更通用,像这样(我知道它不起作用):


它将创建具有给定结构的任何目录。有什么想法吗?

看起来你可以用一个简单的模式规则来代替

%/debug %/release: %:
    mkdir -p $@
然后可能使每个平台依赖于以下目录:

define libdir
$(BINDIR)/$(strip $1)/$(strip $2)
endef

$(call libdir, ios, debug):
    mkdir -p $(call libdir, ios, debug)

$(call libdir, ios, release):
    mkdir -p $(call libdir, ios, release)
ios android osx windows linux: %: $(LIBDIR)/%/debug $(LIBDIR)/%/release
这样的陈述:

define libdir
$(BINDIR)/$(strip $1)/$(strip $2)
endef

$(call libdir, %, %):
        mkdir -p $(call libdir, ??, ??)
只需去除文字字符
%
;当解析模式规则时,而不是当规则匹配时,
strip
函数将展开

但这没关系,因为从另一个角度看,这没有任何意义。首先,在一个目标中不能有多个模式,因此像
$(BINDIR)/%/%
这样的规则无论如何都不是合法的模式规则。第二,模式匹配一组字符;这些角色是什么并不重要。如果要剥离,则必须剥离用于匹配该模式规则的先决条件,而不是剥离模式规则。例如,在makefile的其他地方,您将有如下规则:

foo: $(BINDIR)/$(FOO)/$(BAR)
你想要匹配这种模式:这是你需要剥离的,而不是目标

只需一个注释,但您不需要使用配方中的函数。为什么不直接使用
$@

$(BINDIR)/%:
        mkdir -p $@

为什么要使用
strip
,以及您希望如何调用make来构建,例如,iOS的调试配置?我使用
strip
,因为有时调用函数时使用空格,可能是因为键入错误。它只是确保在传递函数参数时,空间不重要。对于这两种情况,我都有
iphonedebug
iphonerelease
iphone