我正在编写一个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)
我必须为每个配置重复这些规则。这不是很多,但它可能会成为一种痛苦的维持。我想使这些更通用,像这样(我知道它不起作用):
define libdir
$(BINDIR)/$(strip $1)/$(strip $2)
endef
$(call libdir, %, %):
mkdir -p $(call libdir, ??, ??)
哪个会创建具有给定结构的任何目录。有什么想法吗?
答案 0 :(得分:0)
看起来您可以使用简单的模式规则。
%/debug %/release: %:
mkdir -p $@
然后可能让每个平台都依赖于这些目录:
ios android osx windows linux: %: $(LIBDIR)/%/debug $(LIBDIR)/%/release
答案 1 :(得分:0)
如下的陈述:
define libdir
$(BINDIR)/$(strip $1)/$(strip $2)
endef
$(call libdir, %, %):
mkdir -p $(call libdir, ??, ??)
简单地删除文字字符%
;解析模式规则时,strip
函数不会扩展,而不是规则匹配时。
但是那没关系,因为它没有任何意义。首先,您不能在目标中拥有多个模式,因此像$(BINDIR)/%/%
这样的规则无论如何都不是合法模式规则。其次,模式匹配一组字符;这些角色是什么并不重要。如果要剥离,则必须去除用于匹配该模式规则的先决条件,而不是剥离模式规则。例如,你的makefile中的其他地方你将有一个规则:
foo: $(BINDIR)/$(FOO)/$(BAR)
您打算匹配该模式:那是您需要剥离的内容,而不是目标。
只是一个注释,但您不需要使用配方中的功能。为什么不使用$@
?
$(BINDIR)/%:
mkdir -p $@