EN JP CN

kwwrap とkwinject を使用した build specification (ビルドスペック) の生成

kwwrap とkwinject を使用した build specification (ビルドスペック) の生成

kwwrap とkwinject を使用した build specification (ビルドスペック) の生成

kwwrap とkwinject を使用した build specification (ビルドスペック) の生成

ビルドの統合に kwinject を使用することができない場合 ( 分散ビルド を実行する場合など) は、kwwrap は組織のビルドプロセスに統合して build trace (ビルドトレース) を生成することができます。build trace (ビルドトレース) は、build specification (ビルドスペック) を作成する場合、kwinject への入力として使用されます。

makefile の編集

kwwrap ベースのビルド統合の最も単純なシナリオでは、make ビルドを行い、makefile が C コンパイラ、C++ コンパイラ、およびリンカー/ライブラリアンの名前で広く使用される複数のバリエーションを定義しています。

makefile に kwwrap を挿入すると、ビルド内の compile and link コマンドごとに kwwrap が実行され、ビルドの実行中に build trace (ビルドトレース) が生成されます。build trace (ビルドトレース) は、ビルド中に発生したプロセス呼び出しのシーケンスを含むファイルです (例: make コマンド)。

kwwrap が必ず同じファイルに書き込むように、常に追跡ファイルのフルパスを指定する必要があります。さらに、kwwrap 対応のビルドを同じ設定で複数回実行する場合は、ビルドの再実行の前に、以前に生成された build trace (ビルドトレース) を削除してください。これを怠ると、複数のビルドからのコマンドが追跡ファイルに含まれることになります。

注: 分散ビルドの場合は、すべてのビルドマシンで次のプロシージャを実行し、生成された build trace (ビルドトレース) ファイルをマージする必要があります。

kwwrap をビルドと統合するには

  1. makefile を編集し、コンパイラ名およびリンカー名の前に kwwrap コマンドラインを挿入します。たとえば、
    CC = gcc
    CXX = g++
    AR = ar
    

    上記の行は次の行で置換されます。

    CC = kwwrap -o <path_to_kwwrap_trace_file> gcc
    CXX = kwwrap -o <path_to_kwwrap_trace_file> g++
    AR = kwwrap -o <path_to_kwwrap_trace_file> ar

    フィールド<path_to_kwwrap_trace_file> は kwwrap によって生成される build trace (ビルドトレース) ファイルのフルパスです。

  2. ビルドコマンドが (make など) を実行します。

    kwwrap はビルドの実行中の build trace (ビルドトレース) を生成します。このファイルは make ファイルで指定された場所に保存されます。

  3. kwinject を使用して build trace (ビルドトレース) を build specification (ビルドスペック) に変換します。
    kwinject --trace-in <path_to_kwwrap_trace_file> --output <path_to_kwinject_output_file>
    

    たとえば、次のようになります。

    kwinject --trace-in C:/temp/kwwrap.trace --output C:Klocwork/temp/kwinject.out
    

Zlib は GNU make を使用して UNIX 上でビルドする小さなオープンソースプロジェクトです。makefile は、環境変数 CC、AR、および LDSHARED を定義し、静的ライブラリおよび動的ライブラリのコンパイルと生成に使用するツールを定義します。makefile を編集して kwwrap を追加することにより、コンパイラおよびリンカーのラップされたバージョンを使用することができます。
$ cd /path/to/zlib-1.2.2
... configure and generate Makefile
$ ./configure
... now edit the Makefile
-- file: zlib-1.2.2/Makefile
...
CC=kwwrap -o /path/to/kwwrap.trace gcc
LDSHARED=kwwrap -o /path/to/kwwrap.trace gcc
AR=kwwrap -o /path/to/kwwrap.trace ar rc
...
-- cut
... run the build using wrapped compiler/linker; kwwrap.trace will be generated
$ make
... convert the raw build trace to a build specification
$ kwinject -t /path/to/kwwrap.trace -o kwinject.out

コンパイラをコマンドとオプションで置換できない場合

コンパイラを単一のコマンド (つまり -o などのオプションなし) で置換する必要がある場合、Windows では kwwrap の構成ファイルを作成できます。ファイルには kwwrap.conf という名前を付け、それを kwwrap と同じディレクトリに配置する必要があります。

kwwrap 構成ファイルの各行の形式は次のとおりです:<executable_name>=<options_list>

フィールド

  • <executable_name> はコンパイラ実行可能ファイルまたはリンカー実行可能ファイルです。
  • <options_list> は kwwrap オプションのリストです。

注意

  • 等号 (=) の前後にはスペースを挿入しないでください。
  • スペースを含む変数値を指定するには、二重引用符 (") を使用してください。

kwwrap.conf ファイルの例

cl.exe=-o "C:\My traces\mozilla.trace" "C:\Program Files\Microsoft Visual Studio .NET\Vc7\bin\cl.exe"
link.exe=-o "C:\My traces\mozilla.trace" "C:\Program Files\Microsoft Visual Studio .NET\Vc7\bin\link.exe"

makefile ファイルを編集するオプションがない場合

環境変数の使用

元の makefile を変更するオプションがない場合は、環境変数を使用して makefile で設定された値をオーバーライドすることができます。その後で GNU make または MS nmake の --environment-overrides (-e) オプションを使用できます。

make および gcc を使用した UNIX の例

... building on UNIX
$ cd zlib-1.2.2
... build
$ ./configure
...
$ CC="kwwrap -o /path/to/kwwrap.trace gcc"
$ AR="kwwrap -o /path/to/kwwrap.trace ar rc"
$ LDSHARED="kwwrap -o /path/to/kwwrap.trace gcc"
$ export CC AR LDSHARED
... build using wrapped compiler/linker; kwwrap.trace will be generated
$ make -e
... convert build trace to build specification
$ kwinject -t /path/to/kwwrap.trace -o kwinject.out

Windows の例

Windows プラットフォームでは、zlib はマイクロソフトの nmake とcl-compiler を使用してビルドされます。マイクロソフト指定の makefile で使用する少々異なる変数セットは、CC、AR、LD です。

... building on Windows
> cd d:\path\to\zlib-1.2.2
... set up environment variables
> set CC=kwwrap -o d:\path\to\kwwrap.trace cl
> set AR=kwwrap -o d:\path\to\kwwrap.trace lib
> set LD=kwwrap -o d:\path\to\kwwrap.trace link
... build uses wrapped compiler/linker; kwwrap.trace will be generated
> nmake -e -f win32\Makefile.msc
... convert build trace to a build specification
> kwinject -t d:\path\to\kwwrap.trace -o kwinject.out

ラッパースクリプトの作成

xerces は GNU make を使用して UNIX 上でビルドする中型のオープンソース プロジェクトです。xerces は "kwwrap gcc" のようなスペースを含むコンパイラ名を受け入れないカスタムの構成スクリプトを使用するため、makefile 編集の単純なアプローチはフィールドは適用しません。代わりに、ラッパースクリプトを作成します。

$ cd /path/to/xerces-c-src_2_6_0
... create a directory for shell-wrappers
$ mkdir kw-wrappers
... create several simple wrapper scripts and save them into the kw-wrappers directory:
-- file: kw-wrappers/kwwrap-gcc
#!/bin/sh
exec kwwrap -o /path/to/kwwrap.trace gcc "$@"
-- file: kw-wrappers/kwwrap-g++
#!/bin/sh
exec kwwrap -o /path/to/kwwrap.trace g++ "$@"
-- file: kw-wrappers/kwwrap-ar
#!/bin/sh
exec kwwrap -o /path/to/kwwrap.trace ar "$@"
-- cut
... don’t forget to set the execute permissions on the created scripts
$ chmod +x kw-wrappers/*
... set up PATH and other environment variables
$ PATH=$PWD/kw-wrappers:$PATH
$ CC=kwwrap-gcc
$ CXX=kwwrap-g++
$ AR=kwwrap-ar
$ export CC CXX AR
... configure xerces
$ XERCESCROOT=$PWD
$ cd $XERCESCROOT/src/xercesc
$ ./runConfigure -p linux -c $CC -x $CXX
... build using the wrapper scripts; build trace will be generated
$ make
... generate a build specification from the build trace
$ kwinject -t /path/to/kwwrap/trace -o kwinject.out

kwwrap を CMake と一緒に使用する

ビルドプロセスを管理するために CMake を使用する場合は、CMakeLists.txt ファイルを修正し、ビルド仕様ファイルを生成するための kwinject への入力として使用できるビルドトレースファイルを生成することができます。この方法は、システム整合性保護 (SIP) が Mac OS X 10.10 以降で 有効にされている場合に使用できます。

set(KWWRAP_PATH "<path to Klocwork install directory>/bin/kwwrap")   # Specify kwwrap full path
set(KWWRAP_TRACE_PATH "${PROJECT_BINARY_DIR}/kw.trace")              # Specify path to Klocwork trace file
set(KWWRAP_TARGET "${KWWRAP_PATH} -o ${KWWRAP_TRACE_PATH}")
 
set(CMAKE_C_COMPILE_OBJECT "${KWWRAP_TARGET} ${CMAKE_C_COMPILE_OBJECT}")
set(CMAKE_C_LINK_EXECUTABLE "${KWWRAP_TARGET} ${CMAKE_C_LINK_EXECUTABLE}")
set(CMAKE_C_CREATE_SHARED_LIBRARY "${KWWRAP_TARGET} ${CMAKE_C_CREATE_SHARED_LIBRARY}")
set(CMAKE_C_CREATE_SHARED_MODULE "${KWWRAP_TARGET} ${CMAKE_C_CREATE_SHARED_MODULE}")
set(CMAKE_C_CREATE_STATIC_LIBRARY "${KWWRAP_TARGET} ${CMAKE_C_CREATE_STATIC_LIBRARY}")
 
set(CMAKE_CXX_COMPILE_OBJECT "${KWWRAP_TARGET} ${CMAKE_CXX_COMPILE_OBJECT}")
set(CMAKE_CXX_LINK_EXECUTABLE "${KWWRAP_TARGET} ${CMAKE_CXX_LINK_EXECUTABLE}")
set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${KWWRAP_TARGET} ${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
set(CMAKE_CXX_CREATE_SHARED_MODULE "${KWWRAP_TARGET} ${CMAKE_CXX_CREATE_SHARED_MODULE}")
set(CMAKE_CXX_CREATE_STATIC_LIBRARY "${KWWRAP_TARGET} ${CMAKE_CXX_CREATE_STATIC_LIBRARY}")

テストとして "pretend" ビルドを実行できます

kwwrap の --pretend オプションは、コンパイラおよびリンカーが実行されることのないビルドである「仮ビルド」の実行に使用できます。このオプションでは kwwrap は指定されたコマンドラインを build trace (ビルドトレース) に書き込みますが、コマンドは実行しません。

"仮" ビルドは、通常、実際のビルドよりも所要時間が少なく、生成された build trace (ビルドトレース) も正確ではありません。したがって、このアプローチは単純なプロジェクト、および正確な build specification (ビルドスペック) が重要ではないプロジェクトに適しています。

注: コンパイラとリンカーが実行されないことにより、ビルドが破壊される可能性があるため、ビルドコマンドがエラーを無視するように設定すること (make の -i オプションなどを使用するなど) をお勧めします。

zlib の使用例を次に示します。この例では、環境変数の使用で説明されているように、環境変数を使用して makefile 設定をオーバーライドします。

$ cd zlib-1.2.2
... build
$ ./configure
... set up environment variables
$ CC="kwwrap -p -o /path/to/kwwrap.trace gcc"
$ AR="kwwrap -p -o /path/to/kwwrap.trace ar rc"
$ LDSHARED="kwwrap -p -o /path/to/kwwrap.trace gcc"
$ export CC AR LDSHARED
... "pretend" build using wrappers; compiler/linker are not executed
$ make -e -i
... convert the build trace to a build specification
$ kwinject -t /path/to/kwwrap.trace -o kwinject.out

次は何?

前提条件

Klocwork Extensibility インターフェイスは Klocwork コマンドライン機能の一部として Klocwork Product Portal からインストールされます。

Mac ユーザー:カスタムチェッカーを作成するには GCC コンパイラのワーキングバージョンが必要です。