コンパイル・データベースの生成#

コンパイル・データベースは、コマンドオプションの配列を含む JSON ファイルであり、各オブジェクトは通常、次の 3 つで構成されます。

  • directory: コンパイルの作業ディレクトリー。コマンドまたはファイルフィールドで指定されるすべてのパスは、このディレクトリーに対して絶対パスまたは相対パスである必要があります。

  • command: コンパイルコマンド。

  • file: コンパイルステップで処理される翻訳単位のメインのソースファイル。

コンパイル・データベースには、それぞれの翻訳単位のメイン・ソース・ファイルの詳細なビルドオプションが含まれており、コード・プロジェクトの移行をガイドするためインテル® DPC++ 互換性ツールで使用されます。

例:

1[ 
2 { 
3    "directory": "/path/to/project", 
4    "command": "/usr/bin/clang++ ...-Iinclude_path -D_FOO_=VALUE -c ./foo/foo.cpp", 
5    "file": "./foo/foo.cpp" 
6 }, 
7 ...
8 { 
9    "directory": "/path/to/project", 
10    "command": "/usr/bin/clang++ ...-Iinclude_path -D_BAR_=VALUE -c ./foo/bar.cpp", 
11    "file": "./foo/bar.cpp" 
12 } 
13]

インテル® DPC++ 互換性ツールによって提供される intercept-build スクリプトを実行することで生成できます。intercept-build は、次の拡張子のファイルのコンパイル・コマンドラインのキャプチャーをサポートします: .c.C.cc.CC.cp.cpp.cxx.c++.C++.txx、および .cu

Makefile ベースのプロジェクトのコンパイル・データベースを生成#

Makefile ベースのプロジェクトのソースコードは、プロジェクト Makefile で指定されたビルドコマンドを実行することでコンパイルし、実行可能なバイナリーまたはライブラリーにリンクできます。

Makefile ベースのプロジェクトでは、intercept-build make を実行してコンパイル・データベースを生成できます。

コンパイル・データベースの生成を表示するには、folder-options-dpct サンプルを使用します。

  1. folder-options-dpct サンプル・ディレクトリーに移動します。

  2. intercept-build ツールを実行して、コンパイル・データベースを生成します。

    intercept-build make

    コンパイル・データベース compile_commands.json は、サンプル・ディレクトリーに生成されます。

CMake ベースのプロジェクトのコンパイル・データベースを生成#

CMake は、CMakeLists.txt ファイルを使用して、プロジェクトの構成、ソースファイル、および依存関係を記述します。Cmake を使用する場合、CMakeLists.txt ファイルが依存するすべてのソフトウェアがインストールされていることを確認し、機能する Makefile を CMake で生成できるようにします。

Cmake ベースのプロジェクト向けのコンパイル・データベースを生成するには、2 つの方法があります。

  1. intercept-build を使用する

  2. CMake オプション CMAKE_EXPORT_COMPILE_COMMANDS を使用します

オプション 1: インターセプト・ビルドによりコンパイル・データベースを生成#

以下のステップは、intercept-build を使用してコンパイル・データベースを生成する方法を示しています。

  1. プロジェクトに必要な依存関係のあるソフトウェアをインストールします。

  2. コマンドウィンドウを開いて、プロジェクトのフォルダーに移動します。

  3. プロジェクト・フォルダーで新しいビルド・ディレクトリーを作成し、そこに移動します。

    mkdir build && cd build
  4. Makefile を生成するため CMake を実行します。

    cmake ../
  5. コンパイル・データベースを生成するには intercept-build を実行します。

    intercept-build make

オプション 2: CMake オプションを使用してコンパイル・データベースを生成#

CMake 3.5 バージョン以降では、CMake オプション CMAKE_EXPORT_COMPILE_COMMANDS を使用してコンパイル・データベースを生成できます。例えば、次のコマンドでは、ビルド・ディレクトリーにコンパイル・データベース compile_commands.json を生成します。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ../

CUDA* ソースコードのサポートが強化されているため、CMake 3.10 移行を使用することを推奨します。

Setuptools ベースのプロジェクトのコンパイル・データベースを生成#

Setuptools は、Python プロジェクトのパッケージ化、配布、インストールを容易にする Python パッケージ開発ライブラリーです。ビルドシステムとして setuptools を使用するプロジェクトでコンパイル・データベースを生成する手順は次のとおりです。

  1. Python ビルドコマンドで -v または --verbose フラグを使用して、setuptools プロジェクトのビルドログを生成します。

    python3 setup.py <build-option> -v > build.log 2>&1
  2. コンパイル・データベースを生成するには、intercept-build –-parse-build-log オプションを使用します。

    intercept-build -–parse-build-log build.log

他のビルドシステムを使用してコンパイル・データベースを生成#

プロジェクトが他のビルドシステムを使用する場合、intercept-build でプロジェクトのビルドログからコンパイル・データベースを生成できます。

プロジェクトのビルドログからコンパイル・データベースを生成する場合、詳細なビルドログを生成するための適切なオプションを使用してプロジェクトをビルドしてください。

例:

ビルドシステム

詳細なビルドログを生成するオプション

Make

VERBOSE=1

CMake/Ninja

-DCMAKE_VERBOSE_MAKEFILE=ON

Bazel

--subcommands

folder-options-dpct サンプルを使用すると、ビルドログに基づいたコンパイル・データベースを表示できます。

  1. folder-options-dpct サンプル・ディレクトリーに移動します。

  2. 詳細なビルドログを取得するオプションを指定して make を実行します。

    make VERBOSE=1 -B > ./build_log.txt
    
       The content of ``build_log.txt`` should look like the following:
    
       .. code-block:: none 
     :linenos: 
    
     nvcc -c -I./foo -I./foo/bar foo/main.cu -o foo/main.o 
     nvcc -c -I./foo -I./foo/bar foo/bar/util.cu -o foo/bar/util.o 
     nvcc ./foo/main.o ./foo/bar/util.o -o foo-bar
  3. intercept-build を使用して、--parse-build-log オプションでコンパイル・データベースを生成し、ビルドログを指定します。

    intercept-build --parse-build-log=build_log.txt --work-directory=./

    コンパイル・データベース compile_commands.json は、現在のディレクトリーに生成されます。

intercept-build の詳細については、intercept-build --help を実行してください。