Node.JS的编译过程
作者:本站编辑 发布时间:2015-11-24 来源:本站原创
点击数:
Node的编译系统使用waf,waf是一个基于python的编译系统,用于替代传统的autoconfig和automake。node编译的主要控制文件是wscript,文件中的各函数对应编译过程中的各个过程。主要函数有如下几个:set_options, configure, v8_cmd, build_v8, build和shutdown。从编译脚本和代码来看,node好像在为win32原生支持做准备,因为编译脚本和源代码文件已经开始区分对待win32和cygwin了。
set_options:
set_options应该是每次waf执行都会被最先被调用,它设置了node编译时的选项,执行./configure –help显示出的编译选项都是在这个函数中定义的。用户输入的选项以字符串的形式保存在编译上下文中。
Configure:
Configure在执行configure命令的时候被调用。函数的上班部分主要将用户设置的参数全都设置到环境变量中。这样设置编译选项就有两种方式,命令行参数和环境变量,效果是一样的。函数的后半部分检测操作系统类型和CPU类型以及编译器的能力。
v8_cmd:
其中保存的是v8的编译规则,由于v8是用scons编译的,所以这个函数其实就是用来拼接命令调用scons来编译v8的命令。
build_v8:
此函数用来执行实际的v8编译。
build:
此函数应该在build时被调用,用来执行build操作。函数中首先调用build_v8编译v8,然后调用deps/libev和deps/c-ares下的wscript编译libev和c-ares,然后是编译http_parser。
接下来是一个比较有趣的部分,也因该是有些人关心的部分。Node使用v8附带的js2c.py将node的js代码转化为c语言的数组,也就是node_natives.h,然后直接编译进node的可执行文件中。虽说在node文件中的字符串表段中肯定还是以原文保存这些代码,但是这就为js代码提供了一层加密,人们不能轻易就看到源代码。这样也提供了一种可能,将编写好的js代码混淆然后编译成dll发布出去,这样应该很大程度上解决了js必须源代码发布的问题。
函数中最后就是node本身代码的编译了,其中有设置node的版本号并将其编译到node文件中。还有一个应该注意的:作者好像比较喜欢dtrace,在node中专门加入了很多dtrace使用的探测点或者桩函数(这个说明作者在solaris下做性能测试?)。dtrace确实比较好用了,不过仅在solaris下可用。
有一个要说明的:只有在使用静态编译依赖库的时候才会node的编译系统才会编译deps下的v8、libev和 c-ares。如果选择动态的话,要自己指定头文件的位置,还要自己将依赖库编译成动态链接库文件的形式,在执行时还需要维护LD_LIBRARY_PATH环境变量。
还有一个不太明白的地方,编译脚本中用new_task_gen建立了很多新的任务。不过这些任务全都没有看到有调用执行的地方。这些函数在最新的waf中也不存在了,所以只能猜测这些代表task的变量在超出作用域的时候会被waf依次执行。
Shutdown:
这个函数看起来是每次waf执行都会被调用,且在做最后执行。如果clean则删除快捷方式,不是则建立快捷方式的工作。