kwinject 対応ビルドでのローカルビルドプロセスの失敗
場合によっては、kwinject のプロセスのインターセプト/モニター機能がプロセス自体に干渉することがあります。
キーワードのアタッチとデタッチを使用して、ビルドのモニター中に kwinject がインターセプトしないコマンドのリストを指定できます。kwinject は、開始直後に指定されたプロセスからデタッチします。
Restriction: Linux では、kwinject を実行するときに最上位プロセスは無視されます。子プロセスで kwinject をデタッチできます。
kwinject がデタッチする一連のコマンドを定義するには、コンパイラのマッピングファイルを編集します。このコンパイラマッピングファイルは、<klocwork_install>/config/kwfilter.conf にあります。
デタッチするコマンドのリストが短い場合、detach 行を 1 行 kwfilter.conf に追加します。
コマンドのリストが長くなる場合、detach キーワードを使用してパターンを指定します ("このディレクトリ内のすべてのプログラムからデタッチする" または "特定の接頭辞が付いたすべてのプログラムからデタッチする" など)。attach キーワードを使用すると、デタッチ規則の例外を追加できます ("コンパイラとリンカー以外のすべてのプログラムからデタッチする" など)。
attach 行とdetach 行は、適用されるコンパイラのフィルターバインディング行より下に追加され、次の構文を使用している必要があります。
detach <prog_name>[, <prog_name> ...]
フィールド<prog_name> には、kwinject がインターセプトしない 1 つまたは複数の実行ファイル名が入ります。
attach <prog_name>[, <prog_name> ...]
フィールド<prog_name> には、detach キーワードを使用して指定した規則の 1 つまたは複数の例外が入ります。
<prog_name> には、次の形式のいずれかを使用してください。
- コマンドの短い名前 (cl.exe など)
- コマンドへの絶対パス
- 部分パス (sdk\bin\cl.exe など)
<prog_name> は、glob に類似したパターンを使用するため、以下を含むことができます。
- * ワイルドカード (あらゆる並び順の文字) - 例: sdk\bin\*.exe
- ?ワイルドカード (任意の文字)
例 1: デタッチキーワードの使用 (Windows)
filter mscompile cl ... detach bad1.exe, bad2.exe
例 2: アタッチとデタッチの両方のキーワードの使用 (Windows)
filter mscompile cl ... attach build.exe, nmake.exe detach public\common\bin\*.exe, sdk\bin\*.exe detach msbuild.exe
例 3: 子プロセスを使用した kwinject のデタッチ (Linux)
「子」と呼ばれるプロセスをデタッチするには、次のステップを考慮します。
-
「子」と呼ばれる子プロセスを、次の内容で作成します。
#!/bin/sh gcc test.c
-
kwfilter.conf に次の行を追加します。
detach child
Tip: 子プロセスにはコンパイルが含まれているため、kwinject でそれを直接呼び出すことで、ビルドスペックを引き続き作成できます。この例では、デタッチは適用されません。
kwinject ./child
-
子プロセスを呼び出す内容で、「親」と呼ばれる親プロセスを作成します。
#!/bin/sh ./child
-
子プロセスをデタッチするには、kwinject で親プロセスを呼び出す必要があります。これにより、子プロセスにデタッチが適用されるため、コンパイルは追跡されず、ビルドスペックは空になります。
kwinject ./parent