zoukankan      html  css  js  c++  java
  • distcc源码研究三

    作者:朱金灿

    来源:http://blog.csdn.net/clever101

     

          继续研究distcc。今天我在思考这样一个问题:分布式编译系统本身并不是编译器,它本质是一个编译请求的发起者和执行者,也就是说,它必须创建编译进程,而要创建编译进程,它需要找到编译器,具体到distcc,就是gcc编译器。就是分布式编译的客户端或者转入一个编译器参数,或者它自己去找编译器。

     

           今天通过阅读代码,证实了我的猜测。Distcc客户端程序是一个控制台程序,它带有一些命令行参数,如—help用于显示帮助信息,--version用于显示版本信息等等。今天我们抛开这些细节,遵循这样研究思路:看看distcc如何gcc编译器,又是如何创建编译进程的。

     

           很快,我们找到这样一个函数:dcc_find_compiler。看样子这个函数是用来实现寻找编译器的。让我们看看事实是不是这样的。

    intdcc_find_compiler(char **argv, char ***out_argv)
    
    {
    
        int ret;
    
        if (argv[1][0] == '-'
    
            || dcc_is_source(argv[1])
    
            || dcc_is_object(argv[1])) {
    
            if ((ret = dcc_copy_argv(argv,out_argv, 0)) != 0) {
    
                return ret;
    
            }
    
     
    
            /* change "distcc cc -cfoo.c" -> "cc -c foo.c" */
    
            free((*out_argv)[0]);
    
            (*out_argv)[0] =strdup("cc");
    
            if ((*out_argv)[0] == NULL) {
    
              return EXIT_OUT_OF_MEMORY;
    
            }
    
            return 0;
    
        } else {
    
            /* skip "distcc", point to"gcc -c foo.c"  */
    
            return dcc_copy_argv(argv + 1,out_argv, 0);
    
        }
    
    }


            我们看到这个函数确实是查找编译器的。我们也看到了distcc实际上支持两种编译器的,一种是cc(貌似是SUN推出的C++编译器),另一种是gcc。找到的编译器及其编译文件参数保存在out_argv变量中。

     

           既然我们找到编译器,那么下一步应该是创建编译进程。在main函数中在调用完dcc_find_compiler函数接着调用dcc_trim_path函数,貌似是检查系统有安装gcc或cc,反正不是创建编译进程的,暂且忽略。继续往下看。

     

           跳过一些次要的函数,我终于找到一个重要的函数:dcc_build_somewhere_timed。在以后的岁月里我们将重点剖析该函数。这篇就到这里吧。


  • 相关阅读:
    poptest老李谈动态口令原理
    poptest老李谈数据库优化总结
    poptest老李谈jvm的GC
    poptest老李谈分布式与集群 2
    poptest老李谈分布式与集群 1
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 3
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 2
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 1
    老李谈JVM内存模型
    Oracle常见语法错误
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470894.html
Copyright © 2011-2022 走看看