CMake備忘録

## **Cmake概要**
CMakeLists.txtの作成からBuildまでの流れ。各種Cmakeのコマンドは [コマンド一覧](#コマンド一覧) を参照。


#### CMakeLists.txt
CMakeLists.txtにbuild内容を記述する。
```CMake:CMakeLists.txt
# CMakeのバージョンを設定
cmake_minimum_required(VERSION 3.20)
# プロジェクト名と使用する言語を設定
project(test_cmake C)
#build
add_executable(test main.c)
```
```C:main.c
#include <stdio.h>

void main(void){
	printf("hello world.");
	printf("this is sample.");
}
```
#### CMake実行
CMakeLists.txtの階層にbuildディレクトリを作成し、build実行する。下記でbuildされ、結果はbuildディレクトリに出力される。
```:コマンド
mkdir cmake 
cmake ..
cmake --build 

#Cleanする場合は
cmake --build . --target clean
```

#### CMake実行(Mingwの場合 windows環境)
WindowsでMingwを使う場合は下記コマンドで。WindowsでのCmake環境構築は下記参照。
 [WindowsでGoogleTestする備忘録](https://qiita.com/tapitapi/items/ba0daba1421ffbb0713b)。
```:コマンド
#./buildフォルダにmakefile作成
cmake -G "MinGW Makefiles" -B build .

#./buildフォルダでbuildを実行
cmake --build build
```



## **コマンド一覧**
|コマンド|概要|
|---|---|
|[cmake_minimum_required](#cmake_minimum_required)|最小バージョンを指定する。|
|[project](#project)|プロジェクトを指定する。|
|[add_executable](#add_executable)|ビルド|
|[add_subdirectory](#add_subdirectory)|フォルダ追加|
|[include_directories](#include_directories)|インクルードパス追加|
|[link_directories](#link_directories)|ライブラリパス追加|
|[add_compile_definitions](#add_compile_definitions)|コンパイルオプション追加|
|[add_library](#add_library)|ライブラリ生成|
|[target_link_libraries](#target_link_libraries)|ライブラリリンク|
|[set](#set)|変数設定|
|[message](#message)|コンソール出力|
|[GDBオプション](#gdbオプション)|gcovの設定オプション。|
|[gcovの設定](#gcovの設定)|gcovの設定オプション。|


## **cmake_minimum_required**
CMakeの最小バージョンを指定する。
```CMake:CMakeLists.txt
# CMakeのバージョンを指定。下記例は最小バージョンは3.23
cmake_minimum_required(VERSION 3.23)
```
 [一覧へ戻る](#コマンド一覧)

## **project**
project(XXX CXX)
プロジェクト名　XXX。 C言語なら```C```　C++なら```CXX```。
```CMake:CMakeLists.txt
#Cなら
project(TEST_PROJECT C)
#C++なら
project(TEST_PROJECT CXX)
```
 [一覧へ戻る](#コマンド一覧)

## **add_executable**
add_executable(xxx yyy.c)
yyy.cをBUildして 実行ファイルxxx とする。
```CMake:CMakeLists.txt
#main.cをbuildして、 test.extとして出力する。
add_executable(test main.c)
```
 [一覧へ戻る](#コマンド一覧)

## **add_subdirectory**
add_subdirectory(xxx)
xxx フォルダのを追加。 CMakeLists.txt を実行
```CMake:CMakeLists.txt
#./folderA/folderBのパス追加
add_subdirectory(./folderA/folderB)
```
 [一覧へ戻る](#コマンド一覧)

## **include_directories**
include_directories(xxx)
xxx のインクルードパスを追加。
```CMake:CMakeLists.txt
#./folderA/folderBのパス追加
include_directories(./folderA/folderB)
```
 [一覧へ戻る](#コマンド一覧)

 ## **link_directories**
link_directories(xxx)
xxx ライブラリのパスを追加。
```CMake:CMakeLists.txt
#./libのパス追加
link_directories(./lib)
```
 [一覧へ戻る](#コマンド一覧)

## **add_compile_definitions**
add_compile_definitions(xxx)
コンパイル定義にxxxを追加
```CMake:CMakeLists.txt
# DEF_Aの定義を設定
add_compile_definitions(DEF_A)
```
 [一覧へ戻る](#コマンド一覧)
 
## **add_library**
add_library(lib xxx)
xxx からライブラリlibを生成する。
```CMake:CMakeLists.txt
#funcA.cからlib_aライブラリを生成
add_library(lib_a funcA.c)
#静的ライブラリの場合
add_library(lib_a STATIC　funcA.c)
```
 [一覧へ戻る](#コマンド一覧)

## **target_link_libraries**
target_link_libraries(xxx lib)
xxxへライブラリlibをリンクする。
```CMake:CMakeLists.txt
target_link_libraries(test lib_a lib_b)
```
 [一覧へ戻る](#コマンド一覧)


## **set**
set(xxx yyy)
xxxの変数にyyyを代入。変数は${xxx}で呼び出し。
```CMake:CMakeLists.txt
#./folderA/folderBのパスを変数FOLDER_PATHにする
set(FOLDER_PATH ./folderA/folderB)

#${FOLDER_PATH}のフォルダを追加
add_subdirectory(${FOLDER_PATH})
```
  [一覧へ戻る](#コマンド一覧)


## **message**
message("xxx")
xxx について、コンソール画面にメッセージとして出力する。
```CMake:CMakeLists.txt
message("cmakeを実行しました。")

#setしたデータを出力する。
set(FOLDER_PATH ./folderA/folderB)
message(${FOLDER_PATH})
```
 [一覧へ戻る](#コマンド一覧)


## **GDBオプション**
GDBを設定するオプション。
```CMake:CMakeLists.txt
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0")
```
 [一覧へ戻る](#コマンド一覧)


## **gcovの設定**
gcovのための作法。
```CMake:CMakeLists.txt
#実行ファイル testのgcov設定
target_compile_options(test PUBLIC -coverage)
target_link_options(test PUBLIC -coverage)
```
 [一覧へ戻る](#コマンド一覧)