C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

CMakeの公式チュートリアルをC++11脳で読み進めるにゃ・w・

cmakeについて漸く自分でも使ってみようと思いチュートリアルをC++11仕様に勝手に脳内変換しながら読むなどしていた。C++11erがcmakeを学習する際に初めに困る事は恐らく「g++にstd=c++11を渡す方法」だと思う。cmakeを習得済みならば困る事は無いはずだが、何故かチュートリアルのレガシーなC++ソースコードが全自動でC++11ソースにtransformされて見える様な場合は困るだろう。

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)
// A simple program that computes the square root of a number
#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;
}

以上はcmakeの公式tutorialよりそのまま引用したcmake学習者が最初に学ぶべき"A Basic String Point (Step 1)"である。cmakeのチュートリアルを丸ごとC++11仕様にして邦訳版を作りgh-pagesにでもあげようかとは思ったものの、ドキュメントのライセンスがCC-BY-ND(改変禁止)なので面倒に思いヤメタ・w・

"cmake c++0x"でググるにStackOverflowに「clang++でc++0xしたいができない」的なスレがあった。(おそらく)cmake使いから「ADD_DEFINITIONS("-std=c++0x") を使うといいよ、CXX_FLAGSじゃなくてね。」と回答されている。そんなわけで、C++11erはcmakeを学習するに辺り以下の様な雛形を最初に試すとストレスフリーにチュートリアルを進められるかも。

cmake_minimum_required (VERSION 2.8)
project (Tutorial)
add_executable (Tutorial tutorial.cxx)
add_definition ("-std=c++11")
// A simple program that computes the square root of a number
#include <iostream>
#include <cstdlib>
#include <cmath>
int main (int argc, char *argv[])
{
  if (argc < 2)
  {
    std::cout
      << "Usage: "
      << argv[0]
      << " number"
      << std::endl;
    return 1;
  }
  auto input_value  = std::atof(argv[1]);
  auto output_value = std::sqrt(input_value);
  std::cout
    << "The square root of "
    << input_value " is "
    << output_value
    << std::endl;
}

変態的な事をするわけでなければMakefileをにゃんにゃん書く必要も無いので、多くの通常のソフトウェア開発に於いてCMakeを使う事はとても楽そうですね。ライブラリーのリンク指定なども随分と楽になりますし、これからは積極的にcmake使おうかな、って思ったり・w・