我不知道有什么方法可以在GNU Make中定义编程目标。这怎么可能?如何以编程方式在GNU Make中定义目标?
有时候可以走开with alternate methods。然而,在Makefiles中定义编程目标的能力对编写和组织复杂的生产规则非常重要,其中make
。的复杂的生产规则的例子是在FreeBSD中的构建系统或在生成文件库如BSD Owl
壳脚本和Makefiles之间的main differences发现是:
在生成文件时,程序的状态是由命令行和文件系统给出,因此可以在作业中断后重新开始工作。当然,这需要正确编写Makefiles,但即使这很困难,也比使用shell脚本实现类似效果要容易得多。
在Makefile中,用建议来装饰过程或使用钩子来装饰过程是很荒唐的,而在shell脚本中这实际上是不可能的。
例如,一个非常简单的和有用的模式如下:
build: pre-build
build: do-build
build: post-build
这呈现的build
目标作为三个目标包含实际指令do-build
和两个其它,它们是复合材料,一个挂钩,在do-build
之前和之后执行。此模式是由为BSD作,这亦允许的目标编程定义写入许多构建系统使用的,这样一方面可以在分批写:
.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor
由.if/.endif
块引入的条件使用户能够使用其自己定义任何${_target}
。
那个GNU Make片段的翻译是什么?
需要注意的是,在GNU中,你不需要**在目标先决条件之间得到一个有序保证(尽管没有'-j'我认为假设你通常是安全的),所以你的“钩子“不一定做你想做的事。 – 2015-03-02 16:53:59
@EtanReisner当然,但这与问题没有直接关系,我忽略了这一点,以保持简单。例如,在BSD Make中,有人说''。ORDER:预编译do-build post-build'来执行所提及目标的串行处理。 – 2015-03-02 16:55:41
使用或不使用'-j',make将始终以相同的顺序走先决条件列表。只是''j''''''''''''''''''''''''''''''''''''''''''''''''''''不会等待以前的(非相关的)先决条件完成,然后再开始新的先决条件没有'-j' make _does_保证按顺序构建。 – MadScientist 2015-03-02 16:57:18