zoukankan      html  css  js  c++  java
  • 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. 分布式编译


  • 相关阅读:
    .NET 分布式架构开发实战之一
    frame中隐藏横向滚动条
    实时检测网络状态及是否可以连接Internet
    jquery表格插件推荐
    FireFox窗体frameset,iframe间的js调用方法
    用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通
    一个阴历阳历互相转化的类
    CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能
    Windows下命令行下启动ORACLE服务
    使用C#进行点对点通讯和文件传输(通讯基类部分)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470891.html
Copyright © 2011-2022 走看看