Kwbazel

kwbazel ビルド統合コマンドを使用すると、ユーザーは Bazel ビルドシステムでビルドされたプロジェクトを分析することができます。kwbazel は、Bazel ビルドを実行し、トレースおよびビルド仕様ファイル (kwinject.trace および kwinject.out) を生成する実行可能シェルスクリプトです。

Kwbazel では、トレースファイルおよびビルドスペックファイルの生成に関して、2 通りの方法をサポートしています。デフォルトの aquery ベースの方法と、--aspect_build で有効化される実験的な aspect ベースの方法です。

実験的な aspect ベースのビルド方法を使用する場合、kwbazel はデフォルトで増分解析を実行してビルド時間を短縮します。出力ファイルを再生成したい場合は、-w (または --overwrite) を使用して既存の出力ファイルを上書きしてください。

前提条件

  • kwbazel を使用するには、Bazel と Klocwork コマンドラインツールをインストールします。

  • bazel build <target> を実行して、Bazel を使用したソースのコンパイルが正常に動作することを確認します。

  • Bazel ワークスペースディレクトリ (ROOT ワークスペースファイルが存在するディレクトリ) から kwbazel を実行します。

  • 実験的な --aspect_build オプションを使用するには、WORKSPACE ファイルに p4sa_bazel_tools のローカル Bazel リポジトリ宣言を追加し、Bazel が Klocwork の aspect ファイルにアクセスできるようにします。

    local_repository(
        name = "p4sa_bazel_tools",
        path = "<Klocwork_install>/config/kwbazel",
    )
  • rules_foreign_cc を通じて make、CMake、または gmake にコンパイルを委譲する Bazel プロジェクトの場合は、Bazel 7.1 以降を使用します。

制限事項

  • Kwbazel は Linux および Windows オペレーティングシステムとのみ互換性があります。

  • kwbazel は、Linux と Windows の両方でデフォルトのニーモニックを使用した C/C++ および Java コードのビルドをサポートし、Linux では C# コードのビルドをサポートします。他のプログラミング言語はサポートしていません。

  • Kwbazel はリモート実行をサポートせず、ローカルビルドのみを容易にします。

  • 実験的な --aspect_build オプションは現在、C/C++ の aspect ベースのビルドスペック生成のみをサポートしています。他の言語を含めた場合、kwbazel はその言語を aspect ベースの処理の対象外とします。

  • rules_foreign_cc を通じて make、CMake、または gmake にコンパイルを委譲する Bazel プロジェクトのビルドスペック生成には、--aspect_build オプションと Bazel 7.1 以降が必要です。デフォルトの aquery ベースの方法では、これらのプロジェクトはサポートされていません。

  • カスタムニーモニックは、Kwbazel の明示的オプションによってサポートされます。

  • Kwbazel は、Bazel によって呼び出される make や CMake などの他のビルドシステムを監視しません。このようなシナリオでは、ビルド統合に Kwinject の使用を検討してください。

  • kwbazel は Android Bazel ビルド (Kleaf) では使用できません。Android Bazel ビルドの場合は、代わりに --bazel オプションを指定して kwandroid を使用します。

  • Windows では、サポートされているネイティブ環境から Bazel を使用してください。Bazel のワークフローでは、Git Bash、MSYS、Cygwin、およびこれらに類似した Bash の派生版を使用しないでください。

使用方法

kwbazel --bazel_version <version> --target <bazel_target> --klocwork_path <path_directory> [--arguments <bazel_arguments>] [--lang <language>] [--skip_build] [--aspect_build [<aspect_targets>] [--output_groups <groups>]]
この場合、
  • <version> は、Bazel のバージョンを指定します。文字列 bazel も許可されます
  • <bazel_target> はビルドターゲットを指定します
  • <path_directory> は Klocwork 出力ディレクトリを指定します
  • オプション: <bazel_arguments> はビルドの実行に使用される引数を指定します
  • オプション: <language> は C/C++、C#、Java のビルドを分離する言語オプションを指定します
  • オプション: <aspect_targets> は、デフォルトの Klocwork aspect と共に実行する、追加の Bazel aspect ターゲットを 1 つまたは複数指定します
  • オプション: <groups> は、実行するカスタム aspect の出力グループを指定します
  • オプション: --skip_build は、暗黙的な bazel build ステップをスキップします

オプション

名前 (および短い名前) 説明
--bazel_version (-b) <version> Bazel のバージョンを指定します。単一の Bazel バージョンがインストールされている場合は、文字列 bazel を使用します。複数のバージョンがインストールされている場合は、バージョンを指定します。例: --bazel_version bazel-6.4.0

Bazel のバージョンは /usr/bin または /usr/local/bin で確認できます。

--klocwork_path (-o) <path_directory> Klocwork 出力ディレクトリを指定します。kwinject.trace と kwinject.out はこのディレクトリ内に作成されます
--target (-t) <bazel_target>

ビルドターゲットを指定します。例: -t //:hello_bazel

複数のターゲットの場合は、-t "//:hello_bazel hello_klocwork" を実行します

オプションの引数

名前 (および短い名前) 説明
--arguments (-a) <bazel_argument> Bazel 引数を指定します。例: --arguments "--spawn_strategy=linux-sandbox --sandbox_debug"
--custom_mnemonics <string> ユーザーが作成したカスタムニーモニックの使用を指定します。例: --custom_mnemonics mnemonic1 mnemonic2 mnemonic3
--overwrite (-w) aspect ベースのモードで kwbazel を再実行する際に、既存の出力ファイルを上書きします。前回の結果を保持せずに、Klocwork のトレースとビルドスペックを再生成したい場合に役立ちます。
--lang (-l) <language> C/C++ (cxx)、C# (csharp)、Java (java) のビルドを分離するための言語オプションを指定します。デフォルトは cxx,csharp,java です
--aspect_build [<aspect_targets>] 実験的な aspect ベースのビルドスペック生成を有効にし、その実行におけるデフォルトの aquery ベースの生成を無効にします。追加の aspect ターゲットが指定されていない場合、kwbazel はデフォルトの Klocwork aspect を実行します。追加の aspect ターゲットが指定されている場合、kwbazel はデフォルトの Klocwork aspect に加え、指定したカスタム aspect も実行します。rules_foreign_cc を通じて make、CMake、または gmake にコンパイルを委譲する Bazel プロジェクトでも、--aspect_build を使用してください (Bazel 7.1 以降が必要です)。
--output_groups <groups> --aspect_build で実行するカスタム aspect の出力グループを指定します。出力グループ名をカンマ区切りで指定してください。追加の aspect ターゲットを --aspect_build に渡す場合にのみ使用してください。
--skip_build 暗黙的な bazel build ステップをスキップします。既存のビルドジョブの後続のジョブとして kwbazel が実行される CI/CD パイプラインなど、Bazel ビルドが kwbazel の実行前に完了している場合に使用してください。
--remote_executor <url> リモートエグゼキューターのアドレスを指定します。Bazel ビルドアクションをリモートエグゼキューターにディスパッチするのに使用してください。例: grpc://remote-executor.example.com:8980
--remote_cache <url> リモートキャッシュの URL を指定します。リモートビルドキャッシュへの読み書きに使用してください。例: grpcs://remote-cache.example.com:443
--debug 実行されたすべてのコマンドを端末に直接出力します。トラブルシューティングやビルドプロセスの理解に役立ちます。kwinject_generator.py コンポーネントにも適用されます。
--show_progress ビルドスペックの生成中に進行状況を表示し、実行に時間を要する操作の可視性を高めます。

--aspect_build を有効にすると、kwbazel は既存のビルドスペック生成ワークフローを維持しつつ、その実行に限り、aquery ステップを aspect ベースのステップに置き換えます。

--remote_executor および --remote_cache を使用する場合、kwbazel は分析フェーズからビルドスペックデータを抽出します。この分析フェーズは、コンパイルがリモートで実行される場合でも、ローカルで実行されます。

例:

kwbazel -b bazel -o klocwork -t //... --aspect_build
kwbazel -b bazel -o klocwork -t //... --aspect_build //:my_aspect.bzl%my_aspect --output_groups my_aspect_output
kwbazel -b bazel -o klocwork -t //... --aspect_build //:my_aspect.bzl%my_aspect,//:my_other_aspect.bzl%my_other_aspect --output_groups my_aspect_output,my_other_aspect_output
kwbazel -b bazel -o klocwork -t //... --skip_build

オプションの kwinject 引数

名前 (および短い名前) 説明
--config (-c) <file> <file> からフィルター設定を読み取ります。デフォルトは <Klocwork_install>/config/kwfilter.conf です。kwfilter.conf およびコンパイラ設定ファイルの「プライベート」コピーを使用できるので、元のファイルを変更する必要はありません。
-f <variable_file> 特定のファイルから変数を読み取ります。
--ignore-files (-I)<pattern>[,<pattern>...] 指定されたパターンのいずれかに一致するソースファイルが無視されます。<pattern> には、* と ? のワイルドカードを含めることができます。たとえば、以下のようにします。--ignore-files conftest.* は、configure スクリプトによって作成された一時ファイルが無視されるように指定します。
--no-config コンパイラマッピングファイル kwfilter.conf からフィルター設定を読み取らない
--no-resolve シンボリックリンクを解決しません。--no-resolve オプションが指定されている場合は、コンパイラオプションのパスを解決しません。
--prog (-P) <prog>[=<filter>][,<prog>[=<filter>]...]

コンパイラがデフォルトで検索したもの以外を使用する場合に、kwinject がプログラムをインターセプトするために使用するプログラム。

使用する適切なフィルターと共に、インターセプトするプログラムのカンマ区切りリストを指定します。既知のプログラムとそのフィルターのデフォルトのリストがコンパイラマッピングファイル kwfilter.conf から取得されます。このオプションによって定義されたフィルターバインディングは、コンパイラフィルターファイルから読み取られたバインディングに優先します。

--variable (-V) <variable>=<string> 出力ファイルで見つかったすべての <string> を、<variable> の参照と置き換えます。