[[FrontPage]]

参考:[[全般的なチュートリアル:http://opencv.jp/cmake/cmake_tutorial.html]] ←大いに参考にした。

参考:[[オプションの定義方法:http://d.hatena.ne.jp/tueda_wolf/20110223/p1]] ←オプションの定義方法だけならここも分かりやすい。

参考:[[CMakeのCMakeLists.txt:http://metalphaeton.blogspot.jp/2012/11/cmakecmakeliststxt.html]]
 ← CMakeLists.txt の書き方、意味についてはここが詳しい。

* 準備 [#s1c8faf0]

 $ sudo apt-get install cmake

* 基本的な使い方 [#z7523eb4]

CMakeLists.txt のあるディレクトリでcmakeが使える。

そのディレクトリで

 $ mkdir <workspace>
 $ cd <workspace>
 $ cmake [<オプション>] ..
 $ make
 $ make test
 $ sudo make install

* cmake のオプション [#hf2d4d59]

- --help :オプション一覧
- -L     :CMakeLists.txtやコマンドラインオプションで指定した CMake変数の表示
- -LA    :すべての CMake変数の表示
- --help-variable <変数>  :CMake変数のヘルプの表示
-- 例1: --help-variable CMAKE_BUILD_TYPE
-- 例2: --help-variable CMAKE_\<LANG\>_COMPILER
- --help-variable-list    :CMake変数名の一覧を表示
- --help-variables        :すべてのCMake変数のヘルプの表示
- -D CMAKE_BUILD_TYPE:STRING="Debug"             :デバッグモードでコンパイル(Debug, Release, MinSizeRel, RelWithDebInfo が使える)
- -D CMAKE_CXX_FLAGS_DEBUG:STRING="-Wall -O0 -g" :デバッグモードのFLAGSの指定
- -D CMAKE_CXX_FLAGS_RELEASE:STRING="-O3 -DNDEBUG -fomit-frame-pointer" :リリースモードのFLAGSの指定
- -D CMAKE_CXX_COMPILER:FILEPATH="/usr/bin/g++"  :コンパイラを指定
- -D CMAKE_CXX_FLAGS:STRING="-Wall -O0 -g"       :フラグを(無理矢理)指定。これは非公式な方法(?)


* 使用例(その1) 基本的な使い方 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 1」に対応 [#h770d833]

下記の3つのファイルを用意する。

- tutorial-step1/tutorial.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include "TutorialConfig.h"
 
 int main (int argc, char *argv[])
 {
   if (argc < 2)
   {
     fprintf(stdout,"%s Version %d.%d\n",
             argv[0],
             Tutorial_VERSION_MAJOR,
             Tutorial_VERSION_MINOR);
     fprintf(stdout,"Usage: %s number\n",argv[0]);
     return 1;
   }
   double inputValue = atof(argv[1]);
   double outputValue = sqrt(inputValue);
   fprintf(stdout,"The square root of %g is %g\n",
           inputValue, outputValue);
   return 0;
 }

- tutorial-step1/CMakeLists.txt

 cmake_minimum_required (VERSION 2.6)
 project (Tutorial)
 # バージョン番号
 set (Tutorial_VERSION_MAJOR 1)
 set (Tutorial_VERSION_MINOR 0)
 
 # CMake の設定をソースコードに渡すための
 # ヘッダファイルの構成
 configure_file (
   "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
   "${PROJECT_BINARY_DIR}/TutorialConfig.h"
   )
 
 # TutorialConfig.h を検出できるように,
 # インクルードファイルの探索パスにバイナリツリーを追加
 include_directories("${PROJECT_BINARY_DIR}")
 
 # 実行ファイルを追加
 add_executable(Tutorial tutorial.cpp)
 
 # メッセージの表示
 message (STATUS "Generate TutorialConfig.h ...")

- tutorial-step1/TutorialConfig.h.in

 // Tutorialの設定オプション
 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
 #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

- 作業開始

 $ cd tutorial-test1
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ ./Tutorial 25


* 使用例(その2) ライブラリの追加方法 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 2」に対応 [#pae3c7e0]

sqrt() と同じ機能を持つmysqrt()をライブラリMathFunctionsとして提供する例。

更に、mysqrt()を使うか、sqrt()を使うか切り替えられるようにする。


下記の6つのファイルを用意する。

- tutorial-step2/tutorial.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include "TutorialConfig.h"
 #ifdef USE_MYMATH
 #include "MathFunctions.h"
 #endif
 
 int main (int argc, char *argv[])
 {
   if (argc < 2)
   {
     fprintf(stdout,"%s Version %d.%d\n", argv[0],
             Tutorial_VERSION_MAJOR,
             Tutorial_VERSION_MINOR);
     fprintf(stdout,"Usage: %s number\n",argv[0]);
     return 1;
   }
 
   double inputValue = atof(argv[1]);
 
 #ifdef USE_MYMATH
   double outputValue = mysqrt(inputValue);
 #else
   double outputValue = sqrt(inputValue);
 #endif
 
   fprintf(stdout,"The square root of %g is %g\n",
           inputValue, outputValue);
   return 0;
 }

- tutorial-step2/CMakeLists.txt

 cmake_minimum_required (VERSION 2.6)
 project (Tutorial)
 # バージョン番号
 set (Tutorial_VERSION_MAJOR 1)
 set (Tutorial_VERSION_MINOR 0)
 
 # 自前の演算関数を使うべきか?
 option (USE_MYMATH
         "Use tutorial provided math implementation" ON)
 
 # CMake の設定をソースコードに渡すための
 # ヘッダファイルの構成
 configure_file (
   "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
   "${PROJECT_BINARY_DIR}/TutorialConfig.h"
   )
 
 # TutorialConfig.h を検出できるように,
 # インクルードファイルの探索パスにバイナリツリーを追加
 include_directories("${PROJECT_BINARY_DIR}")
 
 # MathFunctions ライブラリを追加するか?
 #
 if (USE_MYMATH)
   include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
   add_subdirectory (MathFunctions)
   set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
 endif (USE_MYMATH)
 
 # 実行ファイルを追加
 add_executable (Tutorial tutorial.cpp)
 target_link_libraries (Tutorial  ${EXTRA_LIBS})
 
 # メッセージの表示
 message (STATUS "Generate TutorialConfig.h ...")
 message (STATUS "USE_MYMATH=${USE_MYMATH}")

- tutorial-test2/TutorialConfig.h.in

 // Tutorialの設定オプション
 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
 #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
 
 #cmakedefine USE_MYMATH

ここからは MathFunctionsライブラリ。
MathFunctionsというサブディレクトリ内に作成。

- tutorial-step2/MathFunctions/mysqrt.cpp

 #include <iostream>
 
 double mysqrt(double x)
 {
   return 1.4; // ←サンプルなので超適当
 }

- tutorial-step2/MathFunctions/MathFunctions.h

 #ifndef MATH_FUNCTIONS_H
 
 #define MATH_FUNCTIONS_H
 
 double mysqrt(double x);
 
 #endif // MATH_FUNCTIONS_H

- tutorial-step2/MathFunctions/CMakeLists.txt

 # メインライブラリを追加
 add_library(MathFunctions mysqrt.cpp)

- 作業開始

 $ cd tutorial-step2
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ ./Tutorial 25

超適当なMathFunctionsライブラリを使っているので、結果も適当。

* 使用例(その3) インストールとテストの方法 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 3」に対応 [#d0f75be6]

- tutorial-step3/tutorial.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include "TutorialConfig.h"
 #ifdef USE_MYMATH
 #include "MathFunctions.h"
 #endif
 
 int main (int argc, char *argv[])
 {
   if (argc < 2)
   {
     fprintf(stdout,"%s Version %d.%d\n", argv[0],
             Tutorial_VERSION_MAJOR,
             Tutorial_VERSION_MINOR);
     fprintf(stdout,"Usage: %s number\n",argv[0]);
     return 1;
   }
 
   double inputValue = atof(argv[1]);
 
 #ifdef USE_MYMATH
   double outputValue = mysqrt(inputValue);
 #else
   double outputValue = sqrt(inputValue);
 #endif
 
   fprintf(stdout,"The square root of %g is %g\n",
           inputValue, outputValue);
   return 0;
 }

- tutorial-step3/CMakeLists.txt

マクロも定義できる

 cmake_minimum_required (VERSION 2.6)
 project (Tutorial)
 # バージョン番号
 set (Tutorial_VERSION_MAJOR 1)
 set (Tutorial_VERSION_MINOR 0)
 
 # 自前の演算関数を使うべきか?
 option (USE_MYMATH
         "Use tutorial provided math implementation" OFF)
 
 # CMake の設定をソースコードに渡すための
 # ヘッダファイルの構成
 configure_file (
   "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
   "${PROJECT_BINARY_DIR}/TutorialConfig.h"
   )
 
 # TutorialConfig.h を検出できるように,
 # インクルードファイルの探索パスにバイナリツリーを追加
 include_directories("${PROJECT_BINARY_DIR}")
 
 # MathFunctions ライブラリを追加するか?
 #
 if (USE_MYMATH)
   include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
   add_subdirectory (MathFunctions)
   set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
 endif (USE_MYMATH)
 
 # 実行ファイルを追加
 add_executable (Tutorial tutorial.cpp)
 target_link_libraries (Tutorial  ${EXTRA_LIBS})
 
 
 #### インストールターゲットを追加
 # CMAKE_INSTALL_PREFIX (default=/usr/local)以下に install される
 install (TARGETS Tutorial DESTINATION bin)
 install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
          DESTINATION include)
 
 
 #### test
 enable_testing() # これがないと make test できない
 
 # アプリケーションを実行
 add_test (TutorialRuns Tutorial 25)
 
 # 25 の平方根を計算
 add_test (TutorialComp25 Tutorial 25)
 
 set_tests_properties (TutorialComp25
   PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")
 
 # 負の数値の扱い
 add_test (TutorialNegative Tutorial -25)
 set_tests_properties (TutorialNegative
   PROPERTIES PASS_REGULAR_EXPRESSION "-25 is 0")
 
 # 小さい数値の扱い
 add_test (TutorialSmall Tutorial 0.0001)
 set_tests_properties (TutorialSmall
   PROPERTIES PASS_REGULAR_EXPRESSION "0.0001 is 0.01")
 
 #簡単にテストを追加するためのマクロ定義とその利用
 macro (do_test arg result)
   add_test (TutorialComp${arg} Tutorial ${arg})
   set_tests_properties (TutorialComp${arg}
     PROPERTIES PASS_REGULAR_EXPRESSION ${result})
 endmacro (do_test)
 
 # テスト結果
 do_test (36 "36 is 6")
 do_test (-36 "-36 is 0")
 
 # 使い方のメッセージを表示できるか?
 add_test (TutorialUsage Tutorial)
 set_tests_properties (TutorialUsage
   PROPERTIES
   PASS_REGULAR_EXPRESSION "Usage:.*number")
 
 # メッセージの表示
 message (STATUS "Generate TutorialConfig.h ...")
 message (STATUS "USE_MYMATH=${USE_MYMATH}")


- tutorial-step3/TutorialConfig.h.in

 // Tutorialの設定オプション
 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
 #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
 
 #cmakedefine USE_MYMATH

- tutorial-step3/MathFunctions/mysqrt.cpp

 #include <iostream>
 
 double mysqrt(double x)
 {
   return 1.4;
 }

- tutorial-step3/MathFunctions/MathFunctions.h

 #ifndef MATH_FUNCTIONS_H
 
 #define MATH_FUNCTIONS_H
 
 double mysqrt(double x);
 
 #endif // MATH_FUNCTIONS_H

- tutorial-step3/MathFunctions/CMakeLists.txt

 # メインライブラリを追加
 add_library(MathFunctions mysqrt.cpp)
 
 # インストール
 install (TARGETS MathFunctions DESTINATION bin)
 install (FILES MathFunctions.h DESTINATION include)

- 作業開始

 $ cd tutorial-step3
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ make test
 $ sudo make install


* 使用例(その4) システム検査の方法 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 4」に対応 [#r5dd4197]

log() や exp() が使えるなら使う。そのために事前に探す。

- tutorial-step4/tutorial.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include "TutorialConfig.h"
 #ifdef USE_MYMATH
 #include "MathFunctions.h"
 #endif
 
 int main (int argc, char *argv[])
 {
   if (argc < 2)
   {
     fprintf(stdout,"%s Version %d.%d\n", argv[0],
             Tutorial_VERSION_MAJOR,
             Tutorial_VERSION_MINOR);
     fprintf(stdout,"Usage: %s number\n",argv[0]);
     return 1;
   }
 
   double inputValue = atof(argv[1]);
 
 // もし log と exp が両方あれば,それを利用する
 #if defined (HAVE_LOG) && defined (HAVE_EXP)
   double result = exp(log(inputValue)*0.5);
   fprintf(stdout, "exp(log(x)*0.5) = %g\n", result);
 #else // なければ適当に計算
   double result = inputValue*0.5;
   fprintf(stdout, "x*0.5 = %g\n", result);
 #endif
 
 #ifdef USE_MYMATH
   double outputValue = mysqrt(inputValue);
 #else
   double outputValue = sqrt(inputValue);
 #endif
 
   fprintf(stdout,"The square root of %g is %g\n",
           inputValue, outputValue);
   return 0;
 }

- tutorial-step4/CMakeLists.txt

log() や exp() を探す際、ヘッダーファイルとライブラリを指定しないと見つけられない。

それを指定するための変数がそれぞれ CMAKE_REQUIRED_INCLUDES と CMAKE_REQUIRED_LIBRARIES 


 cmake_minimum_required (VERSION 2.6)
 project (Tutorial)
 
 # バージョン番号
 set (Tutorial_VERSION_MAJOR 1)
 set (Tutorial_VERSION_MINOR 0)
 
 # 自前の演算関数を使うべきか?
 option (USE_MYMATH
         "Use tutorial provided math implementation" OFF)
 
 # does this system provide the log and exp functions?
 set(CMAKE_REQUIRED_INCLUDES math.h)
 set(CMAKE_REQUIRED_LIBRARIES m)
 include (CheckFunctionExists)
 check_function_exists (log HAVE_LOG)
 check_function_exists (exp HAVE_EXP)
 
 
 # CMake の設定をソースコードに渡すための
 # ヘッダファイルの構成
 configure_file (
   "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
   "${PROJECT_BINARY_DIR}/TutorialConfig.h"
   )
 
 # TutorialConfig.h を検出できるように,
 # インクルードファイルの探索パスにバイナリツリーを追加
 include_directories("${PROJECT_BINARY_DIR}")
 
 # MathFunctions ライブラリを追加するか?
 #
 if (USE_MYMATH)
   include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
   add_subdirectory (MathFunctions)
   set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
 endif (USE_MYMATH)
 
 # 実行ファイルを追加
 add_executable (Tutorial tutorial.cpp)
 target_link_libraries (Tutorial  ${EXTRA_LIBS})
 
 
 #### インストールターゲットを追加
 # CMAKE_INSTALL_PREFIX (default=/usr/local)以下に install される
 install (TARGETS Tutorial DESTINATION bin)
 install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
          DESTINATION include)
 
 
 #### test
 enable_testing() # これがないと make test できない
 
 # アプリケーションを実行
 add_test (TutorialRuns Tutorial 25)
 
 # 25 の平方根を計算
 add_test (TutorialComp25 Tutorial 25)
 
 set_tests_properties (TutorialComp25
   PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")
 
 # 負の数値の扱い
 add_test (TutorialNegative Tutorial -25)
 set_tests_properties (TutorialNegative
   PROPERTIES PASS_REGULAR_EXPRESSION "-25 is 0")
 
 # 小さい数値の扱い
 add_test (TutorialSmall Tutorial 0.0001)
 set_tests_properties (TutorialSmall
   PROPERTIES PASS_REGULAR_EXPRESSION "0.0001 is 0.01")
 
 #簡単にテストを追加するためのマクロ定義とその利用
 macro (do_test arg result)
   add_test (TutorialComp${arg} Tutorial ${arg})
   set_tests_properties (TutorialComp${arg}
     PROPERTIES PASS_REGULAR_EXPRESSION ${result})
 endmacro (do_test)
 
 # テスト結果
 do_test (36 "36 is 6")
 do_test (-36 "-36 is 0")
 
 # 使い方のメッセージを表示できるか?
 add_test (TutorialUsage Tutorial)
 set_tests_properties (TutorialUsage
   PROPERTIES
   PASS_REGULAR_EXPRESSION "Usage:.*number")
 
 # メッセージの表示
 message (STATUS "Generate TutorialConfig.h ...")
 message (STATUS "USE_MYMATH=${USE_MYMATH}")
 message (STATUS "HAVE_LOG=${HAVE_LOG}")
 message (STATUS "HAVE_EXP=${HAVE_EXP}")

- tutorial-step4/TutorialConfig.h.in

 // Tutorialの設定オプション
 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
 #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
 
 #cmakedefine USE_MYMATH
 
 // このプラットフォームに exp と log はあるか?
 #cmakedefine HAVE_LOG
 #cmakedefine HAVE_EXP

- tutorial-step4/MathFunctions/mysqrt.cpp

 #include <iostream>
 
 double mysqrt(double x)
 {
   return 1.4;
 }

- tutorial-step4/MathFunctions/MathFunctions.h

 #ifndef MATH_FUNCTIONS_H
 
 #define MATH_FUNCTIONS_H
 
 double mysqrt(double x);
 
 #endif // MATH_FUNCTIONS_H

- tutorial-step4/MathFunctions/CMakeLists.txt

 # メインライブラリを追加
 add_library(MathFunctions mysqrt.cpp)
 
 # インストール
 install (TARGETS MathFunctions DESTINATION bin)
 install (FILES MathFunctions.h DESTINATION include)


- 作業開始

 $ cd tutorial-step4
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ make test
 $ sudo make install

* 使用例(その5) 中間ファイルの生成方法 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 5」に対応 [#v77831fe]

MathFunctions/Table.h を MathFunctions/MakeTable.cpp から生成し、
それを使ったライブラリ MakeFunctions を構成する。

- tutorial-step5/tutorial.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include "TutorialConfig.h"
 #ifdef USE_MYMATH
 #include "MathFunctions.h"
 #endif
 
 int main (int argc, char *argv[])
 {
   if (argc < 2)
   {
     fprintf(stdout,"%s Version %d.%d\n", argv[0],
             Tutorial_VERSION_MAJOR,
             Tutorial_VERSION_MINOR);
     fprintf(stdout,"Usage: %s number\n",argv[0]);
     return 1;
   }
 
   double inputValue = atof(argv[1]);
 
 // もし log と exp が両方あれば,それを利用する
 #if defined (HAVE_LOG) && defined (HAVE_EXP)
   double result = exp(log(inputValue)*0.5);
   fprintf(stdout, "exp(log(x)*0.5) = %g\n", result);
 #else // なければ適当に計算
   double result = inputValue*0.5;
   fprintf(stdout, "x*0.5 = %g\n", result);
 #endif
 
 #ifdef USE_MYMATH
   double outputValue = mysqrt(inputValue);
 #else
   double outputValue = sqrt(inputValue);
 #endif
 
   fprintf(stdout,"The square root of %g is %g\n",
           inputValue, outputValue);
   return 0;
 }

- tutorial-step5/CMakeLists.txt

 cmake_minimum_required (VERSION 2.6)
 project (Tutorial)
 
 # バージョン番号
 set (Tutorial_VERSION_MAJOR 1)
 set (Tutorial_VERSION_MINOR 0)
 
 # このシステムは log と exp 関数を提供しているか?
 #include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
 include (CheckFunctionExists) # こちらの方がコンパクト
 
 set(CMAKE_REQUIRED_INCLUDES math.h)
 set(CMAKE_REQUIRED_LIBRARIES m)
 check_function_exists (log HAVE_LOG)
 check_function_exists (exp HAVE_EXP)
 
 # 自前の演算関数を使うべきか?
 option(USE_MYMATH
   "Use tutorial provided math implementation" ON)
 
 # CMake の設定をソースコードに渡すための
 # ヘッダファイルの構成
 configure_file (
   "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
   "${PROJECT_BINARY_DIR}/TutorialConfig.h"
   )
 
 # TutorialConfig.h を検出できるように,
 # インクルードファイルの探索パスにバイナリツリーを追加
 include_directories ("${PROJECT_BINARY_DIR}")
 
 # MathFunctions ライブラリを追加するか?
 if (USE_MYMATH)
   include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
   add_subdirectory (MathFunctions)
   set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
 endif (USE_MYMATH)
 
 # 実行ファイルを追加
 add_executable (Tutorial tutorial.cpp)
 target_link_libraries (Tutorial  ${EXTRA_LIBS})
 
 # インストールターゲットを追加
 # CMAKE_INSTALL_PREFIX (default=/usr/local)以下に install される
 install (TARGETS Tutorial DESTINATION bin)
 install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
          DESTINATION include)
 
 
 #### test
 enable_testing() # これがないと make test できない
 
 # アプリケーションを実行
 add_test (TutorialRuns Tutorial 25)
 
 # 使い方のメッセージを表示できるか?
 add_test (TutorialUsage Tutorial)
 set_tests_properties (TutorialUsage
   PROPERTIES
   PASS_REGULAR_EXPRESSION "Usage:.*number"
   )
  
 
 #簡単にテストを追加するためのマクロ定義
 macro (do_test arg result)
   add_test (TutorialComp${arg} Tutorial ${arg})
   set_tests_properties (TutorialComp${arg}
     PROPERTIES PASS_REGULAR_EXPRESSION ${result}
     )
 endmacro (do_test)
 
 # do a bunch of result based tests
 do_test (4 "4 is 2")
 do_test (5 "5 is 2.236")
 do_test (7 "7 is 2.645")
 do_test (25 "25 is 5")
 do_test (-25 "-25 is 0")
 do_test (0.0001 "0.0001 is 0.01")
 
 # メッセージの表示
 message (STATUS "Generate TutorialConfig.h ...")
 message (STATUS "USE_MYMATH=${USE_MYMATH}")
 message (STATUS "HAVE_LOG=${HAVE_LOG}")
 message (STATUS "HAVE_EXP=${HAVE_EXP}")

- tutorial-step5/TutorialConfig.h.in

 // Tutorialの設定オプション
 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
 #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
 #cmakedefine USE_MYMATH
 
 // このシステムは log と exp 関数を提供しているか?
 #cmakedefine HAVE_LOG
 #cmakedefine HAVE_EXP

- tutorial-step5/MathFunctions/MakeTable.cpp

 // 1つの数値の平方根を計算する単純なプログラム
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 
 int main (int argc, char *argv[])
 {
   int i;
   double result;
 
   // 必要な引数を指定するように
   if (argc < 2)
   {
     return 1;
   }
 
   // 出力ファイルを開く
   FILE *fout = fopen(argv[1],"w");
   if (!fout)
   {
     return 1;
   }
 
   // 平方根テーブルを持ったソースコードを作成
   fprintf(fout,"double sqrtTable[] = {\n");
   for (i = 0; i < 10; ++i)
   {
     result = sqrt(static_cast<double>(i));
     fprintf(fout,"%g,\n",result);
   }
 
   // テーブルの最後を0にする
   fprintf(fout,"0};\n");
   fclose(fout);
   return 0;
 }

- tutorial-step5/MathFunctions/mysqrt.cpp

 #include <iostream>
 #include "Table.h"
 
 double mysqrt(double x)
 {
   return sqrtTable[(int)x];
 }

- tutorial-step5/MathFunctions/MathFunctions.h

 #ifndef MATH_FUNCTIONS_H
 
 #define MATH_FUNCTIONS_H
 
 double mysqrt(double x);
 
 #endif // MATH_FUNCTIONS_H

- tutorial-step5/MathFunctions/CMakeLists.txt

 # まず,テーブルを生成するための実行ファイルを追加
 add_executable(MakeTable MakeTable.cpp)
 # ソースコードを生成するためのコマンドを追加
 add_custom_command (
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
   DEPENDS MakeTable
   COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
   )
 # インクルードファイルの探索パスに,
 # バイナリツリーディレクトリを追加
 include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
 
 # メインライブラリを追加
 add_library(MathFunctions mysqrt.cpp ${CMAKE_CURRENT_BINARY_DIR}/Table.h)
 
 install (TARGETS MathFunctions DESTINATION bin)
 install (FILES MathFunctions.h DESTINATION include)

- 作業開始

 $ cd tutorial-step5
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ make test
 $ sudo make install


* 使用例(その6) インストーラーの作成方法 [[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 6」に対応 [#x281adf7]

- tutorial-step6/CMakeLists.txt

tutorial-step5/CMakeLists.txt に下記数行を追加。

 #### インストーラー(CPack)
 # CPack ドリブンなインストーラパッケージの作成
 include (InstallRequiredSystemLibraries)
 set (CPACK_RESOURCE_FILE_LICENSE
      "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
 set (CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
 set (CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
 include (CPack)

- 作業開始

 $ cd tutorial-step6
 $ mkdir build
 $ cd build
 $ cmake ..
 $ make
 $ make test
 $ sudo make install

バイナリ配布物を作成するには

 $ make cpack -C CPackConfig.cmake

ソース配布物を作成するには

 $ cpack -C CPackSourceConfig.cmake

* 使用例(その7) ダッシュボード支援機能の利用方法[[このサイト:http://opencv.jp/cmake/cmake_tutorial.html]]の「Step 7」に対応 [#a9051d6b]

おそらく自分には必要のない機能なので省略

* CXX や CXX_FLAGS などのコンパイルに関わる変数の設定を変更する方法 [#ib3635e4]

いくつかの方法がある。

** まず、トップレベルの CMakeLists.txt に下記を追加する方法。 [#t0b93a7d]

 set(CMAKE_CXX_COMPILER "/usr/bin/g++")
 set(CMAKE_CXX_FLAGS "-Wall -O0 -g")

この方法の場合、CMakeCache.txt に記録が残らないのが難点かも。

ちゃんと機能していることを確認するには、

 $ grep CXX CMakeFiles/Tutorial.dir/*

とすると、build.make に /usr/bin/g++ が散らばっていたり、

flags.make の CXX_FLAGS の定義(の冒頭)に CMAKE_CXX_FLAGS の内容が出現していたり、

という形で確認できる。


** cmake時にオプションとして指定する方法。 [#vd02f489]

この方法だと、CMakeCache.txt に記録が残る。

 $ cmake \
       -D CMAKE_CXX_COMPILER="/usr/bin/g++" \
       -D CMAKE_CXX_FLAGS="-Wall -O0 -g" \
       ..

** CXX_FLAGS の指定方法について、更なる方法 [#b938ec1c]

変数 CMAKE_BUILD_TYPE を指定する方法もある。

これも CMakeLists.txt に追加する方法とcmake実行時に指定する方法がある。

まずは前者から。下記をCMakeLists.txt に追加。

 set(CMAKE_BUILD_TYPE "Debug")

"Debug"の部分は、他に "MinSizeRel", "Release", "RelWithDebInfo" を指定できる。

それぞれ下記の変数の内容が CXX_FLAGS に追加される。
(CMakeFiles/Tutorial.dir/flags.make 内)

 CMAKE_CXX_FLAGS_DEBUG:STRING=-g
 CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
 CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
 CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g

これらの変数の設定自体も下記の追加によって変更することもできる。

 set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g")


** 後者の、cmake 実行時における指定方法は、 [#tb8b62ab]

 $ cmake \
      -D CMAKE_BUILD_TYPE:STRING="Debug" \
      ..

さっきと同様に、変数 CMAKE_CXX_FLAGS_DEBUG の内容を変更することもできる。

(CMAKE_CXX_FLAGS_DEBUG の変更だけでは、その内容は反映されないので注意)

 $ cmake \
      -D CMAKE_BUILD_TYPE:STRING="Debug" \
      -D CMAKE_CXX_FLAGS_DEBUG:STRING="-Wall -g" \
      ..

** 結論 [#zbb57d0c]

コンパイラについては、変数 CMAKE_CXX_COMPILER で指定する。

FLAGSについては、
フォーマルには変数 CMAKE_BUILD_TYPE と CMAKE_CXX_FLAGS_DEBUG (など)をセットで指定すべきなのだろう。

というのは、CMAKE_CXX_FLAGS は cmake --help-variables で表示されないから。内部変数なのかも。

でも、
 $ cmake -D CMAKE_CXX_FLAGS="-Wall -O0 -g" ..
などと手軽に済ませてしまうのも裏技として知っておくと便利だろう。

ただし、CMAKE_CXX_FLAGS と CMAKE_BUILD_TYPE の両方を設定するのはやめた方がいい。

両方追加されてしまうから。

どうしてもそうする必要があるなら、cmake 実行後に、

CMakeFiles/Tutorial.dir/flags.make などの設定を見て矛盾がないか要確認のこと。

* cmake 後の make を verbose にする方法 [#t23cff8c]

2通りある。1つは、make 時に指定する方法。

 $ cmake ..
 $ make VERBOSE=1

もう1つは、cmake 時に指定する方法。

 $ cmake -D CMAKE_VERBOSE_MAKEFILE:BOOL=TRUE ..
 $ make

主観では後者の方が優れている気がする。

緑のフォントで今どのオブジェクトファイルをコンパイルしようとしているのかというメッセージが表示されるため。

* トラブルシューティング [#f4056f63]

** 挙動がおかしいとき [#v2092d54]

まずはキャッシュを削除

 $ rm CMakeCache.txt 

前に cmake したときの残骸が残っていることがある。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS