空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

CMakeのお勉強(2)

やりたいこと

cmakeについて調べることが多いし、理解も浅いので、理解を深める

教科書

CMake チュートリアル — Cmake-Tutorial

CMake チュートリアル

チュートリアルでは,一般的なビルドシステムの問題点のうち,CMake を利用することで解決できる事項について段階的に述べていきます

Step1: 最小構成

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cpp)

tutorial.cpp

// 1つの数値の平方根を計算する単純なプログラム
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    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;
}

Step2: ライブラリの追加

add_library(MathFunctions mysqrt.cpp)

新しいライブラリを利用するには,ライブラリをビルドするにように,トップレベルの CMakeLists ファイルに add_subdirectory の呼び出しを追加します. また,MathFunctions/mysqrt.h ヘッダファイルにある関数の宣言を見つけられるように,別のインクルードディレクトリも追加します. 最後の修正は,新しいライブラリを実行ファイルに追加することです. トップレベルの CMakeLists の最後の数行は,次のようになります:

include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)

# 実行ファイルを追加
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)

ライブラリの作成をオプション形式にするには

以下のように記述する

# 自前の演算関数を使うべきか?
option (USE_MYMATH
        "Use tutorial provided math implementation" ON)

# 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.cxx)
target_link_libraries (Tutorial  ${EXTRA_LIBS})

MathFUnctions をコンパイルして利用するかどうかを決定するために,USE_MYMATHの設定を利用します.

Step3: インストール

インストール規則は,実に簡単です. MathFunctions ライブラリの場合,次の2行を,MathFunctions の CMakeLists ファイルに追加することで, インストールされるライブラリとヘッダファイルを設定します

install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

Step5: ファイルを生成するファイルと,生成されたファイルの追加

生成されたソースファイルをアプリケーションのビルドプロセスに組み込む方法について述べます

// 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;
}

MakeTable 実行ファイルをビルドするために, 適切なコマンドを MathFunctions の CMakeLists ファイルに追加し,それをビルドプロセスの一部としてを実行します.

# まず,テーブルを生成するための実行ファイルを追加
add_executable(MakeTable MakeTable.cxx)

# ソースコードを生成するためのコマンドを追加
add_custom_command (
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
  COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
  DEPENDS MakeTable
  )

# インクルードファイルの探索パスに,
# バイナリツリーディレクトリを追加
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

# メインライブラリを追加
add_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h  )

参考:

所感

実際に書いてみないと理解しづらいところも多い。

書きながら勉強してみよう。