CMakeを使って、FreeRTOS最小構成のVisualStudioプロジェクト作る

# 概要
[Windows上でFreeRTOSを動かす](https://qiita.com/azuki_bar/items/3c4983bf4bf6262724cc)
は提供されているサンプルプロジェクトの実行のみでした。

実際の開発では異なる開発環境や複数人開発、またビルド環境の管理に対応することが必要になると思います。
この記事ではCMakeでFreeRTOSのVisual Studioプロジェクトを構築します。

# この記事で説明するコード
https://github.com/azukibar0713/cmake_freertos_visualstudio/tree/de57ef75f443646310990f4654d87b3b470c648a

# 手順
## FreeRTOS
### ダウンロード
https://freertos.org/a00104.html
### 必要なファイルを選ぶ
FreeRTOS各ポート（コンパイラ、アーキテクチャの組み合わせ）のコードがすべて含まれています。
ここからWindows Visual Studio環境に必要なファイルだけ取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/8aa07499-eb49-ce71-7351-64c3836dc4b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/d45838f7-ec18-21c7-11b2-4b850eb20b2b.png)

FreeRTOS/Source直下にあるファイル、FreeRTOS/include以下のファイルがカーネルコアとなる部分で、どのポートでも必要なファイルになります。
FreeRTOS/portable/以下がポートごとのファイルになります
　MemMangはheap管理用で必要
　MSVC-MingWはVisualStudio用で必要
となります。

これら必要のファイルのみ自身のプロジェクトに取り込みます。

## アプリケーションコード
自身で開発するアプリケーションコードをいれます。
Github Repositoryにはチュートリアルのサンプルコードを入れてあります。

全体のツリー構成は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/c824fd49-c541-0b62-ebfe-61939e24083f.png)
となっています。

## CMake
### 基本的な使い方
日本語の記事がいろいろとあるので参照してください。
https://qiita.com/shohirose/items/45fb49c6b429e8b204ac
とか良いです。

### 今回用のCMakeLists.txt

```cmake
# ----------------------------
# 必要な最小バージョンを指定
# ----------------------------
cmake_minimum_required(VERSION 3.1).

# ----------------------------
# プロジェクト名, 言語(C言語)を指定.
# ----------------------------
project(freertos_project C)

# ----------------------------
# include directory
#   Makefile の -include 命令や，コンパイラでの -I オプションは include_directories で代用.
# ----------------------------
include_directories(./src)
include_directories(./src/Supporting_Functions)
include_directories(./FreeRTOS/Source/include)
include_directories(./FreeRTOS/Source/portable/MemMang)
include_directories(./FreeRTOS/Source/portable/MSVC-MingW)

# ----------------------------
# コンパイル対象のソース一覧を作成
#   - 指定されたGLOBパターン<globbing_expressions>にマッチするファイルを探索し、その一覧をリストとして変数<variable>に格納します。
#     このとき絶対パスで格納されますが、RELATIVE <path>が指定されていると、このパスからの相対パスとなります。
#   - 以下の正規表現のメタ文字に似たものが使えます。
#       - 任意の文字の0回以上の繰り返し*
#       - 任意の文字?
#       - ブラケット内で指定された文字[ ]とその範囲
# フォーマット
#   file(WRITE <filename> [<content1> ...])
#   file(APPEND <filename> [<content1> ...])
# filenameがVCだとプロジェクト名になるみたい.
# ----------------------------
file(GLOB freertos_files FreeRTOS/Source/*.[ch] FreeRTOS/Source/portable/MSVC-MingW/*.[ch] FreeRTOS/Source/portable/MemMang/*.[ch])
file(GLOB src_files src/*.[ch] src/Supporting_Functions/*.[ch])

# ----------------------------
# オブジェクトファイルを作るソースを指定
# ----------------------------
add_library(freertos OBJECT ${freertos_files})
add_library(src OBJECT ${src_files})

# ----------------------------
# VisualStudioのFilterを作るようにする.
# ----------------------------
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# ----------------------------
# 実行ファイルを作る方法を指定
# ----------------------------
add_executable(${PROJECT_NAME}
 $<TARGET_OBJECTS:freertos>
 $<TARGET_OBJECTS:src>
)
```

### CMakeの実行
#### buildディレクトリで cmake .. します。

```shell
PS F:\git-work\cmake_freertos_visualstudio\build> cmake ..
-- The C compiler identification is MSVC 19.27.29110.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: F:/git-work/cmake_freertos_visualstudio/build
```
  ※Shift押しながら右クリックでPowerShellを開けるので便利です

#### VisualStudio立ち上げる
ここまでくるとbuildディレクトリ内は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/e712886d-4226-1b7f-7baa-2c33033ac1e1.png)
となっているので、freertos_project.slnをダブルクリックしましょう。
あとはスタートアッププロジェクトを設定すれば実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/40c22fcc-efae-a38c-034c-9ba4adadcff9.png)

build以下はGit Repository管理ではなく、CMakeから作成するので管理も楽ですし、配布もしやすいですね。