2017-06-13 3 views
1

私はいくつかのC++コード(テンプレート、マクロなど)を持っています。コンパイルしてはいけないものをコンパイルしないように手作業でコードを書くのは簡単ですが、それは自動化されていません。 Bazelはコードをコンパイルしてbazel testの一部としてコンパイルしないことを自動的に確認できるはずです。これはC++コードではかなり一般的な状況のようです。それを行うための組み込み方法はありますか?いくつかのコードがBazelでコンパイルされないことを確認する方法?

BazelがC++ツールチェーンに渡すすべての引数を処理することが本当に難しいため、C++コンパイラを呼び出すシェルスクリプトを生成する独自のSkylarkルールを使用しないようにしています。現在、bazelbuild/bazel#146とその他の関連する問題は、すべての情報が利用できないことを意味します。

答えて

1

テンポラリワークスペースを作成し、テストを書くと構築し、その中のC++ファイル、テスト内Bazelを呼び出し、その終了コードと標準エラー出力を確認します。

Bazel独自の統合テストでは、常に同様のことを行います。コミットe78ad83の完全な例を参照してください。テストデータ - Bazel自体に依存し、モックワークスペースとBUILDファイルを設定し、Bazelをサブプロセスとして実行し、stdoutをアサートします(この場合:bazel info server_pidの結果)。 (注:これらのソースファイルの一部はそれ以降更新されていますので、最新のバージョンをご覧ください)

+0

[ディスカッションのメーリングリスト](https://groups.google.com/d/topic/bazel-discuss/ tTdB8byeu4Q/discussion)、これは私が探していたものではありませんが、それは近いです。カスタムCROSSTOOL、bazel.rcなどを再利用する方法を重複しないようにしたいと思っていましたが、それはまだ可能ではないようです。いったんC++ Skylark APIが完成すれば、これは簡単に解決するはずですが、今のところこれは良い結果です。ありがとう! –

1

コードを使ってcc_binaryターゲットとして間違った方法でテストを作成し、Bazelをビルドしてリターンコードをチェックするためのシェルスクリプトやその他のツールを記述するだけです。しかし、最もクリーンな方法ではありません。

だから、シェルスクリプトは、Bazelの呼び出しの束をこのようにします。少なくとも、Bazelのコンパイラ呼び出しを理解する必要はありませんが、Bazelの優れた統合テストは失われます。

bazel build //tests:test_that_should_fail_at_compile_time 
if [ $? != 0 ]; then 
    echo "Test Passed!" 
fi 
関連する問題