博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原]distcc源码研究三
阅读量:4653 次
发布时间:2019-06-09

本文共 1356 字,大约阅读时间需要 4 分钟。

作者:朱金灿

来源:

 

      继续研究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。在以后的岁月里我们将重点剖析该函数。这篇就到这里吧。

作者:clever101 发表于2012-2-3 21:41:59
阅读:226 评论:0

转载于:https://www.cnblogs.com/wdpp/archive/2012/02/03/2387086.html

你可能感兴趣的文章
第一次软件工程作业(改进版)
查看>>
网络流24题-飞行员配对方案问题
查看>>
Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
查看>>
引入css的四种方式
查看>>
iOS开发UI篇—transframe属性(形变)
查看>>
3月7日 ArrayList集合
查看>>
jsp 环境配置记录
查看>>
Python03
查看>>
LOJ 2537 「PKUWC2018」Minimax
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
Some configure
查看>>
流量调整和限流技术 【转载】
查看>>
1 线性空间
查看>>
VS不显示最近打开的项目
查看>>
DP(动态规划)
查看>>
chkconfig
查看>>
2.抽取代码(BaseActivity)
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
反射的所有api
查看>>
css 定位及遮罩层小技巧
查看>>