• 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. 分布式编译


  • 相关阅读:
    OAuth 2 深入介绍
    浅谈 EF CORE 迁移和实例化的几种方式
    为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
    三值 bool? 进行与或运算后的结果
    Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
    int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
    .NET 中使用 Mutex 进行跨越进程边界的同步
    UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
    谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
    只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470891.html
Copyright © 2020-2023  润新知