2009-09-15 68 views
1

我在考慮在團隊基礎上使用ccache和gcc編譯代碼(相同ccache的緩存將被同一臺機器上的所有開發人員使用)。與ccache一起使用gcc

由於我們談論的是商業產品,編譯的「正確性」是重中之重。

來到這裏的問題:

  1. 是編譯使用ccache是​​安全/重複性? 是否有一些ccache假設緩存命中錯誤的異常情況。

    如果我籤一個源代碼和編譯它,我希望收到每個I重複新鮮的編譯過程的時間相同的產品 (完全相同庫/二進制文件)。 這是必須以商業產品。

  2. 是否有使用ccache的開源/商業產品是其構建系統 構建系統的組成部分?這將更容易說服我的同事使用ccache。

由於

回答

6

根據其說明書,ccache確定其是否已經編譯前一些對象在以下方面:

  • 預處理器輸出從運行編譯器-E
  • 的命令行選項
  • 真實編譯器大小和修改時間
  • 編譯器

產生如果某些PHB仍擔心你把因爲ccache任何承擔風險的標準錯誤輸出,只能將其用於開發版本,並建立使用編譯器沒有任何前端的最終產品。或者您可以在構建最終產品之前清除緩存。

更新:我不知道如何使用ccache作爲其構建系統的一個組成部分的產品,但它確實是微不足道的融入在這裏你可以設置編譯器的路徑中的任何環境。即爲autoconf

CC="ccache gcc" ./configure 

而且看作者的名字後,我會說這是一個非常安全的假設,它已經在Samba團隊內得到廣泛應用。

響應Ringding的有關stderr使用提示更新:從視圖ccache的點,信息的一個有趣的一點是C編譯器的版本和配置字符串。 gcc將其輸出到標準錯誤文件:

$ gcc -v 2>err 
$ cat err 
Using built-in specs. 
Target: i486-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.4-2' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu 
Thread model: posix 
gcc version 4.3.4 (Debian 4.3.4-2) 

我敢打賭ccache使用這種或類似的輸出。但是,嘿,你可以隨時查看它的源代碼。 :-)

+0

它不能根據編譯器的stderr輸出做出決定,因爲它必須先調用編譯器。但其他3個是正確的,IIRC。 – Ringding 2009-09-15 07:41:59

+0

夥計們,你知道我的問題的第二項答案嗎? @hillu +1對於「安全」建議。答案的一個很好的部分是,如果事先清理緩存,開發人員也可以執行「安全」構建 – dimba 2009-09-15 08:54:17

0

我個人很熟悉ccache,它非常易於使用,而且我發現它非常適合我的大型私人項目。 但是,對於全隊範圍來說,我還沒有經驗。 你可能有興趣也AO (audited objects)

一般:

  • 它提供了更強大的機制,可以利用分佈式環境中用於緩存
  • ccache的加速只編譯時間,而AO加快鏈接也是時間。
  • 不僅限於C/C++

沒過多久我貼的答案(1.5年前...),我設法說服我們的建設和R & d經理,到ccache的融入自動構建系統,他們對此表示感謝。該公司僱用了200多名開發人員,所以它確實有效。至於連接階段,這仍然是一個問題。