我不知道有任何方法可以在 GNU Make 中以编程方式定义目标。这怎么可能?
有时可以使用替代方法。然而,在 Makefile 中以编程方式定义目标的能力对于使用make
. 在 FreeBSD 的构建系统或 Makefile 库(如BSD Owl )中可以找到复杂生产规则的示例
shell 脚本和 Makefile 之间的主要区别是:
在 Makefile 中,程序的状态由命令行和文件系统给出,因此可以在作业中断后恢复作业。当然,这需要正确编写 Makefile,但即使这相当困难,也比使用 shell 脚本实现类似效果要容易得多。
在 Makefile 中,用建议装饰过程或用钩子装饰过程非常容易,而这在 shell 脚本中基本上是不可能的。
例如,一个非常简单且有用的模式如下:
build: pre-build
build: do-build
build: post-build
这将目标呈现build
为三个目标的组合,一个包含实际指令do-build
,另外两个是钩子,在之前和之后执行do-build
。许多为 BSD Make 编写的构建系统都使用这种模式,顺便说一句,它允许对目标进行编程定义,因此可以批量编写:
.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor
块引入的条件.if/.endif
使用户能够使用它自己的 any 定义${_target}
。
GNU Make 的那个片段的翻译是什么?