原 distcc原始碼研究四

2021-09-06 04:53:19 字數 1347 閱讀 6448

在《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. 分布式編譯

distcc原始碼研究三

繼續研究distcc。今天我在思考這樣乙個問題 分布式編譯系統本身並不是編譯器,它本質是乙個編譯請求的發起者和執行者,也就是說,它必須建立編譯程序,而要建立編譯程序,它需要找到編譯器,具體到distcc,就是gcc編譯器。就是分布式編譯的客戶端或者轉入乙個編譯器引數,或者它自己去找編譯器。今天通過閱...

cita 原始碼研究

適用環境 vim youcompleteme使用 github 源,不能使用 ustc 源 git clone depth 1 recusive所有 cargo.toml 中的庫版本號全部改為精確的細版本號,不能是粗略的大版本號 所有 cargo.toml 中的非官方託管庫,均改為 形式 第 2 3...

jQuery原始碼研究 怎麼看原始碼

這幾天有想看原始碼的想法,於是就開始了原始碼的研究,經過幾天的摸索發現看原始碼還是有點技巧在裡面的,想著把這些東東寫下來作為乙個小總結。在乙個多月前我對vue原始碼進行了一次研究,那時看原始碼的方式基本上是從上往下看,結果看著看著就看不下去了,後來找了乙個很老的版本看,但看的還是不太懂,於是想著乾脆...