2017-06-12 58 views
1

(來自https://groups.google.com/d/msg/bazel-discuss/HEpui0DLvnA/RzuwICDmBgAJ聲明包括源C++編譯動作無效

原諒我,如果這已被提出,並通過該組/開發者的回答。

「Declared include source」文件的列表是C++編譯操作鍵的一個組件。

這意味着向cc_ *目標的srcs或hdrs添加擴展頭文件會導致所有可以看到聲明的列表內容(在hdrs情況下,可傳遞)的編譯操作失效。

任何人都可以解釋這可能是必要的,當包括修剪應該提供一個最小的可能的無效源編譯集?

回答

1

當規則的定義更改(向srcs/hdrs添加文件)時,Bazel必須假定更改可能會影響編譯結果,即使其他文件都沒有更改。 (例如,您剛剛添加了以前缺少的標頭。)

如果重建目標Bazel會重新執行編譯操作。如果該輸出(對象文件)與上次Bazel運行該操作時的輸出相同,則它將重新驗證下游操作而不重新執行它們。

2

信譽阻止我評論你的答案和重新發布意味着我沒有自己的問題,但還有更多的問題不僅僅是一個「重新驗證」:

申報列入來源是及物動詞導致在依賴目標中的所有編譯行爲失效和重新執行(不是簡單地重新驗證,其定義對我來說完全是模糊的)。

這篇文章的要點是討論(因此BAZEL-討論)是否有什麼辦法,以前編譯輸出可能會受到影響,後勤,通過加入(不是在討論去除的)頭文件的定義,而不會更改與以前編譯相關的任何來源。爲了匹配使用的頭文件,輸入集應該(必須)足夠準確地描述唯一可能的動作重新執行的觸發器。任何編譯依賴於新添加的頭文件的容量都是零,而不會對動作輸入集的實際內容做進一步的修改。

+0

「聲譽阻止​​我評論你的答案,轉發意味着我不擁有這個問題」 - 對不起,我沒有預料到這個問題。 –

+0

「重新驗證」我的意思是說Bazel重新執行動作,但如果它的輸出與上次運行時相同,Bazel認爲下游動作(取決於此文件)是最新的。我認爲添加一個頭文件會影響編譯,例如如果具有相同名稱的文件已包含在其他包含路徑中,例如:你將自己的「stdio.h」添加到'srcs'。 –

+0

我認識到bazel的動作緩存和體系結構的難度,但是這會產生一個笨重的'可能導致修改'​​目標的橫截面。儘管stdio.h示例是有效的(儘管本地/系統引用/尖括號包含路徑很複雜),基本名稱的實際限制,更不用說解析路徑,完全被忽略,從而增加了我的'new_header.h'沒有出現在*任何*現有的可用的聲明包含清單可笑的昂貴。 –