kwinject または kwwrap を CMake と一緒に使用する

CMake を使用してビルドプロセスを管理する場合、最も一般的で、かつ推奨されるアプローチは、ビルドパイプラインを生成し、kwinject の実行中にビルドを実行することです。

次の例は、kwinject を CMake と一緒に使用する方法を示しています。

  1. ビルドパイプラインの生成:

    mkdir build
    cd build
    cmake -G 'Unix Makefiles' ../my_proj/
  2. kwinject でビルドツールを実行:

    kwinject -o my_proj.out make

何かが kwinject の動作を妨げている場合 (セキュリティソフトウェアや分散したビルドを実行している場合など)、次の方法で kwwrap を CMake と一緒に使用できます。ただし、これらの方法を使用するのは、本来の kwinject 戦略がうまくいかない場合のみにしてください。

CMAKE_<LANG>_COMPILER_LAUNCHER 変数と CMAKE_<LANG>_LINKER_LAUNCHER 変数と一緒に kwwrap を使用する

CMAKE_<LANG>_COMPILER_LAUNCHER 変数と CMAKE_<LANG>_LINKER_LAUNCHER 変数を使用することで、ビルドスクリプトを変更せずに kwwrap を有効にすることができます。次の前提条件が適用されます。

  • CMake バージョン 3.21 以降を使用している

  • ビルドツールは make または ninja のいずれかである

CMAKE_<LANG>_COMPILER_LAUNCHER 変数と CMAKE_<LANG>_LINKER_LAUNCHER 変数と一緒に kwwrap を使用するには:

  1. kwwrap を実行するためのスクリプトを作成します。次の例では、Linux で bash を使用しています。

    #!/bin/bash
    set -e
    "$KWW" -o "$KWO" "$@"
    exit $?

    kwwrap と出力ファイル名は、両方とも環境変数によって渡されます。これは厳密には必要ありませんが、変更がより簡単になります。

  2. 関連する環境変数を設定するための別のスクリプトを実行してから、いつものように CMake を実行します。

    CMake はビルド時にディレクトリを変更するため、出力ファイルと runner.sh へのパスは、両方とも絶対パスでなければならないことに注意してください。

    #!/bin/bash
    set -e
    export KWW=/path/to/kw/bin/kwwrap
    export KWO=/absolute/path/to/tracefile.out
    
    wrapcmd="/absolute/path/to/runner.sh"
    
    export CMAKE_C_COMPILER_LAUNCHER=$wrapcmd
    export CMAKE_CXX_COMPILER_LAUNCHER=$wrapcmd
    export CMAKE_C_LINKER_LAUNCHER=$wrapcmd
    export CMAKE_CXX_LINKER_LAUNCHER=$wrapcmd
    
    cmake -G 'Unix Makefiles' path/to/my/sources/       # Insert your normal build command here
    rm "$KWO"   # cmake itself creates a junk trace file
    
    make

    スクリプトを実行した後には、$KWO にトレースファイルがあります。これを kwinject にフィードすることで、build specification (ビルドスペック) ファイルを生成できます。

CMakeLists.txt を変更することで kwwrap を使用する

別のアプローチは、CMakeLists.txt ファイルを変更して、kwinject にフィードするためのビルドトレースファイルを生成することです。ただし、これがどのように動作するのか、また動作するのかどうかは、CMakeFile.txt と関連ファイルの予測不能性に依存しています。

グローバル変数を変更しているため、この方法ではビルドプロセスで問題が発生する可能性があります。ビルドスクリプトでは、できるだけ遅く変数を定義することをお勧めします。

次の例は、CMakeLists.txt を変更することで kwwrap を使用する方法を示しています。特定の使用事例に合わせて、微調整が必要になる場合があります。

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}")