C.2. cmake

注記

cmakeのインストールはソース版をコンパイルするか、バイナリ版をダウンロードできます。まだインストールしていない方は、cmakeのオフィシャルHPにいって「Download」リンクをクリックし、バイナリ版をダウンロードしてインストールをしてください。

cmakeはC/C++プロジェクトのビルドジェネレーターです。主な使用方法としては、

等があります。本書ではcmakeの用途は、Makefileの生成に限定させて頂きます。

cmakeでは「CMakeLists.txt」というテキストファイルを編集します。例えばOpenCLプロジェクト「sample」のMakefileをcmakeで生成するには、以下のように記述します。

basic_helloworld.cxx. 

#include <iostream>
using namespace std;

int main() {
        cout << "Hello World!!!" << endl; // prints Hello World!!!
        return 0;
}

basic_helloworld.cl. 

__kernel void hello(__global int* abc) {
    // empty kernel
}

CMakeLists.txt. 

cmake_minimum_required (VERSION 3.1)
project(mult)
find_package(OpenCL REQUIRED) //(1)
include_directories(${OpenCL_INCLUDE_DIRS}) //(2)
link_directories(${OpenCL_LIBRARIES}) //(3)
add_executable (helloworld basic_helloworld.cxx) //(4)
target_include_directories (helloworld PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) //(5)
target_link_libraries (helloworld ${OpenCL_LIBRARIES}) //(6)
configure_file(basic_helloworld.cl ${CMAKE_CURRENT_BINARY_DIR}/basic_helloworld.cl COPYONLY) //(7)

(1)

OpenCLパッケージを検索します。

(2)

FindOpenCL.cmakeの変数「OpenCL_INCLUDE_DIRS」をインクルードするディレクトリとして指定。

(3)

FindOpenCL.cmakeの変数「OpenCL_LIBRARIES」をリンクするライブラリとして指定。

(4)

ターゲット「hellowolrd」と依存ファイル「basic_helloworld.cxx」をターゲットのルールとして追加。

(5)

ターゲットのインクルードディレクトリとして「CMAKE_CURRENT_SOURCE_DIR」を指定。

(6)

ターゲット「helloworld」とOpenCLライブラリをリンク。

(7)

カーネルソースファイル「basic_helloworld.cl」をビルドディレクトリにコピー。

「cmake 3.1」以降には、「FindOpenCL.cmake」というモジュールが追加されています。パッケージが見つかると以下の変数が設定されます。

次に本書では、ビルドディレクトリをbuildディレクトリに統一しています。ソースファイルのあるディレクトリ上で以下のコマンドを叩いてください。

$ mkdir build
$ cd build

この時点でコマンドプロンプトのワーキングディレクトリは、空のディレクトリであるbuildとなりました。この状態で「cmake ..」と入力頂くと、cmakeがMakefileの生成を行います。

$ cmake ..
-- Looking for CL_VERSION_2_0
-- Looking for CL_VERSION_2_0 - not found
-- Looking for CL_VERSION_1_2
-- Looking for CL_VERSION_1_2 - not found
-- Looking for CL_VERSION_1_1
-- Looking for CL_VERSION_1_1 - not found
-- Looking for CL_VERSION_1_0
-- Looking for CL_VERSION_1_0 - not found
-- Found OpenCL: /System/Library/Frameworks/OpenCL.framework
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/komatsu/Documents/opencl-workspace/OpenCLBook/mult/build

これによりMakefile等のビルドファイルがbuildディレクトリに生成されます。

$ ls
CMakeCache.txt                  basic_helloworld_cmake.cxx
CMakeFiles                      cmake_install.cmake
CMakeLists.txt                  helloworld.cl
Makefile

最後にmakeコマンドを使いビルドを実行します。

$ make
Scanning dependencies of target helloworld
[100%] Building CXX object CMakeFiles/helloworld.dir/basic_helloworld_cmake.cpp.o
Linking CXX executable helloworld
[100%] Built target helloworld

これでビルドは完了です。プログラムの実行は以下のようにします。

$ ./helloworld
Hello World!!!

もちろん読者もお気づきの通り、OpenCLとは関係のないプログラムです。しかしcmakeの設定は、OpenCLライブラリをプログラムにリンクしているため、OpenCLプログラムのソースファイルをビルドすることも可能です。

Copyright 2018-2019, by Masaki Komatsu