Imported Upstream version 1.25.0
[platform/core/ml/nnfw.git] / onert-micro / CMakeLists.txt
1 set(ARM_C_COMPILER "arm-none-eabi-gcc")
2 set(ARM_ASM_COMPILER "arm-none-eabi-gcc")
3 set(ARM_CXX_COMPILER "arm-none-eabi-g++")
4 set(ARM_OBJCOPY "arm-none-eabi-objcopy")
5
6 find_program(ARM_C_COMPILER_PATH ${ARM_C_COMPILER})
7
8 if (NOT ARM_C_COMPILER_PATH)
9     message(STATUS "Build luci-micro: FALSE(ARM compiler is NOT FOUND)")
10 endif ()
11
12 if (NOT_BUILD_EXTERNALS)
13     message(STATUS "USE LOCAL EXTERNAL")
14
15     set(ONERT_MICRO_EXTERNAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/externals")
16     set(Flatbuffers_DIR "${ONERT_MICRO_EXTERNAL_DIR}")
17     set(FlatBuffersSource_DIR "${Flatbuffers_DIR}")
18     set (EXT_OVERLAY_DIR "${ONERT_MICRO_EXTERNAL_DIR}")
19     set(GENERATED_INCLUDE_DIR "${ONERT_MICRO_EXTERNAL_DIR}/gen")
20
21     add_subdirectory(externals)
22 else()
23     message(STATUS "DOWNLOAD AND BUILD EXTERNALS")
24
25     nnas_find_package(FlatBuffers EXACT 2.0 QUIET)
26
27     if (NOT FlatBuffers_FOUND)
28         message(STATUS "Build luci-micro: FALSE(FlatBuffers 2.0 NOT FOUND)")
29         return()
30     endif (NOT FlatBuffers_FOUND)
31
32     message(STATUS "Build luci-micro: TRUE")
33
34     set(SCHEMA_FILE "${NNAS_PROJECT_SOURCE_DIR}/res/CircleSchema/0.4/circle_schema.fbs")
35
36     # NOTE Copy circle_schema.fbs as schema.fbs to generate "schema_generated.fbs" instead of "circle_schema_generated.fbs"
37     add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/schema.fbs"
38             COMMAND ${CMAKE_COMMAND} -E copy "${SCHEMA_FILE}" schema.fbs
39             WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
40             DEPENDS "${SCHEMA_FILE}"
41             )
42
43     FlatBuffers_Target(luci_micro_circle_schema
44             OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/gen/circle-generated/circle"
45             INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/gen"
46             SCHEMA_DIR "${CMAKE_CURRENT_BINARY_DIR}"
47             SCHEMA_FILES "schema.fbs"
48             )
49     set(Flatbuffers_DIR "${CMAKE_CURRENT_BINARY_DIR}/../../overlay/lib/cmake/flatbuffers")
50     set (EXT_OVERLAY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../../overlay")
51     set(GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/gen")
52 endif()
53
54 set(LUCI_INTERPRETER_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/include")
55 add_subdirectory(luci-interpreter/src/core/reader)
56
57 # Choosing Kernel: reference mcu, optimized cmsisnn, optimized linux
58 if (NOT KERNELS)
59     message(STATUS "KERNEL variable is not defined, default reference mcu kernels will be used")
60     set(LUCI_INTERPRETER_PAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/pal/mcu")
61 elseif("${KERNELS}" STREQUAL "mcu")
62     message(STATUS "ONERT_MICRO will use reference mcu kernels")
63     set(LUCI_INTERPRETER_PAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/pal/mcu")
64 elseif("${KERNELS}" STREQUAL "cmsisnn")
65     message(STATUS "ONERT_MICRO will use optimized cmsisnn kernels")
66     set(LUCI_INTERPRETER_PAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/pal/cmsisnn")
67 elseif("${KERNELS}" STREQUAL "linux")
68     message(STATUS "ONERT_MICRO will use optimized linux kernels")
69     set(LUCI_INTERPRETER_PAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/pal/linux")
70 else()
71     message(STATUS "Build onert-micro: FAILED (Non-existent kernel variable. Choose one of the following options: mcu, cmsisnn, linux)")
72     return()
73 endif()
74
75 if (USE_STATIC_ALLOC)
76     # TODO: enable it
77     message(STATUS "FAILED ONERT-MICRO is not support Static Memory Manager now")
78     return()
79 else()
80     message(STATUS "USE_STATIC_ALLOC variable is not defined, default dynamic memory manager will be used")
81 endif()
82
83 set(CMAKE_ARM_OPTIONS
84         -DLUCI_INTERPRETER_STATIC=ON
85         -DLUCI_STATIC=ON
86         -DBUILD_CMSIS_NN_FUNCTIONS=ON
87         -DTARGET_CPU=${TARGET_CPU}
88         -DTARGET_ARCH=${TARGET_ARCH}
89         "-DEXT_OVERLAY_DIR=${EXT_OVERLAY_DIR}"
90         "-DFlatbuffers_DIR=${Flatbuffers_DIR}"
91         "-DFlatBuffersSource_DIR=${FlatBuffersSource_DIR}"
92         "-DCMAKE_TOOLCHAIN_FILE=${NNAS_PROJECT_SOURCE_DIR}/infra/onert-micro/cmake/buildtool/config/arm-none-eabi-gcc.cmake"
93         "-DLUCI_INTERPRETER_PAL_DIR=${LUCI_INTERPRETER_PAL_DIR}"
94         "-DNNAS_PROJECT_SOURCE_DIR=${NNAS_PROJECT_SOURCE_DIR}"
95         "-DNNAS_EXTERNALS_DIR=${NNAS_EXTERNALS_DIR}"
96         -DC_COMPILER=${ARM_C_COMPILER}
97         -DCXX_COMPILER=${ARM_CXX_COMPILER}
98         -DASM_COMPILER=${ARM_ASM_COMPILER}
99         -DOBJCOPY=${ARM_OBJCOPY}
100         -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
101         -DENABLE_TEST=OFF
102         -DBUILD_GTEST=OFF
103         "-DNNAS_ROOT=${NNAS_PROJECT_SOURCE_DIR}"
104         -DENABLE_STRICT_BUILD=OFF
105         "-DGENERATED_INCLUDE_DIR=${GENERATED_INCLUDE_DIR}"
106         )
107
108 if (GENERATE_KERNELS_LIST_FROM)
109     set(GENERATED_KERNELS_LIST_PATH "${LUCI_INTERPRETER_PAL_DIR}/GeneratedKernelsToBuild.lst")
110     list(APPEND CMAKE_ARM_OPTIONS "-DLUCI_INTERPRETER_KERNELS_BUILD_LIST=${GENERATED_KERNELS_LIST_PATH}")
111 endif ()
112
113 if (NOT_BUILD_EXTERNALS)
114     list(APPEND CMAKE_ARM_OPTIONS "-DNOT_BUILD_EXTERNALS=ON")
115 else()
116     list(APPEND CMAKE_ARM_OPTIONS "-DNOT_BUILD_EXTERNALS=OFF")
117 endif ()
118
119 if (ENABLE_ONERT_MICRO_TEST)
120     message(STATUS "Enable tests")
121     list(APPEND CMAKE_ARM_OPTIONS "-DENABLE_TEST=ON")
122 endif ()
123
124 if (DIS_QUANT)
125     message(STATUS "ONERT-MICRO will not use part for QUANTIZED models")
126     add_definitions(-DDIS_QUANT)
127     list(APPEND CMAKE_ARM_OPTIONS "-DDIS_QUANT=ON")
128 endif()
129
130 if (DIS_FLOAT)
131     message(STATUS "ONERT-MICRO will not use part for FLOAT models")
132     add_definitions(-DDIS_FLOAT)
133     list(APPEND CMAKE_ARM_OPTIONS "-DDIS_FLOAT=ON")
134 endif()
135
136 if (DIS_DYN_SHAPES)
137     message(STATUS "ONERT-MICRO will not use dynamic shapes")
138     add_definitions(-DDIS_DYN_SHAPES)
139 endif()
140
141 set(MICRO_ARM_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/standalone_arm")
142 file(MAKE_DIRECTORY "${MICRO_ARM_BUILD_DIR}")
143
144 set(MICRO_ARM_BUILD_DEPENDENCY "${MICRO_ARM_BUILD_DIR}/CMakeCache.txt")
145
146 add_custom_command(
147         OUTPUT "${MICRO_ARM_BUILD_DEPENDENCY}"
148         COMMAND "${CMAKE_COMMAND}" "${CMAKE_CURRENT_SOURCE_DIR}/standalone" ${CMAKE_ARM_OPTIONS}
149         WORKING_DIRECTORY "${MICRO_ARM_BUILD_DIR}"
150         DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/standalone/CMakeLists.txt"
151         VERBATIM
152 )
153
154 add_custom_target(luci_interpreter_micro_arm_cmake DEPENDS "${MICRO_ARM_BUILD_DEPENDENCY}")
155
156 # Generate KernelsToBuild list from circle model
157 if (GENERATE_KERNELS_LIST_FROM)
158     add_executable(generator_kernels_list_exec helpers/GenerateKernelsListHelper.cpp)
159
160     target_link_libraries(generator_kernels_list_exec luci_micro_circle_reader)
161     target_link_libraries(generator_kernels_list_exec luci_micro_circle_schema)
162
163     target_include_directories(generator_kernels_list_exec PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/luci-interpreter/include")
164
165     add_custom_target(
166             generate_kernels_list ALL
167             COMMAND generator_kernels_list_exec ${GENERATE_KERNELS_LIST_FROM} ${GENERATED_KERNELS_LIST_PATH}
168             COMMENT "Generating KernelsToBuild list"
169     )
170     add_dependencies(generate_kernels_list luci_micro_circle_reader)
171     add_dependencies(luci_interpreter_micro_arm_cmake generate_kernels_list)
172
173 endif ()
174
175 # To remove GENERATE_KERNELS_LIST_FROM and KERNELS variable from cmake cache
176 unset(GENERATE_KERNELS_LIST_FROM CACHE)
177 unset(KERNELS CACHE)
178 unset(USE_STATIC_KERNEL CACHE)
179 unset(DIS_QUANT CACHE)
180 unset(DIS_FLOAT CACHE)
181 unset(ENABLE_ONERT_MICRO_TEST CACHE)
182 unset(NOT_BUILD_EXTERNALS CACHE)
183
184 set(MICRO_ARM_BINARY "${MICRO_ARM_BUILD_DIR}/luci-interpreter/src/libluci_interpreter_micro.a")
185
186 add_custom_command(
187         OUTPUT "${MICRO_ARM_BINARY}"
188         COMMAND "${CMAKE_MAKE_PROGRAM}" luci_interpreter_micro -j ${CPU_COUNT}
189         WORKING_DIRECTORY "${MICRO_ARM_BUILD_DIR}"
190         DEPENDS luci_interpreter_micro_arm_cmake luci_micro_circle_schema
191         VERBATIM
192 )
193
194 add_custom_target(luci_interpreter_micro_arm DEPENDS "${MICRO_ARM_BINARY}")
195
196 add_subdirectory(eval-driver)
197
198 if (NOT DEFINED BUILD_TEST)
199     return()
200 endif ()
201
202 #MBED OS QEMU build
203 nnas_find_package(MbedOSSource EXACT 6.15 QUIET)
204
205 if (NOT MbedOSSource_FOUND)
206     message(STATUS "Skipping luci-micro: MbedOSSource not found")
207     return()
208 endif ()
209
210 set(MBED_OS_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/tests/mbed-os")
211 file(MAKE_DIRECTORY "${MBED_OS_BUILD_DIR}")
212
213 set(MBED_OS_BUILD_DEPENDENCY "${MBED_OS_BUILD_DIR}/CMakeCache.txt")
214
215 set(ONERTMICRO_SRC_DIR "${NNAS_PROJECT_SOURCE_DIR}/onert-micro")
216
217 add_custom_command(
218         OUTPUT "${MBED_OS_BUILD_DEPENDENCY}"
219         COMMAND "${CMAKE_COMMAND}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/mbed-os"
220         -DMICRO_ARM_BUILD_DIR=${MICRO_ARM_BUILD_DIR}
221         -DMbedOSSource_DIR=${MbedOSSource_DIR}
222         -DFlatBuffersSource_DIR=${FlatBuffersSource_DIR}
223         -DONERTMICRO_SRC_DIR=${ONERTMICRO_SRC_DIR}
224         WORKING_DIRECTORY "${MBED_OS_BUILD_DIR}"
225         DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/tests/mbed-os/CMakeLists.txt"
226         VERBATIM
227 )
228
229 add_custom_target(mbed_os_cmake DEPENDS "${MBED_OS_BUILD_DEPENDENCY}")
230
231 set(MBED_OS_BINARY "${MBED_OS_BUILD_DIR}/libmbed_os.a")
232
233 add_custom_command(
234         OUTPUT "${MBED_OS_BINARY}"
235         COMMAND "${CMAKE_MAKE_PROGRAM}" mbed_os -j ${CPU_COUNT}
236         WORKING_DIRECTORY "${MBED_OS_BUILD_DIR}"
237         DEPENDS mbed_os_cmake
238         VERBATIM
239 )
240
241 add_custom_target(mbed_os_arm DEPENDS "${MBED_OS_BINARY}")
242
243 set(BUILD_TEST_BINARY "${MBED_OS_BUILD_DIR}/build_test.bin")
244
245 add_custom_command(
246         OUTPUT "${BUILD_TEST_BINARY}"
247         COMMAND "${CMAKE_MAKE_PROGRAM}" build_test -j ${CPU_COUNT}
248         WORKING_DIRECTORY "${MBED_OS_BUILD_DIR}"
249         DEPENDS mbed_os_arm "${CMAKE_CURRENT_SOURCE_DIR}/tests/mbed-os/main.cpp" ${MICRO_ARM_BINARY}
250         VERBATIM
251 )
252 add_custom_target(onert_micro_build_test_arm DEPENDS "${BUILD_TEST_BINARY}")