C++初心者がMacでCMakeを利用してみる

AWS SDK for C++ を利用してみようとおもったらCMakeなるものを利用していたので、先にそちらについて調べてみました。(C++ 初心者)

aws/aws-sdk-cpp: AWS SDK for C++
https://github.com/aws/aws-sdk-cpp


## CMakeとは

CMake - Wikipedia
https://ja.wikipedia.org/wiki/CMake

>CMakeはコンパイラに依存しないビルド自動化のためのフリーソフトウェアであり、様々なオペレーティングシステムで動作させることができる。CMakeは階層化ディレクトリや複数のライブラリを利用するアプリケーションをサポートするよう設計されている。実際のビルドにおいては、make、Xcode、Visual Studioのようなネイティブのビルド環境が利用される。CMake自身は最小限の依存関係を持つよう設計されており、ビルドするにはC++コンパイラのみを必要とする[4]。

`g++`コマンドでコンパイルするよりも超便利って認識で良いのかな。


## 検証環境

MacBook Proで`gcc`などはそのままな環境です。

```sh
> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G4015

> gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```


## CMakeをMacにインストール

CMakeをMacにインストールするには、Homebrewが利用できるようです。

Monobit Unity Networking (MUN) official document
http://www.monobitengine.com/doc/mun/contents/SetupServer_MacOSX/Cpp/Install_CMake.htm

```sh
> brew install cmake
(略)
==> Summary
🍺  /usr/local/Cellar/cmake/3.13.3: 5,543 files, 50.8MB
```

インストールできたらコマンドを叩いてみます。

```sh
> cmake
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.
```

## CMakeを利用してみる

下記を参考に利用させてもらいました。

複数ソースファイルがある方がCMakeの便利さがわかるっぽいのですが、まだ`*.hpp`ファイルなにそれ？おいしいの？な初心者なので、単一ファイルです！


ごく簡単なcmakeの使い方 - Qiita
https://qiita.com/termoshtt/items/539541c180dfc40a1189


```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch main.cpp
> touch CMakeLists.txt
```

```cpp:main.cpp
#include <iostream>

int main()
{
    std::cout << "Hello! World!" << std::endl;
    return 0;
}
```

```txt:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_executable(Main main.cpp)
```

必要なファイルが用意できたら、CMakeでコンパイルしてみます。

```sh
> cmake .

-- The C compiler identification is AppleClang 10.0.0.10001044
-- The CXX compiler identification is AppleClang 10.0.0.10001044
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /任意のディレクトリ
```

なにやらいろんなファイルが生成されました。

```sh
> ls -l
total 72
-rw-r--r--   1 hoge  Users  13295  1 22 13:00 CMakeCache.txt
drwxr-xr-x  15 hoge  Users    480  1 22 13:00 CMakeFiles
-rw-r--r--   1 hoge  Users     65  1 22 12:15 CMakeLists.txt
-rw-r--r--   1 hoge  Users   4820  1 22 13:00 Makefile
-rw-r--r--   1 hoge  Users   1377  1 22 13:00 cmake_install.cmake
-rw-r--r--   1 hoge  Users     96  1 22 12:59 main.cpp
```

こちらの記事によると、CMakeを利用してコンパイルする場合には、専用のディレクトリ内で実行するのが良いとのことです。

CMakeの使い方（その１） - Qiita
https://qiita.com/shohirose/items/45fb49c6b429e8b204ac


なぜなのか気になって調べてみたら、下記が詳しかったです。

CMake : out-of-sourceビルドで幸せになる - Qiita
https://qiita.com/osamu0329/items/7de2b190df3cfb4ad0ca


ソースファイルと同じディレクトリ内で実行しちゃだめってわけではなさそうなので、今回はそのまますすめます。

`CMake`コマンドで出力されるファイルについては、`Makefile`が自動生成されてウマーくらいの認識でよさそう？ほんとに？

実行ファイルを作成するのに、`make`コマンドを実行します。

```sh
> make
Scanning dependencies of target Main
[ 50%] Building CXX object CMakeFiles/Main.dir/main.cpp.o
[100%] Linking CXX executable Main
[100%] Built target Main
```

これで`Main`ファイルが作成されました。
実行してみます。

```sh
> ./Main
Hello! World!
```

おおー。実行できました。

## まとめ

今回みたいなシンプルな構成だと、`g++`コマンドだけでもよさそうですが、構成が複雑になってくると`CMake`を利用するのが良さそうです。

```sh
> g++ -o Main2 main.cpp
> ./Main2
Hello! World!
```

## 参考

CMake - Wikipedia
https://ja.wikipedia.org/wiki/CMake

Monobit Unity Networking (MUN) official document
http://www.monobitengine.com/doc/mun/contents/SetupServer_MacOSX/Cpp/Install_CMake.htm

ごく簡単なcmakeの使い方 - Qiita
https://qiita.com/termoshtt/items/539541c180dfc40a1189

CMakeの使い方（その１） - Qiita
https://qiita.com/shohirose/items/45fb49c6b429e8b204ac

CMake : out-of-sourceビルドで幸せになる - Qiita
https://qiita.com/osamu0329/items/7de2b190df3cfb4ad0ca