之前说了rebar编译的核心部分(rebar_base_compile:run/4方法),现在我们就完整的看下Erlang编译流程([b]不准备细致的分析每一行代码,只罗列其中较为重要的部分[/b])
编译的入口方法是: [b] rebar_erlc_compiler:compile/2[/b]
[img]http://dl.iteye.com/upload/attachment/0079/9249/2e044f0a-a6c0-3996-9102-07d701700513.jpg[/img]
其中doterl_compile负责编译我们写的Erlang源代码文件,我们来看下它的相关代码
[img]http://dl.iteye.com/upload/attachment/0079/9251/31016c75-8561-3c15-81b2-e23c59909a2b.jpg[/img]
注意观察第208行代码,这就是我们上一节说的核心编译部分(串行编译和并行编译),其中:
[color=blue]fun(S, C) ->
internal_erl_compile(C, S, OutDir1, ErlOpts)
end[/color]
用来做为run方法的第四个参数:CompileFn,我们看下它究竟做了些什么:
[img]http://dl.iteye.com/upload/attachment/0079/9253/54db46d7-a64e-31e0-b7d2-02eac33a0364.jpg[/img]
简单来说,只有[b]当源文件最后修改时间 > 之前生成的目标文件(*.beam)[/b]才会重新编译,其余情况都会跳过编译
编译的入口方法是: [b] rebar_erlc_compiler:compile/2[/b]
[img]http://dl.iteye.com/upload/attachment/0079/9249/2e044f0a-a6c0-3996-9102-07d701700513.jpg[/img]
其中doterl_compile负责编译我们写的Erlang源代码文件,我们来看下它的相关代码
[img]http://dl.iteye.com/upload/attachment/0079/9251/31016c75-8561-3c15-81b2-e23c59909a2b.jpg[/img]
注意观察第208行代码,这就是我们上一节说的核心编译部分(串行编译和并行编译),其中:
[color=blue]fun(S, C) ->
internal_erl_compile(C, S, OutDir1, ErlOpts)
end[/color]
用来做为run方法的第四个参数:CompileFn,我们看下它究竟做了些什么:
[img]http://dl.iteye.com/upload/attachment/0079/9253/54db46d7-a64e-31e0-b7d2-02eac33a0364.jpg[/img]
简单来说,只有[b]当源文件最后修改时间 > 之前生成的目标文件(*.beam)[/b]才会重新编译,其余情况都会跳过编译