[原]distcc源码研究四
作者:朱金灿
来源:http://blog.csdn.net/clever101
在《distcc源码研究三》中我提到dcc_build_somewhere_timed函数,认为是在这个函数里创建编译进程中。那么我们就看看这个函数是如何创建编译进程的。
dcc_build_somewhere_timed函数里面主要调用dcc_build_somewhere函数。下面我们仔细剖析下dcc_build_somewhere函数。
dcc_build_somewhere函数比较复杂。它首先调用dcc_expand_preprocessor_options函数来解析gcc的编译选项,接着调用dcc_discrepancy_filename函数来取得一个比较本地和服务器的差异的文件名(这一步比较难理解,但应该不是重要的)。之后调用dcc_scan_args函数来解析diatcc的其它命令行参数。调用dcc_make_tmpnam函数创建一个临时文件来保存服务器端的错误。接下来的一步是调用dcc_pick_host_from_list_and_lock_it函数来获取所有的编译服务器并进行对之进行锁定,这里的编译服务器包括远程的编译服务器和本地的编译服务器(即本机)。这里稍微解释下distcc的工作原理:distcc 将预处理代码发送给网络中的其他指定机器。distccd 守护进程确保编译在远程机器上发生。distcc 的设计目的是与 GNU make 的并行编译(-j)选项一起使用。distcc 本身不是一个编译器;它只是用作 g++ 的一个前端。几乎 g++ 的所有选项都可以按原样传递给 distcc。因此本地机器需要知道应该将编译过程分布到哪些服务器。根据您的shell,发出与下面命令相似的命令:
export DISTCC_HOSTS='localhost tintin asterix pogo'
tintin、asterix 和 pogo 是网络中可以驻留编译过程的其他主机;localhost 是本地计算机。
也可以不使用导出指令。您可以创建一个名为 hosts 的文件,将服务器的名称放在该文件中,各个名称使用空格分隔。将该文件复制到$HOME/.distcc 文件夹。
因此获取编译服务器的方式实际上有两种:通过获取环境变量DISTCC_HOSTS的值或者通过读取host文件。
在dcc_pick_host_from_list_and_lock_it函数中在调用dcc_get_hostlist函数获取所有的编译服务器后调用dcc_remove_disliked函数判断获取的编译服务器是否可用,将不可用的服务器从服务器列表删除。我觉得这里可以改进为扫描在同一网段的机器,如发现有可用的编译服务器,将将其加入到服务器列表。IncrediBuild貌似是这样实现的。最后调用dcc_lock_one函数来寻找一台编译器通过解释本地状态来运行分布式编译(可以是远程服务器或者本地服务器,dcc_lock_one这一步的作用是什么呢?是不是寻找创建编译进程的服务器呢?)。这篇就暂且分析到这里。
参考文献:
1. 分布式编译