Linuxコマンド - CMake

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

CMakeとは、多様なプラットフォームでソースコードをビルドするためのツールである。

ここでは、CMake向けに構築されたソースコードをコマンドラインからビルドする方法について記載する。


CMakeのインストール

CMakeの公式Webサイトにアクセスして、
cmake-<バージョン>.tar.gzファイル(ソースコード)またはcmake-<バージョン>-linux-x86_64.tar.gzファイル(バイナリ)をダウンロードする。

バイナリファイルをインストールする場合

cmake-<バージョン>-linux-x86_64.tar.gzファイル(バイナリ)をを解凍して、任意のインストールディレクトリに配置する。

tar xf cmake-<バージョン>-linux-x86_64.tar.gz
mkdir <CMakeのインストールディレクトリ>
cp -r cmake-<バージョン>-linux-x86_64/* <CMakeのインストールディレクトリ>


CMake GUIもインストールする場合、デスクトップエントリファイルを作成する。

vi ~/.local/share/applications/CMake_GUI.desktop


# ~/.local/share/applications/CMake_GUI.desktopファイル

[Desktop Entry]
Type=Application
Version=1.0
Name=CMake
Comment=Cross-platform buildsystem
Exec=/<CMakeのインストールディレクトリ>/bin/cmake-gui %f
Icon=/<CMakeのインストールディレクトリ>/share/icons/hicolor/128x128/apps/CMakeSetup
Categories=Development;
MimeType=application/x-cmakecache;
Terminal=false
X-MultipleArgs=false
StartupNotify=true


~/.profileファイル等に環境変数PATHを追記する。

vi ~/.profile


# ~/.profileファイル

export PATH="/<CMakeのインストールディレクトリ>/bin:$PATH"


ソースコードからインストールする場合

CMake GUIをインストールする場合、ビルドに必要なライブラリをインストールする。

sudo zypper install libcurl-devel libbz2-devel xz-devel libexpat-devel zlib-devel libarchive-devel libuv-devel \
                    libzstd-devel jsoncpp-devel rhash-devel libnghttp2-devel python3-Sphinx \
                    libQt5Core-devel libQt5Gui-devel libQt5Widgets-devel


cmake-<バージョン>.tar.gzファイル(ソースコード)を解凍する。

tar xf cmake-<バージョン>.tar.gz
cd cmake-<バージョン>


ビルド用ディレクトリを作成する。

mkdir build && cd build


CMakeをビルドおよびインストールする。

# CMake GUIをインストールする場合
../configure --qt-gui --prefix=<CMakeのインストールディレクトリ>
または
../bootstrap --qt-gui --prefix=<CMakeのインストールディレクトリ> --sphinx-html --sphinx-man --parallel=$(nproc)

# CMake GUIをインストールしない場合
../configure --prefix=<CMakeのインストールディレクトリ>
または
../bootstrap --prefix=<CMakeのインストールディレクトリ> --sphinx-html --sphinx-man --parallel=$(nproc)

gmake -j $(nproc)
gmake install


CMake GUIもインストールする場合、デスクトップエントリファイルを作成する。

vi ~/.local/share/applications/CMake_GUI.desktop


# ~/.local/share/applications/CMake_GUI.desktopファイル

[Desktop Entry]
Type=Application
Version=1.0
Name=CMake
Comment=Cross-platform buildsystem
Exec=/<CMakeのインストールディレクトリ>/bin/cmake-gui %f
Icon=/<CMakeのインストールディレクトリ>/share/icons/hicolor/128x128/apps/CMakeSetup
Categories=Development;
MimeType=application/x-cmakecache;
Terminal=false
X-MultipleArgs=false
StartupNotify=true


~/.profileファイル等に環境変数PATHを追記する。

vi ~/.profile


# ~/.profileファイル

export PATH="/<CMakeのインストールディレクトリ>/bin:$PATH"



Extra CMake Module(ECM)のインストール

Extra CMake ModuleのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf extra-cmake-modules-<バージョン>.tar.gz
cd extra-cmake-modules-<バージョン>


次に、Extra CMake Moduleのビルドに必要なライブラリをインストールする。

sudo zypper install reuse sphinx libsphinxclient-devel python3-Sphinx python3-qt5-devel \
                    libQt5Core-devel libqt5-qttools libQt5QuickControls2-devel libqt5-linguist-devel


ビルド用ディレクトリを作成して、Extra CMake Moduleをビルドおよびインストールする。
Extra CMake ModuleのインストールディレクトリはCMakeのインストールディレクトリを共通であることに注意する。

mkdir build && cd build

cmake -DCMAKE_INSTALL_PREFIX=<CMakeのインストールディレクトリ> -DCMAKE_BUILD_TYPE=Release -DBUILD_QTHELP_DOCS=ON ..
make -j $(nproc)
make install



ソース外ビルド

ソースコードディレクトリとビルドディレクトリが異なることをソース外ビルドと呼ぶ。
これは、ソースコードとビルドの出力を分離することにより、開発者が同じソースコードディレクトリに複数のビルドディレクトリを作成できるという利点もあり、
デバッグバージョンとリリースバージョン等の異なるオプションでビルドをセットアップすることができる。

ビルドディレクトリをソースツリーの外側に配置することを推奨する。


CMakeコマンドの基本

まず、ビルドするディレクトリを作成して、そのディレクトリに移動する。
ディレクトリを作成する理由は、ソースコードツリーがビルド時の生成ファイルで汚染されるのを防ぐためである。

mkdir build
cd build


以下のように、CMakeコマンドを実行する。
引数には、ソースコードのルートディレクトリ(CMakeLists.txtファイルがあるディレクトリ)を指定する。

cmake -G <プロジェクトジェネレータ  例. "Unix Makefiles"やNinja等> <CMakeLists.txtファイルがあるディレクトリ>
cmake --build <ビルドディレクトリ> --config <Debug または Release> --target <ターゲット名>


Makefileが作成されるので、それを使用してビルドを行う。

make -j $(nproc)
make install  # ただし、CMakeLists.txtファイルに設定が記述されていることが必要



オプションの指定

CMakeコマンドの実行時に、オプションを指定することが可能である。

インストールディレクトリを指定するには、以下のオプションを付加する。

cmake -DCMAKE_INSTALL_PREFIX=<インストールディレクトリ> <ソースコードがあるディレクトリ>
または
cmake --install <インストールディレクトリ> <ソースコードがあるディレクトリ>


CコンパイラまたはC++コンパイラを変更するには、以下のオプションを付加する。

-DCMAKE_C_COMPILER=<Cコンパイラのパス> -DCMAKE_CXX_COMPILER=<C++コンパイラのパス>


CコンパイラまたはC++コンパイラのフラグを変更するには、以下のオプションを付加する。

-DCMAKE_C_FLAGS="-std=c17" -DCMAKE_CXX_FLAGS="-std=c++17"


オプション設定を対話式に変更する場合は、ccmakeコマンドを使用する。
ccmakeの操作方法は、画面下部に表示されている通りである。
矢印キーもしくは[J]キー、[K]キーでカーソルが上下に移動すると、中段に選択中の変数の説明が表示される。
[Enter]キーでその項目を編集して、[C]キーでConfigureを実行、[G]キーでGenerateを実行して、ccmakeを終了する。

ccmake <ソースコードがあるディレクトリ>


オプション設定をGUIに変更する場合は、buildディレクトリを作成して、その中で以下のコマンドを実行する。

cmake-gui <ソースコードがあるディレクトリ>



ビルドタイプの指定

変数を通したプロジェクト設定の例として、デバッグ / リリース等のビルドタイプを指定する方法がある。
この設定には、CMAKE_BUILD_TYPE、CMAKE_CONFIGURATION_TYPESという2つのキャッシュ変数が絡む。
どちらを設定すべきかは、ジェネレータによって変わる。

Makefile

ジェネレータがMakefileの場合、単一のビルドオプションしか保持できないので、Configure / Generate時にビルドタイプを指定する。
ビルドタイプは、キャッシュ変数CMAKE_BUILD_TYPEに値を設定することで指定できる。

cmake -DCMAKE_INSTALL_PREFIX=<インストールディレクトリ> -DCMAKE_BUILD_TYPE=Release <ソースコードがあるディレクトリ> 


次に、生成されたMakefileを使用してビルドする。

cmake --build .


CMakeでは、標準でDebug、Release、MinSizeRel、RelWithDebInfoの4種類のビルドタイプが用意されている。
それぞれどのようなビルドオプションが採用されるかはコンパイラによって違うので、別途調べること。

IDE

ジェネレータがVisual StudioやXcodeといったIDEの場合、プロジェクトファイルに複数のビルドタイプを保持できるので、
Configure / Generate時にビルドタイプを指定する必要はない。

cmake -DCMAKE_INSTALL_PREFIX=<インストールディレクトリ> <ソースコードがあるディレクトリ> 


次に、ビルドの実行時に、どのビルドタイプを使用するかを指定する。

cmake --build . --config Release


プロジェクトファイルに含めるビルドタイプを、ReleaseRelWithDebInfoの2つに限定する場合は、
キャッシュ変数CMAKE_CONFIGURATION_TYPESRelease;RelWithDebInfoのように値を設定する。