blob: dd20e15076c4649a45303772e61220f3e8b0f25a [file] [log] [blame]
Pavel Macenauer59e057f2020-04-15 14:17:26 +00001#
Cathal Corbett9c9d5b92022-08-17 17:30:16 +01002# Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
Pavel Macenauer59e057f2020-04-15 14:17:26 +00003# Copyright 2020 NXP
4# SPDX-License-Identifier: MIT
5#
Jim Flynn870b96c2022-03-25 21:24:56 +00006
telsoa01c577f2c2018-08-31 09:22:23 +01007option(BUILD_ONNX_PARSER "Build Onnx parser" OFF)
telsoa014fcda012018-03-09 14:13:49 +00008option(BUILD_UNIT_TESTS "Build unit tests" ON)
9option(BUILD_TESTS "Build test applications" OFF)
10option(BUILD_FOR_COVERAGE "Use no optimization and output .gcno and .gcda files" OFF)
11option(ARMCOMPUTENEON "Build with ARM Compute NEON support" OFF)
12option(ARMCOMPUTECL "Build with ARM Compute OpenCL support" OFF)
Matteo Martincighf88663c2019-08-28 16:38:53 +010013option(ARMNNREF "Build with ArmNN reference support" ON)
Matthew Sloyand646b552022-10-10 12:42:16 +010014option(ARMNNTOSAREF "Build with TOSA reference support" OFF)
telsoa014fcda012018-03-09 14:13:49 +000015option(PROFILING_BACKEND_STREAMLINE "Forward the armNN profiling events to DS-5/Streamline as annotations" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010016# options used for heap profiling and leak checking
surmeh013537c2c2018-05-18 16:31:43 +010017option(HEAP_PROFILING "Build with heap profiling enabled" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010018option(LEAK_CHECKING "Build with leak checking enabled" OFF)
surmeh013537c2c2018-05-18 16:31:43 +010019option(GPERFTOOLS_ROOT "Location where the gperftools 'include' and 'lib' folders to be found" Off)
telsoa01c577f2c2018-08-31 09:22:23 +010020# options used for tensorflow lite support
21option(BUILD_TF_LITE_PARSER "Build Tensorflow Lite parser" OFF)
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +000022option(BUILD_ARMNN_SERIALIZER "Build Armnn Serializer" OFF)
Éanna Ó Catháina563b922019-05-09 11:34:06 +010023option(BUILD_ACCURACY_TOOL "Build Accuracy Tool" OFF)
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +000024option(FLATC_DIR "Path to Flatbuffers compiler" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010025option(TF_LITE_GENERATED_PATH "Tensorflow lite generated C++ schema location" OFF)
26option(FLATBUFFERS_ROOT "Location where the flatbuffers 'include' and 'lib' folders to be found" Off)
Matthew Sloyand646b552022-10-10 12:42:16 +010027option(TOSA_SERIALIZATION_LIB_ROOT "Location where the TOSA Serialization Library 'include' and 'lib' folders can be found" OFF)
28option(TOSA_REFERENCE_MODEL_ROOT "Location where the TOSA Reference Model 'include' and 'lib' folders can be found" OFF)
Matthew Sloyan67fd5262022-12-07 19:28:18 +000029option(TOSA_REFERENCE_MODEL_OUTPUT "TOSA Reference Model output is printed during layer support checks" ON)
Matteo Martincighe7d44982019-08-05 12:16:47 +010030option(DYNAMIC_BACKEND_PATHS "Colon seperated list of paths where to load the dynamic backends from" "")
Colm Donelan0dbe00a2020-06-03 08:00:28 +010031option(SAMPLE_DYNAMIC_BACKEND "Include the sample dynamic backend and its tests in the build" OFF)
Colm Donelana21620d2019-10-11 13:09:49 +010032option(BUILD_GATORD_MOCK "Build the Gatord simulator for external profiling testing." ON)
Sadik Armagan6f86b692020-03-09 11:04:32 +000033option(BUILD_TIMELINE_DECODER "Build the Timeline Decoder for external profiling." ON)
Finn Williams2ed809c2020-04-20 21:21:07 +010034option(BUILD_BASE_PIPE_SERVER "Build the server to handle external profiling pipe traffic" ON)
Pavel Macenauer59e057f2020-04-15 14:17:26 +000035option(BUILD_PYTHON_WHL "Build Python wheel package" OFF)
36option(BUILD_PYTHON_SRC "Build Python source package" OFF)
Jim Flynnbbfe6032020-07-20 16:57:44 +010037option(BUILD_STATIC_PIPE_LIBS "Build Static PIPE libraries" OFF)
38option(BUILD_PIPE_ONLY "Build the PIPE libraries only" OFF)
Sadik Armagan5d03e312020-11-17 16:43:56 +000039option(BUILD_ARMNN_TFLITE_DELEGATE "Build the Arm NN TfLite delegate" OFF)
Jim Flynne1fdd282021-10-26 21:26:10 +010040option(BUILD_MEMORY_STRATEGY_BENCHMARK "Build the MemoryBenchmark" OFF)
Jim Flynn870b96c2022-03-25 21:24:56 +000041option(BUILD_BARE_METAL "Disable features requiring operating system support" OFF)
Jan Eilersa96489a2021-12-08 10:05:47 +000042option(BUILD_SHARED_LIBS "Determines if Armnn will be built statically or dynamically.
43 This is an experimental feature and not fully supported.
44 Only the ArmNN core and the Delegate can be built statically." ON)
telsoa014fcda012018-03-09 14:13:49 +000045
46include(SelectLibraryConfigurations)
47
48set(COMPILER_IS_GNU_LIKE 0)
Jim Flynn82262f52020-07-16 11:23:45 +010049if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
50 ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
51 ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
telsoa014fcda012018-03-09 14:13:49 +000052 set(COMPILER_IS_GNU_LIKE 1)
53endif()
54
55# Enable CCache if available and not disabled
56option(USE_CCACHE "USE_CCACHE" ON)
57find_program(CCACHE_FOUND ccache)
58if(CCACHE_FOUND AND USE_CCACHE)
59 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
60 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "CCACHE_CPP2=yes ${rule_launch_compile} ccache")
61endif()
62
63# Enable distcc if available and not disabled
64option(USE_DISTCC "USE_DISTCC" OFF)
65find_program(DISTCC_FOUND distcc)
66if(DISTCC_FOUND AND USE_DISTCC)
67 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
68 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "${rule_launch_compile} distcc")
69endif()
70
71# Set to release configuration by default
72if(NOT CMAKE_BUILD_TYPE)
73 set(CMAKE_BUILD_TYPE "Release")
74endif()
75
76# Compiler flags that are always set
77set(CMAKE_POSITION_INDEPENDENT_CODE ON)
78if(COMPILER_IS_GNU_LIKE)
Derek Lambertiba25aee2019-12-10 22:20:54 +000079 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -Werror -Wold-style-cast -Wno-missing-braces -Wconversion -Wsign-conversion")
Finn Williams3d626142021-08-11 13:04:32 +010080 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
81 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
82 endif()
telsoa014fcda012018-03-09 14:13:49 +000083elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Jim Flynn870b96c2022-03-25 21:24:56 +000084 # Disable C4996 (use of deprecated identifier) due to
85 # https://developercommunity.visualstudio.com/content/problem/252574/deprecated-compilation-warning-for-virtual-overrid.html
Rob Hughesfc6bf052019-12-16 17:10:51 +000086 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /wd4996")
Rob Hughesbc873d22020-05-20 13:11:37 +010087 add_definitions(-DNO_STRICT=1)
telsoa014fcda012018-03-09 14:13:49 +000088endif()
89if("${CMAKE_SYSTEM_NAME}" STREQUAL Android)
Keith Davisb8942bf2021-05-31 11:22:35 +010090 # -lz is necessary for when building with ACL set with compressed kernels
91 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -llog -lz")
92 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog -lz")
telsoa014fcda012018-03-09 14:13:49 +000093endif()
94
95# Compiler flags for Release builds
Matthew Benthame30054f2019-06-24 13:10:54 +010096set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
telsoa014fcda012018-03-09 14:13:49 +000097if(COMPILER_IS_GNU_LIKE)
98 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
99elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
100 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2")
101endif()
102
103# Compiler flags for Debug builds
104if(COMPILER_IS_GNU_LIKE)
Matthew Benthame30054f2019-06-24 13:10:54 +0100105 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
telsoa014fcda012018-03-09 14:13:49 +0000106elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Matthew Benthame30054f2019-06-24 13:10:54 +0100107 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI /Od")
telsoa014fcda012018-03-09 14:13:49 +0000108 # Disable SAFESEH which is necessary for Edit and Continue to work
109 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
110 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
111endif()
112
113# Modify RelWithDebInfo so that NDEBUG isn't defined.
114# This enables asserts.
115if (COMPILER_IS_GNU_LIKE)
116 string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
117elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
118 string(REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
119endif()
120
121# Compiler flags for code coverage measurements
122if(BUILD_FOR_COVERAGE)
123 if(NOT CMAKE_BUILD_TYPE EQUAL "Debug")
124 message(WARNING "BUILD_FOR_COVERAGE set so forcing to Debug build")
125 set(CMAKE_BUILD_TYPE "Debug")
126 endif()
127
128 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
129 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
130endif()
131
132if(BUILD_FOR_COVERAGE AND NOT BUILD_UNIT_TESTS)
133 message(WARNING "BUILD_FOR_COVERAGE set but not BUILD_UNIT_TESTS, so code coverage will not be able to run")
134endif()
135
136set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
137
Derek Lambertieac4adb2020-08-25 13:05:59 +0100138include(CMakeFindDependencyMacro)
139
Jim Flynnbbfe6032020-07-20 16:57:44 +0100140if (NOT BUILD_PIPE_ONLY)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100141 # cxxopts (Alternative to boost::program_options)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200142 find_path(CXXOPTS_INCLUDE cxxopts/cxxopts.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100143 include_directories(SYSTEM "${CXXOPTS_INCLUDE}")
144endif()
Jan Eilers7e989832020-06-19 11:47:21 +0100145
Jim Flynnbbfe6032020-07-20 16:57:44 +0100146if (NOT BUILD_PIPE_ONLY)
147 # ghc (Alternative to boost::filesystem)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200148 find_path(GHC_INCLUDE ghc/filesystem.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100149 include_directories(SYSTEM "${GHC_INCLUDE}")
150endif()
Jan Eilers307fd342020-06-23 14:16:04 +0100151
telsoa014fcda012018-03-09 14:13:49 +0000152# pthread
Jim Flynn870b96c2022-03-25 21:24:56 +0000153if (NOT BUILD_BARE_METAL)
154find_package(Threads)
155endif()
telsoa014fcda012018-03-09 14:13:49 +0000156
157# Favour the protobuf passed on command line
Nikhil Raj5d955cf2021-04-19 16:59:48 +0100158if(BUILD_ONNX_PARSER)
telsoa014fcda012018-03-09 14:13:49 +0000159 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd"
160 PATHS ${PROTOBUF_ROOT}/lib
161 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
162 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd")
163
164 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf"
165 PATHS ${PROTOBUF_ROOT}/lib
166 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
167 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf")
168
169 select_library_configurations(PROTOBUF)
170
171 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h"
172 PATHS ${PROTOBUF_ROOT}/include
173 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
174 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h")
175
176 include_directories(SYSTEM "${PROTOBUF_INCLUDE_DIRS}")
177 add_definitions(-DPROTOBUF_USE_DLLS)
telsoa014fcda012018-03-09 14:13:49 +0000178
telsoa01c577f2c2018-08-31 09:22:23 +0100179 add_definitions(-DARMNN_ONNX_PARSER)
180
181 find_path(ONNX_GENERATED_SOURCES "onnx/onnx.pb.cc")
182
183 # C++ headers generated for onnx protobufs
184 include_directories(SYSTEM "${ONNX_GENERATED_SOURCES}")
185endif()
186
Sadik Armagan5d03e312020-11-17 16:43:56 +0000187if(BUILD_ARMNN_TFLITE_DELEGATE)
188 add_definitions(-DARMNN_TFLITE_DELEGATE)
189endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100190# Flatbuffers support for TF Lite, Armnn Serializer or the TOSA backend.
191if(BUILD_TF_LITE_PARSER OR BUILD_ARMNN_SERIALIZER OR ARMNNTOSAREF)
telsoa01c577f2c2018-08-31 09:22:23 +0100192 # verify we have a valid flatbuffers include path
193 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
194 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
195
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000196 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
telsoa01c577f2c2018-08-31 09:22:23 +0100197
198 find_library(FLATBUFFERS_LIBRARY
199 NAMES libflatbuffers.a flatbuffers
200 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
201
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000202 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000203endif()
204
205# Flatbuffers schema support for TF Lite
206if(BUILD_TF_LITE_PARSER)
207 find_path(TF_LITE_SCHEMA_INCLUDE_PATH
208 schema_generated.h
209 HINTS ${TF_LITE_GENERATED_PATH})
210
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000211 message(STATUS "Tf Lite generated header found at: ${TF_LITE_SCHEMA_INCLUDE_PATH}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000212
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000213 add_definitions(-DARMNN_TF_LITE_PARSER)
telsoa01c577f2c2018-08-31 09:22:23 +0100214endif()
215
Kevin May43a799c2019-02-08 16:31:42 +0000216if(BUILD_ARMNN_SERIALIZER)
Kevin May43a799c2019-02-08 16:31:42 +0000217 add_definitions(-DARMNN_SERIALIZER)
Matthew Bentham268509a2019-02-25 13:58:24 +0000218 add_definitions(-DARMNN_SERIALIZER_SCHEMA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/src/armnnSerializer/ArmnnSchema.fbs")
Kevin May43a799c2019-02-08 16:31:42 +0000219endif()
220
telsoa014fcda012018-03-09 14:13:49 +0000221include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Sadik Armagana97a0be2020-03-03 10:44:56 +0000222include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling)
telsoa014fcda012018-03-09 14:13:49 +0000223
224# ARM Compute
225# Note that ARM Compute has a different folder layout depending on the branch but also on
226# whether it comes from a prepackaged archive (this is why we add several hints below)
227if(ARMCOMPUTENEON OR ARMCOMPUTECL)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000228 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h
telsoa014fcda012018-03-09 14:13:49 +0000229 PATHS ${ARMCOMPUTE_ROOT}/include
230 PATHS ${ARMCOMPUTE_ROOT}/applications/arm_compute
231 PATHS ${ARMCOMPUTE_ROOT}
232 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000233 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h)
telsoa014fcda012018-03-09 14:13:49 +0000234 include_directories(SYSTEM "${ARMCOMPUTE_INCLUDE}")
235
236 # Find the Arm Compute libraries if not already specified (the user may have already defined this in advance,
237 # e.g. if building clframework as a dependent cmake project)
238 if (NOT DEFINED ARMCOMPUTE_LIBRARIES)
239 # We link to the static variant so that customers don't need to find and build a compatible version of clframework.
240 # First try the folders specified ARMCOMPUTE_BUILD_DIR (with PATH_SUFFIXES for
241 # Windows builds)
Matthew Bentham2624dd72020-05-20 10:44:18 +0100242 if ((NOT DEFINED ARMCOMPUTE_BUILD_DIR) AND (DEFINED ARMCOMPUTE_ROOT))
243 # Default build directory for ComputeLibrary is under the root
244 set(ARMCOMPUTE_BUILD_DIR ${ARMCOMPUTE_ROOT}/build)
245 endif()
246
telsoa014fcda012018-03-09 14:13:49 +0000247 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static
248 PATHS ${ARMCOMPUTE_BUILD_DIR}
249 PATH_SUFFIXES "Debug"
250 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
251 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static
252 PATHS ${ARMCOMPUTE_BUILD_DIR}
253 PATH_SUFFIXES "Release"
254 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
255 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static
256 PATHS ${ARMCOMPUTE_BUILD_DIR}
257 PATH_SUFFIXES "Debug"
258 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
259 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static
260 PATHS ${ARMCOMPUTE_BUILD_DIR}
261 PATH_SUFFIXES "Release"
262 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
263
264 # In case it wasn't there, try a default search (will work in cases where
265 # the library has been installed into a standard location)
266 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static)
267 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static)
268 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static)
269 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static)
270
Matthew Bentham6445cff2020-03-10 11:13:17 +0000271 # In case it wasn't there, try the dynamic libraries
272 # This case will get used in a linux setup where the Compute Library
273 # has been installed in a standard system library path as a dynamic library
274 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute)
275 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute)
276 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core)
277 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core)
278
telsoa014fcda012018-03-09 14:13:49 +0000279 set(ARMCOMPUTE_LIBRARIES
280 debug ${ARMCOMPUTE_LIBRARY_DEBUG} ${ARMCOMPUTE_CORE_LIBRARY_DEBUG}
281 optimized ${ARMCOMPUTE_LIBRARY_RELEASE} ${ARMCOMPUTE_CORE_LIBRARY_RELEASE} )
282 endif()
283endif()
284
285# ARM Compute NEON backend
286if(ARMCOMPUTENEON)
287 # Add preprocessor definition for ARM Compute NEON
288 add_definitions(-DARMCOMPUTENEON_ENABLED)
289 # The ARM Compute headers contain some NEON intrinsics, so we need to build armnn with NEON support on armv7
290 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7 AND COMPILER_IS_GNU_LIKE)
291 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon")
292 endif()
293endif()
294
295# ARM Compute OpenCL backend
296if(ARMCOMPUTECL)
Nikhil Rajb55d3662021-02-11 14:49:19 +0000297 # verify we have a valid flatbuffers include path
298 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
299 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
300
301 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
302
303 find_library(FLATBUFFERS_LIBRARY
304 NAMES libflatbuffers.a flatbuffers
305 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
306
307 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
308
telsoa014fcda012018-03-09 14:13:49 +0000309 # Always use Arm compute library OpenCL headers
Nikhil Raj407cddf2021-11-30 09:57:08 +0000310 find_path(OPENCL_INCLUDE CL/opencl.hpp
telsoa014fcda012018-03-09 14:13:49 +0000311 PATHS ${ARMCOMPUTE_ROOT}/include
312 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
313
Matthew Bentham3b72db02018-10-11 09:47:01 +0100314 # Link against libOpenCL in opencl-1.2-stubs, but don't search there at runtime
315 link_libraries(-L${ARMCOMPUTE_BUILD_DIR}/opencl-1.2-stubs)
316 set(OPENCL_LIBRARIES OpenCL)
telsoa014fcda012018-03-09 14:13:49 +0000317
Matthew Bentham416b41d2020-02-05 22:15:26 +0000318 include_directories(SYSTEM ${OPENCL_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000319
320 # Add preprocessor definition for ARM Compute OpenCL
321 add_definitions(-DARMCOMPUTECL_ENABLED)
322
323 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DARM_COMPUTE_DEBUG_ENABLED")
324endif()
325
326# Used by both Arm Compute backends, but should be added
327# to the search path after the system directories if necessary
328if(ARMCOMPUTENEON OR ARMCOMPUTECL)
329 find_path(HALF_INCLUDE half/half.hpp)
330 find_path(HALF_INCLUDE half/half.hpp
331 PATHS ${ARMCOMPUTE_ROOT}/include
332 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa01c577f2c2018-08-31 09:22:23 +0100333 include_directories(SYSTEM ${HALF_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000334endif()
335
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100336# ArmNN reference backend
337if(ARMNNREF)
338 add_definitions(-DARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100339endif()
340
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100341# ArmNN TOSA reference backend
342if(ARMNNTOSAREF)
343 # Locate the includes for the TOSA serialization library.
344 message(STATUS "TOSA serialization library root set to ${TOSA_SERIALIZATION_LIB_ROOT}")
345
Matthew Sloyand646b552022-10-10 12:42:16 +0100346 find_path(TOSA_SERIALIZATION_LIB_INCLUDE tosa_serialization_handler.h
347 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/include)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100348 message(STATUS "TOSA serialization library include directory located at: ${TOSA_SERIALIZATION_LIB_INCLUDE}")
349
350 find_library(TOSA_SERIALIZATION_LIB
Matthew Sloyand646b552022-10-10 12:42:16 +0100351 NAMES tosa_serialization_lib.a tosa_serialization_lib
352 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100353 message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
Matthew Sloyand646b552022-10-10 12:42:16 +0100354
355 # Next, locate the includes for the TOSA Reference Model.
356 message(STATUS "TOSA Reference Model root set to ${TOSA_REFERENCE_MODEL_ROOT}")
357
358 find_path(TOSA_REFERENCE_MODEL_INCLUDE model_runner.h
359 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/include)
360 message(STATUS "TOSA Reference Model include directory located at: ${TOSA_REFERENCE_MODEL_INCLUDE}")
361
362 find_library(TOSA_REFERENCE_MODEL_LIB
363 NAMES tosa_reference_model_lib.a tosa_reference_model_lib
364 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
365 message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
Matthew Sloyan67fd5262022-12-07 19:28:18 +0000366
367 if(TOSA_REFERENCE_MODEL_OUTPUT)
368 add_definitions("-DTOSA_REFERENCE_MODEL_OUTPUT=1")
369 endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100370endif()
371
Colm Donelanaa93d982020-06-28 08:16:46 +0100372# This is the root for the dynamic backend tests to search for dynamic
373# backends. By default it will be the project build directory.
Rob Hughes35c31c02020-08-17 15:47:20 +0100374add_definitions(-DDYNAMIC_BACKEND_BUILD_DIR="${PROJECT_BINARY_DIR}")
Colm Donelanaa93d982020-06-28 08:16:46 +0100375
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +0000376# ArmNN dynamic backend
377if(DYNAMIC_BACKEND_PATHS)
378 add_definitions(-DARMNN_DYNAMIC_BACKEND_ENABLED)
379endif()
380
Narumol Prangnawarat867eba52020-02-03 12:29:56 +0000381if(SAMPLE_DYNAMIC_BACKEND)
382 add_definitions(-DSAMPLE_DYNAMIC_BACKEND_ENABLED)
383endif()
384
telsoa014fcda012018-03-09 14:13:49 +0000385# Streamline annotate
386if(PROFILING_BACKEND_STREAMLINE)
387 include_directories("${GATOR_ROOT}/annotate")
388 add_definitions(-DARMNN_STREAMLINE_ENABLED)
389endif()
390
Jim Flynn870b96c2022-03-25 21:24:56 +0000391if(NOT BUILD_BARE_METAL)
telsoa01c577f2c2018-08-31 09:22:23 +0100392if(HEAP_PROFILING OR LEAK_CHECKING)
Kevin May1bbfaca2022-11-22 11:58:05 +0000393 find_path(HEAP_PROFILER_INCLUDE gperftools/heap-profiler.h
394 PATHS ${GPERFTOOLS_ROOT}/include
395 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
396 include_directories(SYSTEM "${HEAP_PROFILER_INCLUDE}")
397 find_library(GPERF_TOOLS_LIBRARY
398 NAMES tcmalloc_debug
399 HINTS ${GPERFTOOLS_ROOT}/lib)
400 link_directories(${GPERFTOOLS_ROOT}/lib)
surmeh013537c2c2018-05-18 16:31:43 +0100401
Kevin May1bbfaca2022-11-22 11:58:05 +0000402 link_libraries(${GPERF_TOOLS_LIBRARY})
403 if (HEAP_PROFILING)
404 add_definitions("-DARMNN_HEAP_PROFILING_ENABLED=1")
405 endif()
406 if (LEAK_CHECKING)
407 add_definitions("-DARMNN_LEAK_CHECKING_ENABLED=1")
surmeh013537c2c2018-05-18 16:31:43 +0100408 endif()
409else()
410 # Valgrind only works with gperftools version number <= 2.4
411 CHECK_INCLUDE_FILE(valgrind/memcheck.h VALGRIND_FOUND)
412endif()
Jim Flynn870b96c2022-03-25 21:24:56 +0000413endif()
surmeh013537c2c2018-05-18 16:31:43 +0100414
telsoa01c577f2c2018-08-31 09:22:23 +0100415if(NOT BUILD_TF_LITE_PARSER)
416 message(STATUS "Tensorflow Lite parser support is disabled")
417endif()
David Beck10b4dfd2018-09-19 12:03:20 +0100418
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000419if(NOT BUILD_ARMNN_SERIALIZER)
420 message(STATUS "Armnn Serializer support is disabled")
421endif()
422
Pavel Macenauer59e057f2020-04-15 14:17:26 +0000423if(NOT BUILD_PYTHON_WHL)
424 message(STATUS "PyArmNN wheel package is disabled")
425endif()
426
427if(NOT BUILD_PYTHON_SRC)
428 message(STATUS "PyArmNN source package is disabled")
429endif()
430
431if(BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
432 find_package(PythonInterp 3 REQUIRED)
433 if(NOT ${PYTHONINTERP_FOUND})
434 message(FATAL_ERROR "Python 3.x required to build PyArmNN, but not found")
435 endif()
436
437 find_package(PythonLibs 3 REQUIRED)
438 if(NOT ${PYTHONLIBS_FOUND})
439 message(FATAL_ERROR "Python 3.x development package required to build PyArmNN, but not found")
440 endif()
441
442 find_package(SWIG 4 REQUIRED)
443 if(NOT ${SWIG_FOUND})
444 message(FATAL_ERROR "SWIG 4.x requried to build PyArmNN, but not found")
445 endif()
446endif()
447
Jim Flynn870b96c2022-03-25 21:24:56 +0000448if(BUILD_BARE_METAL)
449 add_definitions(-DARMNN_BUILD_BARE_METAL
450 -DARMNN_DISABLE_FILESYSTEM
451 -DARMNN_DISABLE_PROCESSES
452 -DARMNN_DISABLE_THREADS
453 -DARMNN_DISABLE_SOCKETS)
454endif()
455
David Beck10b4dfd2018-09-19 12:03:20 +0100456# ArmNN source files required for all build options
457include_directories(SYSTEM third-party)