Programing/Tool/CMake/Guides/Tutorial
CMake Tutorialの簡易翻訳
はじめに
本チュートリアルは、一般的なビルドシステムの問題をCMakeで対処するのに役立つガイドを提供します。
本チュートリアルのドキュメントとサンプルコードは、CMakeソースコードのHelp/guiede/tutorialにあります。
サンプルコードは、ステップ毎のサブディレクトリに分割して格納されています。
Step1.基本
- 基本プロジェクト
最も基本的な、ソースコードから実行ファイルをビルドするプロジェクトです。
このような単純なプロジェクトの場合、必要なのはたった3行の CMakeLists.txt ファイルのみです。
次のような CMakeLists.txt ファイルをディレクトリに作成します。
バージョン番号と設定用ヘッダファイルの追加
- バージョン番号の追加
実行ファイルとプロジェクトにバージョン番号を追加します。 - 設定用ヘッダファイルの生成
設定したバージョン番号をソースコードに渡すためのヘッダファイルを生成します。
configure_fileコマンドを使用することで、テンプレートファイル(TutorialConfig.h.in)内にCMakeLists.txtで定義した変数の内容を埋め込んで、ヘッダファイル(TutorialConfig.h)を生成します。 - 検索パスの追加
設定用ヘッダファイルはバイナリツリーに書き込まれます。
そのため、ヘッダファイルを #include で検索するためには、パスのリストに追加する必要があります。
CMakeLists.txt の最後に次の行を追加します。 - テンプレートファイル
設定用ヘッダファイル(TutorialConfig.h)の元となるテンプレートファイル(TutorialConfig.h.in)を作成します。
CMakeがこのヘッダーファイルを生成すると、@Tutorial_VERSION_MAJOR@ と @Tutorial_VERSION_MINOR@ が変数値に置き換えられます。 - ソースファイルの変更
tutorial.cxxを変更して、設定用ヘッダーファイル(TutorialConfig.h)をインクルードします。
以下のように実装することで実行可能ファイルの名前とバージョン番号を出力できます。
C++規格への対応
- コードの修正
tutorial.cxx内のatofをstd::stodに置き換えて、C++11規格の機能を追加します。
同時に#include <cstdlib>を削除します。 - CMakeLists.txtの修正
C++11規格を使用する場合、CMakeコード上でも明示的に指定する必要があります。
特定のC++規格に対応する最も簡単な方法は、CMAKE_CXX_STANDARD変数を使用する方法です。
このチュートリアルでは、CMakeLists.txtファイルの CMAKE_CXX_STANDARD変数を11に設定し、CMAKE_CXX_STANDARD_REQUIREDをTrueに設定します。
add_executableの呼び出し前にCMAKE_CXX_STANDARD宣言を必ず追加してください。
ビルドとテスト
cmakeもしくはcmake-guiを実行して、プロジェクトを構成し、選択したビルドツールでビルをします。
- ビルドディレクトリの作成
コマンドから CMakeソースコードの Help/guide/tutorial ディレクトリに移動し、ビルドディレクトリを作成します。 - CMakeの実行
次に、ビルドディレクトリに移動し、CMake を実行してプロジェクトを構成し、ビルドシステムを生成します。 - ビルド
ビルドシステムを呼び出して、実際にプロジェクトをコンパイル/リンクします。 - 動作確認
最後にビルドしたTutorialコマンドを動作確認しましょう。
Step2.ライブラリ追加
プロジェクトにライブラリを追加します。
このライブラリには、数値の平方根を計算する独自の実装が含まれています。
このライブラリを追加することで、実行ファイルはライブラリが提供する実装を使用できます。
このチュートリアルでは、ライブラリを MathFunctions というサブディレクトリに置いています。
サブディレクトリには、ヘッダーファイル MathFunctions.h とソースファイル mysqrt.cxx が含まれています。
次の1行の CMakeLists.txt ファイルを MathFunctions ディレクトリに追加します。
To make use of the new library we will add an add_subdirectory() call in the top-level CMakeLists.txt file so that the library will get built. We add the new library to the executable, and add MathFunctions as an include directory so that the mqsqrt.h header file can be found. The last few lines of the top-level CMakeLists.txt file should now look like:
Now let us make the MathFunctions library optional. While for the tutorial there really isn’t any need to do so, for larger projects this is a common occurrence. The first step is to add an option to the top-level CMakeLists.txt file.
This option will be displayed in the cmake-gui and ccmake with a default value of ON that can be changed by the user. This setting will be stored in the cache so that the user does not need to set the value each time they run CMake on a build directory.
The next change is to make building and linking the MathFunctions library conditional. To do this we change the end of the top-level CMakeLists.txt file to look like the following:
Note the use of the variable EXTRA_LIBS to collect up any optional libraries to later be linked into the executable. The variable EXTRA_INCLUDES is used similarly for optional header files. This is a classic approach when dealing with many optional components, we will cover the modern approach in the next step.
The corresponding changes to the source code are fairly straightforward. First, in tutorial.cxx, include the MathFunctions.h header if we need it:
Then, in the same file, make USE_MYMATH control which square root function is used:
Since the source code now requires USE_MYMATH we can add it to TutorialConfig.h.in with the following line:
Exercise: Why is it important that we configure TutorialConfig.h.in after the option for USE_MYMATH? What would happen if we inverted the two?
Run the cmake executable or the cmake-gui to configure the project and then build it with your chosen build tool. Then run the built Tutorial executable.
Now let’s update the value of USE_MYMATH. The easiest way is to use the cmake-gui or ccmake if you’re in the terminal. Or, alternatively, if you want to change the option from the command-line, try:
Rebuild and run the tutorial again.
Which function gives better results, sqrt or mysqrt?