2011-06-06 54 views
4

(這是問題ccache and absolute path不同,因爲我想只有命令路徑不被放在ccache主機上擴大)如何獲得ccache到完整路徑不傳遞給編譯器DISTCC

當使用ccache和distcc一起ccache正在將編譯器擴展爲絕對路徑,然後distcc無法使用遠程機器上的PATH來選擇要使用的編譯器。

例如我打電話CCACHE_PREFIX=distcc ccache g++ foo.cc,ccache 擴展爲本地預處理步驟和緩存檢查,然後調用distcc爲distcc /usr/bin/g++,這是錯誤的版本(g ++位於/ usr/bin之前的遠程路徑中,根本就沒有機會搜索路徑)。

我有各種不同的機器被用作distcc主機,他們有不同的地方安裝gcc/g ++版本(是的,如果我把它們放在/ usr/local之類的地方,這個問題就會消失,但我目前無法做到這一點)。

是否有一個設置讓ccache通過g++ distcc而不是將路徑擴展到本地編譯器的絕對路徑?我並不完全反對打補丁的ccache如果沒有設置還沒有,但是這是一個不得已的:)

回答

6

原來有一個簡單的方法來做到這一點:只需直接使用包裝爲CCACHE_PREFIX,而不是distcc,喜歡的東西這樣的:

文件:distcc-wrap.sh

#!/bin/sh 
compiler=$(basename $1) 
shift 
exec distcc "$compiler" "[email protected]" 

export CCACHE_PREFIX=distcc-wrap.sh然後這允許遠程編譯住在不同的地方並用distcc將搜索的路徑了。

(感謝喬爾這個答案ccache的郵件列表;看http://www.mail-archive.com/[email protected]/msg00670.html的原始消息)

1

我嘗試的大衛的解決方案,但遇到問題「的distcc似乎已經遞歸調用自身!」 in distcc plain模式。這是因爲當主機distcc做預處理(cpp)時,它會調用主機ccache,但是會攔截併產生一個嵌套的distcc,並形成遞歸調用:

g ++ - > ccache - > distcc - > distcc-wrap - >使用g ++預處理 - > ccache - > distcc - > ....等等。

我的解決辦法是使用DISTCC_CMDLIST,從man distccd

DISTCC_CMDLIST

如果環境變量DISTCC_CMDLIST設置,由DISTCC_CMDLIST命名的文件加載支持的命令列表,並拒絕爲其最後一個DISTCC_CMDLIST_MATCHWORDS最後一個單詞與該列表中的命令不匹配的任何命令提供服務。請參閱src/serve.c中的註釋。

假設遠程計算機上要使用/usr/local/ccache/g++(這是一個Simulink中/usr/bin/ccache)做編輯,而不是使用由主機擴展的絕對路徑,你可以這樣做:

  1. 創建文件/path/to/.distcc/DISTCC_CMDLIST這一行:

    /usr/local/ccache/g++

  2. export DISTCC_CMDLIST=/path/to/.distcc/DISTCC_CMDLIST

  3. 重啓distccd系統服務 distccd --no-detach -a <host IPs> --daemon

會發生什麼事是每當distcc的遠程服務器接收來自主機的擴展命令艾克/usr/bin/g++ main.cc -c,它將真正的編譯器從/ usr/bin中映射/ G ++到/ usr /本地/ ccache的/克++。

  1. 檢索來自編譯器的路徑基本名中(在這種情況下g++)接收命令

  2. 查找DIST_CMDLIST文件以查看是否任何線具有基本名等於g++:所述映射是由完成。在這種情況下,它將是/usr/local/ccache/g++

  3. 將命令覆蓋到/usr/local/ccache/g++ main.cc -c。這將調用遠程服務器上的ccache。

上面的僅僅是一個例子,並且可以通過從1改變DISTCC_CMDLIST_NUMWORDS值爲其他值做更多的花樣延伸編譯器映射。

相關問題