Professional CMake: A Practical Guideの無料部分を読む　～その2～

# PROFESSINAL CMAKE : A PRACTICAL GUIDEとは
[CMake参考書紹介(2022年時点)](https://qiita.com/imaginary_uepon/items/aafbba33c87da06b284c)という記事で，この電子書籍を読んでクロスプラットフォームの環境構築ができたということが書いてありました．
これを受けて，試しに無料で公開されている部分を読んで要約してみたというものです．
この本は全部で7パートから構成されており，そのうち1パート目が無料で公開されています．
その無料で公開されている部分の各チャプターに何が書いてあるのかをメモの代わりに要約しています．
概要を理解し読む気を起こすための記事なので，きちんとした内容は実際にこの公開されているものを読みに行ってください．

[その１](https://qiita.com/ciao_kaokawa/items/4b4ba99a2119fa1cf838)

## その2
その2では，Chapter3をまとめます．
ここでは，CMakeのビルドに必要な最小構成について解説しています．

## Chapter3. A minimal Project
すべてのCMakeはCMakeLists.txtから始まる．
CMakeLists.txtには，ビルド，テスト，パッケージングすべての工程が記述される．
そのため，シンプルなものから複雑なものまで存在する．

CMakeは他の言語と同様に，変数や関数，マクロ，条件付き処理など一般的な機能を有する．
これらは，Part2で解説する．
しかし，最小のCMakeLists.txtは以下の通りあらわされる．
```
cmake_minimum_required(VERSION 3.2)
project(MyApp)
add_executable(MyExe main.cpp)
```

CMakeは他の言語と同様引数を取る一方返り値はない．
また，コマンドにおいて大文字と小文字は区別しない．
最近は，コマンドを小文字で書くことが多い．

### 3.1. Managing CMake Versions
CMakeは継続的にアップデートしている．
そして，新しいバージョンは後方互換性を持たせて開発する．
一方，バージョンにより警告が変わったりするのでCMakeではどのバージョンで動くのか定義できる．

そのためのコマンドがcmake_minimum_required()である．
このコマンドはすべてのCMakeLists.txtの中で一番最初に記述され，以下の働きをする．
* CMakeが要求する最小バージョンを設定し，それより古い場合はエラーを返す
* 指定されたバージョンでCMakeが動く

これは，3.26以降では最初に書かれていないとエラーを返すようになった．
これにより，CMakeは後続の処理においてどのようなポリシーで動くべきかを決定できる．
このポリシーについてはチャプター13で説明する．

cmake_minimum_required()は以下の様に記述される．
```
cmake_minimum_required(VERSION major.minor[.patch[.tweak]])
```
が，tweakは必ずしも記述する必要なく（3.0以降tweakはなくなった），patchも3.0以降はxで代用できる．

開発者は新しいプロジェクトを始めるとき，3.5以降を使いうよう検討すべきだ．
なぜなら，iOSの様に変化が激しい環境では古いCMakeは使えない可能性が高いからだ．

ほとんどの場合，CMakeはプログラムを構築するのに困らない中で最新のものを使うべきだ．
一方，他の依存関係にある場合はそれより新しいCMakeを利用すると，それが導入障壁になる可能性がある．

### 3.2 The project() Command
すべてのCMakeプロジェクトは，project()コマンドを含む．
この主なオプションは以下の通りとなっている．
``` 
project(projectName
[VERSION major[.minor[.patch[.tweak]]]]
[LANGUAGES languageName ...]
)
```
projectNameは必須である．
主にアンダースコアと文字で構成される．
この名前は，IDEのプロジェクト名として使用される．

VersionはCMake3.0以降でサポートされる．
これは，メタデータや変数の一部としてしか扱われない．
一方，これを定義することは他から参照するときにわかりやすいので良い習慣である．
チャプター22では，バージョン指定の詳細について説明している．

LANGUAGESは，使用する言語を指定する．
3.0以前のCMakeではLANGUAGESはサポートされていないが，次の様にして言語を指定できる
```
project(MyProj C CXX)
```

project()コマンドは，変数を設定だけではない．
その最も重要な役割は，コンパイラでビルドできるかをチェックすることだ．
コンパイラとリンカでのエラーを検出する．
Chapter24では，ツールチェーンとクロスコンパイルを説明する．
Chapter8では，project()コマンドを利用するうえでサブディレクトリを使うことについて説明する．

CMakeの実行が成功すると，その結果がCMakeCache.txtにキャッシュされる．
このキャッシュは，新しいコンパイラやクロスコンパイルするときに参照する．

### 3.3 Building A Basic Executable
最小構成でexeを出力するには，以下のコマンドを実行する．
```
add_executable(targetName source1 [source2 ...])
```
これにより，targetNameという名前の実行ファイルが作成される．
これにより，ビルドディレクトリに各環境に依存する名前で実行ファイルが作成される．
実行可能ファイルの名前はChapter 10, Propertiesで紹介する．

### 3.4 Commenting
CMakeのコメントはUnixの仕様に沿っています．
以下にその例を示します．
```
cmake_minimum_required(VERSION 3.2)
# We don't use the C++ compiler, so don't let project()
# test for it in case the platform doesn't have one
project(MyApp VERSION 4.7.2 LANGUAGES C)
# Primary tool for this project
add_executable(MainTool
main.c
debug.c # Optimized away for release builds
)
# Helpful diagnostic tool for development and testing
add_executable(TestTool testTool.c)
# These tools are not ready yet, disable them
#[=[
add_executable(NewTool1 tool1.c)
add_executable(NewTool2
tool2.c
extras.c
)
]=]
```

### 3.5 Recommended Practices
すべてのCMakeプロジェクトで，cmake_minimum_required()が最初に書かれていることを確認すること．
また，CMakeは新しければ新しいほど多くのプラットフォームに対応している．
一方，Unix系は同じディストリビューションで指定されたCMakeのバージョンがミニマムになることがある．

VERSIONが設定されていないCMakeはなるべく早くVERSIONを設定する必要がある．

## 感想
意外ときちんと読まないと，CMakeのバージョン選定とかでつまずきそうなポイントがあった．
てか，PracticesがPracticeになっていない...

[その３]()