blob: e9eb0a975734db480990eb6d68d5a585df7b9c05 [file] [log] [blame]
Pavel Macenauer59e057f2020-04-15 14:17:26 +00001#
Ryan OSheab5540542022-07-06 09:52:52 +01002# Copyright © 2022-2023 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)
Ryan OSheab5540542022-07-06 09:52:52 +010045option(EXECUTE_NETWORK_STATIC " This is a limited experimental build that is entirely static.
46 It currently only supports being set by changing the current CMake default options like so:
47 BUILD_TF_LITE_PARSER=1/0
48 BUILD_ARMNN_SERIALIZER=1/0
49 ARMCOMPUTENEON=1/0
50 ARMNNREF=1/0
51 ARMCOMPUTECL=0
52 BUILD_ONNX_PARSER=0
53 BUILD_ARMNN_TFLITE_DELEGATE=0
54 BUILD_TIMELINE_DECODER=0
55 BUILD_BASE_PIPE_SERVER=0
56 BUILD_UNIT_TESTS=0
57 BUILD_GATORD_MOCK=0" OFF)
telsoa014fcda012018-03-09 14:13:49 +000058
59include(SelectLibraryConfigurations)
60
61set(COMPILER_IS_GNU_LIKE 0)
Jim Flynn82262f52020-07-16 11:23:45 +010062if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
63 ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
64 ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
telsoa014fcda012018-03-09 14:13:49 +000065 set(COMPILER_IS_GNU_LIKE 1)
66endif()
67
68# Enable CCache if available and not disabled
69option(USE_CCACHE "USE_CCACHE" ON)
70find_program(CCACHE_FOUND ccache)
71if(CCACHE_FOUND AND USE_CCACHE)
72 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
73 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "CCACHE_CPP2=yes ${rule_launch_compile} ccache")
74endif()
75
76# Enable distcc if available and not disabled
77option(USE_DISTCC "USE_DISTCC" OFF)
78find_program(DISTCC_FOUND distcc)
79if(DISTCC_FOUND AND USE_DISTCC)
80 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
81 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "${rule_launch_compile} distcc")
82endif()
83
84# Set to release configuration by default
85if(NOT CMAKE_BUILD_TYPE)
86 set(CMAKE_BUILD_TYPE "Release")
87endif()
88
89# Compiler flags that are always set
90set(CMAKE_POSITION_INDEPENDENT_CODE ON)
91if(COMPILER_IS_GNU_LIKE)
Derek Lambertiba25aee2019-12-10 22:20:54 +000092 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 +010093 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
94 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
95 endif()
telsoa014fcda012018-03-09 14:13:49 +000096elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Jim Flynn870b96c2022-03-25 21:24:56 +000097 # Disable C4996 (use of deprecated identifier) due to
98 # https://developercommunity.visualstudio.com/content/problem/252574/deprecated-compilation-warning-for-virtual-overrid.html
Rob Hughesfc6bf052019-12-16 17:10:51 +000099 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /wd4996")
Rob Hughesbc873d22020-05-20 13:11:37 +0100100 add_definitions(-DNO_STRICT=1)
telsoa014fcda012018-03-09 14:13:49 +0000101endif()
102if("${CMAKE_SYSTEM_NAME}" STREQUAL Android)
Keith Davisb8942bf2021-05-31 11:22:35 +0100103 # -lz is necessary for when building with ACL set with compressed kernels
104 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -llog -lz")
105 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog -lz")
telsoa014fcda012018-03-09 14:13:49 +0000106endif()
107
108# Compiler flags for Release builds
Matthew Benthame30054f2019-06-24 13:10:54 +0100109set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
telsoa014fcda012018-03-09 14:13:49 +0000110if(COMPILER_IS_GNU_LIKE)
111 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
112elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
113 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2")
114endif()
115
116# Compiler flags for Debug builds
117if(COMPILER_IS_GNU_LIKE)
Matthew Benthame30054f2019-06-24 13:10:54 +0100118 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
telsoa014fcda012018-03-09 14:13:49 +0000119elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Matthew Benthame30054f2019-06-24 13:10:54 +0100120 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI /Od")
telsoa014fcda012018-03-09 14:13:49 +0000121 # Disable SAFESEH which is necessary for Edit and Continue to work
122 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
123 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
124endif()
125
126# Modify RelWithDebInfo so that NDEBUG isn't defined.
127# This enables asserts.
128if (COMPILER_IS_GNU_LIKE)
129 string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
130elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
131 string(REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
132endif()
133
134# Compiler flags for code coverage measurements
135if(BUILD_FOR_COVERAGE)
136 if(NOT CMAKE_BUILD_TYPE EQUAL "Debug")
137 message(WARNING "BUILD_FOR_COVERAGE set so forcing to Debug build")
138 set(CMAKE_BUILD_TYPE "Debug")
139 endif()
140
141 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
142 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
143endif()
144
145if(BUILD_FOR_COVERAGE AND NOT BUILD_UNIT_TESTS)
146 message(WARNING "BUILD_FOR_COVERAGE set but not BUILD_UNIT_TESTS, so code coverage will not be able to run")
147endif()
148
149set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
150
Derek Lambertieac4adb2020-08-25 13:05:59 +0100151include(CMakeFindDependencyMacro)
152
Ryan OSheab5540542022-07-06 09:52:52 +0100153
154if(EXECUTE_NETWORK_STATIC)
155 add_definitions(-DARMNN_DISABLE_SOCKETS
156 -DBUILD_SHARED_LIBS=0
157 -DARMNN_EXECUTE_NETWORK_STATIC)
158endif()
159
160if(BUILD_BARE_METAL)
161 add_definitions(-DARMNN_BUILD_BARE_METAL
162 -DARMNN_DISABLE_FILESYSTEM
163 -DARMNN_DISABLE_PROCESSES
164 -DARMNN_DISABLE_THREADS
165 -DARMNN_DISABLE_SOCKETS)
166endif()
167
Jim Flynnbbfe6032020-07-20 16:57:44 +0100168if (NOT BUILD_PIPE_ONLY)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100169 # cxxopts (Alternative to boost::program_options)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200170 find_path(CXXOPTS_INCLUDE cxxopts/cxxopts.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100171 include_directories(SYSTEM "${CXXOPTS_INCLUDE}")
172endif()
Jan Eilers7e989832020-06-19 11:47:21 +0100173
Jim Flynnbbfe6032020-07-20 16:57:44 +0100174if (NOT BUILD_PIPE_ONLY)
175 # ghc (Alternative to boost::filesystem)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200176 find_path(GHC_INCLUDE ghc/filesystem.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100177 include_directories(SYSTEM "${GHC_INCLUDE}")
178endif()
Jan Eilers307fd342020-06-23 14:16:04 +0100179
Nikhil Raj23a6d002023-01-17 11:24:01 +0000180# JNI_BUILD has DBUILD_SHARED_LIBS set to 0 and not finding libs while building
181# hence added NOT BUILD_ARMNN_TFLITE_DELEGATE condition
182if(NOT BUILD_SHARED_LIBS AND NOT BUILD_ARMNN_TFLITE_DELEGATE)
Ryan OSheab5540542022-07-06 09:52:52 +0100183 set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
184endif()
185
telsoa014fcda012018-03-09 14:13:49 +0000186# pthread
Jim Flynn870b96c2022-03-25 21:24:56 +0000187if (NOT BUILD_BARE_METAL)
188find_package(Threads)
189endif()
telsoa014fcda012018-03-09 14:13:49 +0000190
Ryan OSheab5540542022-07-06 09:52:52 +0100191if (EXECUTE_NETWORK_STATIC)
192 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -pthread")
193endif()
194
telsoa014fcda012018-03-09 14:13:49 +0000195# Favour the protobuf passed on command line
Nikhil Raj5d955cf2021-04-19 16:59:48 +0100196if(BUILD_ONNX_PARSER)
telsoa014fcda012018-03-09 14:13:49 +0000197 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd"
198 PATHS ${PROTOBUF_ROOT}/lib
199 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
200 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd")
201
202 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf"
203 PATHS ${PROTOBUF_ROOT}/lib
204 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
205 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf")
206
207 select_library_configurations(PROTOBUF)
208
209 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h"
210 PATHS ${PROTOBUF_ROOT}/include
211 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
212 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h")
213
214 include_directories(SYSTEM "${PROTOBUF_INCLUDE_DIRS}")
215 add_definitions(-DPROTOBUF_USE_DLLS)
telsoa014fcda012018-03-09 14:13:49 +0000216
telsoa01c577f2c2018-08-31 09:22:23 +0100217 add_definitions(-DARMNN_ONNX_PARSER)
218
219 find_path(ONNX_GENERATED_SOURCES "onnx/onnx.pb.cc")
220
221 # C++ headers generated for onnx protobufs
222 include_directories(SYSTEM "${ONNX_GENERATED_SOURCES}")
223endif()
224
Sadik Armagan5d03e312020-11-17 16:43:56 +0000225if(BUILD_ARMNN_TFLITE_DELEGATE)
226 add_definitions(-DARMNN_TFLITE_DELEGATE)
227endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100228# Flatbuffers support for TF Lite, Armnn Serializer or the TOSA backend.
229if(BUILD_TF_LITE_PARSER OR BUILD_ARMNN_SERIALIZER OR ARMNNTOSAREF)
telsoa01c577f2c2018-08-31 09:22:23 +0100230 # verify we have a valid flatbuffers include path
231 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
232 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
233
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000234 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
telsoa01c577f2c2018-08-31 09:22:23 +0100235
236 find_library(FLATBUFFERS_LIBRARY
237 NAMES libflatbuffers.a flatbuffers
238 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
239
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000240 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000241endif()
242
243# Flatbuffers schema support for TF Lite
244if(BUILD_TF_LITE_PARSER)
245 find_path(TF_LITE_SCHEMA_INCLUDE_PATH
246 schema_generated.h
247 HINTS ${TF_LITE_GENERATED_PATH})
248
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000249 message(STATUS "Tf Lite generated header found at: ${TF_LITE_SCHEMA_INCLUDE_PATH}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000250
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000251 add_definitions(-DARMNN_TF_LITE_PARSER)
telsoa01c577f2c2018-08-31 09:22:23 +0100252endif()
253
Kevin May43a799c2019-02-08 16:31:42 +0000254if(BUILD_ARMNN_SERIALIZER)
Kevin May43a799c2019-02-08 16:31:42 +0000255 add_definitions(-DARMNN_SERIALIZER)
Matthew Bentham268509a2019-02-25 13:58:24 +0000256 add_definitions(-DARMNN_SERIALIZER_SCHEMA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/src/armnnSerializer/ArmnnSchema.fbs")
Kevin May43a799c2019-02-08 16:31:42 +0000257endif()
258
telsoa014fcda012018-03-09 14:13:49 +0000259include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Sadik Armagana97a0be2020-03-03 10:44:56 +0000260include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling)
telsoa014fcda012018-03-09 14:13:49 +0000261
262# ARM Compute
263# Note that ARM Compute has a different folder layout depending on the branch but also on
264# whether it comes from a prepackaged archive (this is why we add several hints below)
265if(ARMCOMPUTENEON OR ARMCOMPUTECL)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000266 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h
telsoa014fcda012018-03-09 14:13:49 +0000267 PATHS ${ARMCOMPUTE_ROOT}/include
268 PATHS ${ARMCOMPUTE_ROOT}/applications/arm_compute
269 PATHS ${ARMCOMPUTE_ROOT}
270 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000271 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h)
telsoa014fcda012018-03-09 14:13:49 +0000272 include_directories(SYSTEM "${ARMCOMPUTE_INCLUDE}")
273
274 # Find the Arm Compute libraries if not already specified (the user may have already defined this in advance,
275 # e.g. if building clframework as a dependent cmake project)
276 if (NOT DEFINED ARMCOMPUTE_LIBRARIES)
277 # We link to the static variant so that customers don't need to find and build a compatible version of clframework.
278 # First try the folders specified ARMCOMPUTE_BUILD_DIR (with PATH_SUFFIXES for
279 # Windows builds)
Matthew Bentham2624dd72020-05-20 10:44:18 +0100280 if ((NOT DEFINED ARMCOMPUTE_BUILD_DIR) AND (DEFINED ARMCOMPUTE_ROOT))
281 # Default build directory for ComputeLibrary is under the root
282 set(ARMCOMPUTE_BUILD_DIR ${ARMCOMPUTE_ROOT}/build)
283 endif()
284
telsoa014fcda012018-03-09 14:13:49 +0000285 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static
286 PATHS ${ARMCOMPUTE_BUILD_DIR}
287 PATH_SUFFIXES "Debug"
288 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
289 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static
290 PATHS ${ARMCOMPUTE_BUILD_DIR}
291 PATH_SUFFIXES "Release"
292 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
293 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static
294 PATHS ${ARMCOMPUTE_BUILD_DIR}
295 PATH_SUFFIXES "Debug"
296 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
297 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static
298 PATHS ${ARMCOMPUTE_BUILD_DIR}
299 PATH_SUFFIXES "Release"
300 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
301
302 # In case it wasn't there, try a default search (will work in cases where
303 # the library has been installed into a standard location)
304 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static)
305 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static)
306 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static)
307 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static)
308
Matthew Bentham6445cff2020-03-10 11:13:17 +0000309 # In case it wasn't there, try the dynamic libraries
310 # This case will get used in a linux setup where the Compute Library
311 # has been installed in a standard system library path as a dynamic library
312 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute)
313 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute)
314 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core)
315 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core)
316
telsoa014fcda012018-03-09 14:13:49 +0000317 set(ARMCOMPUTE_LIBRARIES
318 debug ${ARMCOMPUTE_LIBRARY_DEBUG} ${ARMCOMPUTE_CORE_LIBRARY_DEBUG}
319 optimized ${ARMCOMPUTE_LIBRARY_RELEASE} ${ARMCOMPUTE_CORE_LIBRARY_RELEASE} )
320 endif()
321endif()
322
323# ARM Compute NEON backend
324if(ARMCOMPUTENEON)
325 # Add preprocessor definition for ARM Compute NEON
326 add_definitions(-DARMCOMPUTENEON_ENABLED)
327 # The ARM Compute headers contain some NEON intrinsics, so we need to build armnn with NEON support on armv7
328 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7 AND COMPILER_IS_GNU_LIKE)
329 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon")
330 endif()
331endif()
332
333# ARM Compute OpenCL backend
334if(ARMCOMPUTECL)
Nikhil Rajb55d3662021-02-11 14:49:19 +0000335 # verify we have a valid flatbuffers include path
336 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
337 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
338
339 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
340
341 find_library(FLATBUFFERS_LIBRARY
342 NAMES libflatbuffers.a flatbuffers
343 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
344
345 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
346
telsoa014fcda012018-03-09 14:13:49 +0000347 # Always use Arm compute library OpenCL headers
Nikhil Raj407cddf2021-11-30 09:57:08 +0000348 find_path(OPENCL_INCLUDE CL/opencl.hpp
telsoa014fcda012018-03-09 14:13:49 +0000349 PATHS ${ARMCOMPUTE_ROOT}/include
350 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
351
Matthew Bentham3b72db02018-10-11 09:47:01 +0100352 # Link against libOpenCL in opencl-1.2-stubs, but don't search there at runtime
353 link_libraries(-L${ARMCOMPUTE_BUILD_DIR}/opencl-1.2-stubs)
354 set(OPENCL_LIBRARIES OpenCL)
telsoa014fcda012018-03-09 14:13:49 +0000355
Matthew Bentham416b41d2020-02-05 22:15:26 +0000356 include_directories(SYSTEM ${OPENCL_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000357
358 # Add preprocessor definition for ARM Compute OpenCL
359 add_definitions(-DARMCOMPUTECL_ENABLED)
360
361 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DARM_COMPUTE_DEBUG_ENABLED")
362endif()
363
364# Used by both Arm Compute backends, but should be added
365# to the search path after the system directories if necessary
366if(ARMCOMPUTENEON OR ARMCOMPUTECL)
367 find_path(HALF_INCLUDE half/half.hpp)
368 find_path(HALF_INCLUDE half/half.hpp
369 PATHS ${ARMCOMPUTE_ROOT}/include
370 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa01c577f2c2018-08-31 09:22:23 +0100371 include_directories(SYSTEM ${HALF_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000372endif()
373
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100374# ArmNN reference backend
375if(ARMNNREF)
376 add_definitions(-DARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100377endif()
378
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100379# ArmNN TOSA reference backend
380if(ARMNNTOSAREF)
381 # Locate the includes for the TOSA serialization library.
382 message(STATUS "TOSA serialization library root set to ${TOSA_SERIALIZATION_LIB_ROOT}")
383
Matthew Sloyand646b552022-10-10 12:42:16 +0100384 find_path(TOSA_SERIALIZATION_LIB_INCLUDE tosa_serialization_handler.h
385 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/include)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100386 message(STATUS "TOSA serialization library include directory located at: ${TOSA_SERIALIZATION_LIB_INCLUDE}")
387
388 find_library(TOSA_SERIALIZATION_LIB
Matthew Sloyand646b552022-10-10 12:42:16 +0100389 NAMES tosa_serialization_lib.a tosa_serialization_lib
390 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100391 message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
Matthew Sloyand646b552022-10-10 12:42:16 +0100392
393 # Next, locate the includes for the TOSA Reference Model.
394 message(STATUS "TOSA Reference Model root set to ${TOSA_REFERENCE_MODEL_ROOT}")
395
396 find_path(TOSA_REFERENCE_MODEL_INCLUDE model_runner.h
397 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/include)
398 message(STATUS "TOSA Reference Model include directory located at: ${TOSA_REFERENCE_MODEL_INCLUDE}")
399
400 find_library(TOSA_REFERENCE_MODEL_LIB
401 NAMES tosa_reference_model_lib.a tosa_reference_model_lib
402 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
403 message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
Matthew Sloyan67fd5262022-12-07 19:28:18 +0000404
405 if(TOSA_REFERENCE_MODEL_OUTPUT)
406 add_definitions("-DTOSA_REFERENCE_MODEL_OUTPUT=1")
407 endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100408endif()
409
Colm Donelanaa93d982020-06-28 08:16:46 +0100410# This is the root for the dynamic backend tests to search for dynamic
411# backends. By default it will be the project build directory.
Rob Hughes35c31c02020-08-17 15:47:20 +0100412add_definitions(-DDYNAMIC_BACKEND_BUILD_DIR="${PROJECT_BINARY_DIR}")
Colm Donelanaa93d982020-06-28 08:16:46 +0100413
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +0000414# ArmNN dynamic backend
415if(DYNAMIC_BACKEND_PATHS)
416 add_definitions(-DARMNN_DYNAMIC_BACKEND_ENABLED)
417endif()
418
Narumol Prangnawarat867eba52020-02-03 12:29:56 +0000419if(SAMPLE_DYNAMIC_BACKEND)
420 add_definitions(-DSAMPLE_DYNAMIC_BACKEND_ENABLED)
421endif()
422
telsoa014fcda012018-03-09 14:13:49 +0000423# Streamline annotate
424if(PROFILING_BACKEND_STREAMLINE)
425 include_directories("${GATOR_ROOT}/annotate")
426 add_definitions(-DARMNN_STREAMLINE_ENABLED)
427endif()
428
Ryan OSheab5540542022-07-06 09:52:52 +0100429if(NOT BUILD_BARE_METAL AND NOT EXECUTE_NETWORK_STATIC)
telsoa01c577f2c2018-08-31 09:22:23 +0100430if(HEAP_PROFILING OR LEAK_CHECKING)
Kevin May1bbfaca2022-11-22 11:58:05 +0000431 find_path(HEAP_PROFILER_INCLUDE gperftools/heap-profiler.h
432 PATHS ${GPERFTOOLS_ROOT}/include
433 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
434 include_directories(SYSTEM "${HEAP_PROFILER_INCLUDE}")
435 find_library(GPERF_TOOLS_LIBRARY
436 NAMES tcmalloc_debug
437 HINTS ${GPERFTOOLS_ROOT}/lib)
438 link_directories(${GPERFTOOLS_ROOT}/lib)
surmeh013537c2c2018-05-18 16:31:43 +0100439
Kevin May1bbfaca2022-11-22 11:58:05 +0000440 link_libraries(${GPERF_TOOLS_LIBRARY})
441 if (HEAP_PROFILING)
442 add_definitions("-DARMNN_HEAP_PROFILING_ENABLED=1")
443 endif()
444 if (LEAK_CHECKING)
445 add_definitions("-DARMNN_LEAK_CHECKING_ENABLED=1")
surmeh013537c2c2018-05-18 16:31:43 +0100446 endif()
447else()
448 # Valgrind only works with gperftools version number <= 2.4
449 CHECK_INCLUDE_FILE(valgrind/memcheck.h VALGRIND_FOUND)
450endif()
Jim Flynn870b96c2022-03-25 21:24:56 +0000451endif()
surmeh013537c2c2018-05-18 16:31:43 +0100452
telsoa01c577f2c2018-08-31 09:22:23 +0100453if(NOT BUILD_TF_LITE_PARSER)
454 message(STATUS "Tensorflow Lite parser support is disabled")
455endif()
David Beck10b4dfd2018-09-19 12:03:20 +0100456
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000457if(NOT BUILD_ARMNN_SERIALIZER)
458 message(STATUS "Armnn Serializer support is disabled")
459endif()
460
Pavel Macenauer59e057f2020-04-15 14:17:26 +0000461if(NOT BUILD_PYTHON_WHL)
462 message(STATUS "PyArmNN wheel package is disabled")
463endif()
464
465if(NOT BUILD_PYTHON_SRC)
466 message(STATUS "PyArmNN source package is disabled")
467endif()
468
469if(BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
470 find_package(PythonInterp 3 REQUIRED)
471 if(NOT ${PYTHONINTERP_FOUND})
472 message(FATAL_ERROR "Python 3.x required to build PyArmNN, but not found")
473 endif()
474
475 find_package(PythonLibs 3 REQUIRED)
476 if(NOT ${PYTHONLIBS_FOUND})
477 message(FATAL_ERROR "Python 3.x development package required to build PyArmNN, but not found")
478 endif()
479
480 find_package(SWIG 4 REQUIRED)
481 if(NOT ${SWIG_FOUND})
482 message(FATAL_ERROR "SWIG 4.x requried to build PyArmNN, but not found")
483 endif()
484endif()
485
David Beck10b4dfd2018-09-19 12:03:20 +0100486# ArmNN source files required for all build options
487include_directories(SYSTEM third-party)