M5UnitV2のUnitV2Frameworkをコンパイルする手順

## 目的
M5Stack UnitV2のGithubで公開されている、UnitV2に元々組み込まれているサンプルプログラム集「UnitV2 Framework」をクロスコンパイルして動かす手順です。

## PC環境
UnitV2 Frameworkをコンパイル手順に入る前に、Ubuntuをインストールした環境で、クロスコンパイル環境を構築しておきます。

[M5UnitV2のクロスコンパイル環境を構築する手順](https://qiita.com/nnn112358/items/9e15450265b689300216)

## はじめに
この記事を作成するにあたり、以下のmeganetaaan氏のUnitV2Frameworkを参考にさせて頂きました。
https://github.com/meganetaaan/UnitV2Framework

## UnitV2Frameworkのダウンロード

Githubから、UnitV2Frameworkをダウンロードします。

```
$ git clone https://github.com/m5stack/UnitV2Framework.git
```

## ncnnのヘッダファイル更新

m5stackのUnitV2Frameworkには、古いバージョンのncnnのヘッダファイルが入っているため、ncnnのヘッダファイルをクロスコンパイル環境の構築でインストールしたバージョンのもので上書きをします。

```
$ cd UnitV2Framework
$ cp -r ~/external/ncnn/install/x64/include/ncnn/include/
```

## CMakeLists.txt の編集

cmakeの設定ファイルを、クロスコンパイル環境の構築にあわせて編集します。

[meganetaaan氏のgithub](https://github.com/meganetaaan/UnitV2Framework)を参考に、
cmakeに、TARGET_COMPILERのオプションを設けて、
UnitV2(arm環境)のビルドとPC環境(x64環境)のビルドを両立するようにしています。

```
$ gedit CMakeLists.txt 
```

```CMakeLists.txt 
if(NOT CMAKE_BUILD_TYPE)
   SET(CMAKE_BUILD_TYPE Release)
   message(STATUS "CMAKE_BUILD_TYPE Release")
else()
   SET(CMAKE_BUILD_TYPE DEBUG)
   message(STATUS "CMAKE_BUILD_TYPE DEBUG")
endif()

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

if(TARGET_COMPILER STREQUAL "arm")
    message(STATUS "TARGET_COMPILE STREQUAL arm")
    SET(CMAKE_CXX_COMPILER arm-none-linux-gnueabihf-g++)
    SET(CMAKE_C_COMPILER arm-none-linux-gnueabihf-gcc)
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/arm/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/arm)
    SET(OpenCV_DIR /opt/external/opencv/build/arm)
else()
    message(STATUS "TARGET_COMPILE STREQUAL X64")
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/x64/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/x64/)
    SET(OpenCV_DIR /opt/external/opencv/build/x64) 
endif()


# project name
PROJECT(camera_capture)
# requirement of cmake version
cmake_minimum_required(VERSION 3.5)

# Enable C++11
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED TRUE)

# set the directory of executable files
if(TARGET_COMPILER STREQUAL "x64")
    message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY X64")
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin/x64)
else()
    message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY arm")
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin/arm)
endif()

SET(Target ${TARGET})

# find required opencv
find_package(OpenCV REQUIRED)
find_package(Threads REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})

# name of executable file and path of source file
add_executable(${Target} main/${Target}.cpp)

# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})

# includes
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/ncnn)

# opencv libraries
target_link_libraries(${Target} ${OpenCV_LIBRARIES})
target_link_libraries(${Target} ${NCNN_INSTALL_DIR}/libncnn.a -fopenmp)

# .so link
target_link_libraries(${Target} ${ZBAR_INSTALL_DIR}/lib/libzbar.so)

FILE(GLOB_RECURSE PRJ_SRC
        "${PROJECT_SOURCE_DIR}/src/*.c"
        "${PROJECT_SOURCE_DIR}/src/*.cpp"
        )

add_library(mainlib ${PRJ_SRC})
target_link_libraries(mainlib ${OpenCV_LIBRARIES})
target_link_libraries(mainlib ${NCNN_INSTALL_DIR}/libncnn.a -fopenmp)

target_link_libraries(${Target} mainlib)
```



## UnitV2Frameworkをコンパイルする

UnitV2(arm環境)で動く「camera_capture」のサンプルをビルドする場合は以下のコマンドで実施します。

```
$ cmake -B build/arm -DTARGET_COMPILE=arm -DTARGET=camera_capture .
$ cmake --build build/arm
```

PC環境(x64環境)で動く「camera_capture」のサンプルをビルドする場合は以下のコマンドで実施します。

```
$ cmake -B build/x64 -DTARGET_COMPILE=x64 -DTARGET=camera_capture .
$ cmake --build build/x64
```

## 参考資料
- [M5 UnitV2 ドキュメント](https://docs.m5stack.com/en/unit/unitv2?id=description)
- [GitHub:m5stack/UnitV2Framework](https://github.com/m5stack/UnitV2Framework)
- [GitHub:meganetaaan/UnitV2Framework](https://github.com/meganetaaan/UnitV2Framework)
- [RT Humanoid Robot Blog / M5Stack UnitV2用クロスコンパイル環境の構築：ししかわの二足ロボ研修 Part.5](https://rt-net.jp/humanoid/archives/3955)
- [RT Humanoid Robot Blog /M5Stack UnitV2Frameworkをビルドする：ししかわの二足ロボ研修 Part.6](https://rt-net.jp/humanoid/archives/3962)