distcc能夠加速編譯,可是遇到cmake可能就須要處理下。c++
distcc在 /usr/lib/distcc 中放了各編譯器的soft link(如cc/gcc等等),若是 /usr/lib/distcc 放到PATH最開始那麼就會被先找到,不過我沒有這樣作,而是臨時使用CC和CXX,以下spa
distcc-pump make -j$(distcc -j) CC="distcc cc"
可是對於cmake來講,cmake在configure的時候記錄了編譯器的絕對路徑,編譯命令是相似 /usr/bin/cc -o -c,因此distribute根本就不會發生code
既然是這樣,那理所固然是應該把 /usr/lib/distcc 放到PATH最開始,這樣 cmake就會記錄 /usr/lib/distcc/cc 做爲編譯器,一切都很好,直到cmake嘗試用這個編譯器編譯點代碼(用於檢測編譯器的特性),編譯就會報錯(沒法編譯過去)。手動在這種環境就嘗試編譯,會提示沒有使用distcc-pump,此時若使用 distcc-pump /usr/lib/distcc/cc 來手動編譯是能夠的。blog
因而,我大膽的猜想下,把 /usr/lib/distcc 放到PATH最開始,而且 distcc-pump cmake ..,確定就能夠了,很不幸,此次cmake找到的竟然是 /usr/bin/cc編譯器
經過 man distcc-pump,我發現能夠使用 distcc-pump --startup來看看給後續命令的環境變量,它竟然又把 /usr/bin加到了/usr/lib/distcc以前,再運行後續命令。我思考了下,問題應該是這樣的, 當/usr/lib/distcc 放到PATH最開始時,cc被link到 distcc,當實際運行時,distcc並不知道cc在哪裏,因此它須要把/usr/bin放到最開始,來找到真正的cc的位置,無論怎樣,用 /usr/lib/distcc/cc 編譯文件時, /usr/lib/distcc 是不能在PATH最開始的位置,不然編譯出錯,但咱們又但願cmake找到 /usr/lib/distcc/cc編譯
通過兩次嘗試,需求就很明顯了class
既然 /usr/lib/distcc 不能放在PATH最開始,又要讓cmake使用 /usr/lib/distcc/cc,那隻能是手動指定了,以下變量
cmake -DCMAKE_C_COMPILER=/usr/lib/distcc/cc -DCMAKE_CXX_COMPILER=/usr/lib/distcc/c++ ...
這樣 /usr/lib/distcc/cc 在運行時, /usr/bin 在PATH的最開始,它也能正確調用真正在 /usr/bin/cc 去執行編譯gcc