distcc源码研究三
作者:朱金燦
來源:http://blog.csdn.net/clever101
?
????? 繼續(xù)研究distcc。今天我在思考這樣一個(gè)問題:分布式編譯系統(tǒng)本身并不是編譯器,它本質(zhì)是一個(gè)編譯請(qǐng)求的發(fā)起者和執(zhí)行者,也就是說,它必須創(chuàng)建編譯進(jìn)程,而要?jiǎng)?chuàng)建編譯進(jìn)程,它需要找到編譯器,具體到distcc,就是gcc編譯器。就是分布式編譯的客戶端或者轉(zhuǎn)入一個(gè)編譯器參數(shù),或者它自己去找編譯器。
?
?????? 今天通過閱讀代碼,證實(shí)了我的猜測(cè)。Distcc客戶端程序是一個(gè)控制臺(tái)程序,它帶有一些命令行參數(shù),如—help用于顯示幫助信息,--version用于顯示版本信息等等。今天我們拋開這些細(xì)節(jié),遵循這樣研究思路:看看distcc如何gcc編譯器,又是如何創(chuàng)建編譯進(jìn)程的。
?
?????? 很快,我們找到這樣一個(gè)函數(shù):dcc_find_compiler。看樣子這個(gè)函數(shù)是用來實(shí)現(xiàn)尋找編譯器的。讓我們看看事實(shí)是不是這樣的。
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);}}??????? 我們看到這個(gè)函數(shù)確實(shí)是查找編譯器的。我們也看到了distcc實(shí)際上支持兩種編譯器的,一種是cc(貌似是SUN推出的C++編譯器),另一種是gcc。找到的編譯器及其編譯文件參數(shù)保存在out_argv變量中。
?
?????? 既然我們找到編譯器,那么下一步應(yīng)該是創(chuàng)建編譯進(jìn)程。在main函數(shù)中在調(diào)用完dcc_find_compiler函數(shù)接著調(diào)用dcc_trim_path函數(shù),貌似是檢查系統(tǒng)有安裝gcc或cc,反正不是創(chuàng)建編譯進(jìn)程的,暫且忽略。繼續(xù)往下看。
?
?????? 跳過一些次要的函數(shù),我終于找到一個(gè)重要的函數(shù):dcc_build_somewhere_timed。在以后的歲月里我們將重點(diǎn)剖析該函數(shù)。這篇就到這里吧。
轉(zhuǎn)載于:https://www.cnblogs.com/lanzhi/archive/2012/02/03/6470894.html
總結(jié)
以上是生活随笔為你收集整理的distcc源码研究三的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C和C++中的整形数据类型
- 下一篇: 一个简单的apache cgi-bin