2017-06-13 82 views
1

我有幾塊C++代碼(模板,宏等),它們在使用某些方法時不能編譯。手工編寫一段代碼不會編譯和驗證它不能編譯的代碼很容易,但這不是自動的。看起來Bazel應該能夠編譯一段代碼並自動驗證它不能作爲bazel test的一部分進行編譯,而這看起來像是C++代碼的一個相當常見的情況。有一種內在的方式來做到這一點?如何確認某些代碼不能與Bazel編譯?

我試圖避免滾動生成一個shell腳本調用C++編譯器,因爲處理所有巴澤勒傳遞給C++工具鏈是真的很辛苦的觀點我自己的雲雀規則。目前,bazelbuild/bazel#146和其他一些相關的問題意味着所有的信息都不可用。

回答

1

編寫創建臨時工作空間,並在其中建立和C++文件的測試,則測試內部調用巴澤勒,並驗證其退出代碼和stderr輸出。

我們做類似的事情全部用巴澤勒自己的集成測試的時間。看到一個完整的例子在提交e78ad83:所述測試數據取決於巴澤勒本身,設置了一個工作區模擬,並建立文件並運行巴澤勒作爲子進程,然後斷言其標準輸出(在這種情況下:的bazel info server_pid結果)。 (注:其中的一些源文件被從那時起更新,所以看的最新版本)

+0

每[討論郵件列表(https://groups.google.com/d/topic/bazel-discuss/ tTdB8bye4Q /討論),這不是我正在尋找的,但它很接近。我希望避免重複或想出如何重用自定義CROSSTOOL,bazel.rc等,但聽起來這是不可能的。一旦C++ Skylark API更完整,這應該很容易解決,但現在這是一個好的,因爲它得到。謝謝! –

1

也許只是創建使用的代碼錯誤的方式cc_binary目標的測試,然後寫一個shell腳本或其他工具來調用巴澤勒建立和檢查返回代碼。不是最乾淨的方式。

所以shell腳本將使一堆調用巴澤爾做這樣的事情的。至少你不必弄清楚Bazel編譯的編譯器,但是你失去了對Bazel的完美集成測試。

bazel build //tests:test_that_should_fail_at_compile_time 
if [ $? != 0 ]; then 
    echo "Test Passed!" 
fi