blob: 0191b0d45838a016e02ff0a2032ecbda7dc4dc6a [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)
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +000040option(BUILD_ARMNN_TFLITE_OPAQUE_DELEGATE "Build the Arm NN TfLite Opaque delegate" OFF)
Jim Flynne1fdd282021-10-26 21:26:10 +010041option(BUILD_MEMORY_STRATEGY_BENCHMARK "Build the MemoryBenchmark" OFF)
Jim Flynn870b96c2022-03-25 21:24:56 +000042option(BUILD_BARE_METAL "Disable features requiring operating system support" OFF)
Jan Eilersa96489a2021-12-08 10:05:47 +000043option(BUILD_SHARED_LIBS "Determines if Armnn will be built statically or dynamically.
44 This is an experimental feature and not fully supported.
45 Only the ArmNN core and the Delegate can be built statically." ON)
Ryan OSheab5540542022-07-06 09:52:52 +010046option(EXECUTE_NETWORK_STATIC " This is a limited experimental build that is entirely static.
47 It currently only supports being set by changing the current CMake default options like so:
48 BUILD_TF_LITE_PARSER=1/0
49 BUILD_ARMNN_SERIALIZER=1/0
50 ARMCOMPUTENEON=1/0
51 ARMNNREF=1/0
52 ARMCOMPUTECL=0
53 BUILD_ONNX_PARSER=0
54 BUILD_ARMNN_TFLITE_DELEGATE=0
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +000055 BUILD_ARMNN_TFLITE_OPAQUE_DELEGATE=0
Ryan OSheab5540542022-07-06 09:52:52 +010056 BUILD_TIMELINE_DECODER=0
57 BUILD_BASE_PIPE_SERVER=0
58 BUILD_UNIT_TESTS=0
59 BUILD_GATORD_MOCK=0" OFF)
telsoa014fcda012018-03-09 14:13:49 +000060
61include(SelectLibraryConfigurations)
62
63set(COMPILER_IS_GNU_LIKE 0)
Jim Flynn82262f52020-07-16 11:23:45 +010064if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
65 ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
66 ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
telsoa014fcda012018-03-09 14:13:49 +000067 set(COMPILER_IS_GNU_LIKE 1)
68endif()
69
70# Enable CCache if available and not disabled
71option(USE_CCACHE "USE_CCACHE" ON)
72find_program(CCACHE_FOUND ccache)
73if(CCACHE_FOUND AND USE_CCACHE)
74 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
75 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "CCACHE_CPP2=yes ${rule_launch_compile} ccache")
76endif()
77
78# Enable distcc if available and not disabled
79option(USE_DISTCC "USE_DISTCC" OFF)
80find_program(DISTCC_FOUND distcc)
81if(DISTCC_FOUND AND USE_DISTCC)
82 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
83 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "${rule_launch_compile} distcc")
84endif()
85
86# Set to release configuration by default
87if(NOT CMAKE_BUILD_TYPE)
88 set(CMAKE_BUILD_TYPE "Release")
89endif()
90
91# Compiler flags that are always set
92set(CMAKE_POSITION_INDEPENDENT_CODE ON)
93if(COMPILER_IS_GNU_LIKE)
Derek Lambertiba25aee2019-12-10 22:20:54 +000094 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 +010095 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
96 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
97 endif()
telsoa014fcda012018-03-09 14:13:49 +000098elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Jim Flynn870b96c2022-03-25 21:24:56 +000099 # Disable C4996 (use of deprecated identifier) due to
100 # https://developercommunity.visualstudio.com/content/problem/252574/deprecated-compilation-warning-for-virtual-overrid.html
Rob Hughesfc6bf052019-12-16 17:10:51 +0000101 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /wd4996")
Rob Hughesbc873d22020-05-20 13:11:37 +0100102 add_definitions(-DNO_STRICT=1)
telsoa014fcda012018-03-09 14:13:49 +0000103endif()
104if("${CMAKE_SYSTEM_NAME}" STREQUAL Android)
Keith Davisb8942bf2021-05-31 11:22:35 +0100105 # -lz is necessary for when building with ACL set with compressed kernels
106 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -llog -lz")
107 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog -lz")
telsoa014fcda012018-03-09 14:13:49 +0000108endif()
109
110# Compiler flags for Release builds
Matthew Benthame30054f2019-06-24 13:10:54 +0100111set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
telsoa014fcda012018-03-09 14:13:49 +0000112if(COMPILER_IS_GNU_LIKE)
113 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
114elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
115 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2")
116endif()
117
118# Compiler flags for Debug builds
119if(COMPILER_IS_GNU_LIKE)
Matthew Benthame30054f2019-06-24 13:10:54 +0100120 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
telsoa014fcda012018-03-09 14:13:49 +0000121elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Matthew Benthame30054f2019-06-24 13:10:54 +0100122 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI /Od")
telsoa014fcda012018-03-09 14:13:49 +0000123 # Disable SAFESEH which is necessary for Edit and Continue to work
124 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
125 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
126endif()
127
128# Modify RelWithDebInfo so that NDEBUG isn't defined.
129# This enables asserts.
130if (COMPILER_IS_GNU_LIKE)
131 string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
132elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
133 string(REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
134endif()
135
136# Compiler flags for code coverage measurements
137if(BUILD_FOR_COVERAGE)
138 if(NOT CMAKE_BUILD_TYPE EQUAL "Debug")
139 message(WARNING "BUILD_FOR_COVERAGE set so forcing to Debug build")
140 set(CMAKE_BUILD_TYPE "Debug")
141 endif()
142
143 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
144 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
145endif()
146
147if(BUILD_FOR_COVERAGE AND NOT BUILD_UNIT_TESTS)
148 message(WARNING "BUILD_FOR_COVERAGE set but not BUILD_UNIT_TESTS, so code coverage will not be able to run")
149endif()
150
151set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
152
Derek Lambertieac4adb2020-08-25 13:05:59 +0100153include(CMakeFindDependencyMacro)
154
Ryan OSheab5540542022-07-06 09:52:52 +0100155
156if(EXECUTE_NETWORK_STATIC)
157 add_definitions(-DARMNN_DISABLE_SOCKETS
158 -DBUILD_SHARED_LIBS=0
159 -DARMNN_EXECUTE_NETWORK_STATIC)
160endif()
161
162if(BUILD_BARE_METAL)
163 add_definitions(-DARMNN_BUILD_BARE_METAL
164 -DARMNN_DISABLE_FILESYSTEM
165 -DARMNN_DISABLE_PROCESSES
166 -DARMNN_DISABLE_THREADS
167 -DARMNN_DISABLE_SOCKETS)
168endif()
169
Jim Flynnbbfe6032020-07-20 16:57:44 +0100170if (NOT BUILD_PIPE_ONLY)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100171 # cxxopts (Alternative to boost::program_options)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200172 find_path(CXXOPTS_INCLUDE cxxopts/cxxopts.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100173 include_directories(SYSTEM "${CXXOPTS_INCLUDE}")
174endif()
Jan Eilers7e989832020-06-19 11:47:21 +0100175
Jim Flynnbbfe6032020-07-20 16:57:44 +0100176if (NOT BUILD_PIPE_ONLY)
177 # ghc (Alternative to boost::filesystem)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200178 find_path(GHC_INCLUDE ghc/filesystem.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100179 include_directories(SYSTEM "${GHC_INCLUDE}")
180endif()
Jan Eilers307fd342020-06-23 14:16:04 +0100181
Nikhil Raj23a6d002023-01-17 11:24:01 +0000182# JNI_BUILD has DBUILD_SHARED_LIBS set to 0 and not finding libs while building
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000183# hence added NOT BUILD_ARMNN_TFLITE_DELEGATE/BUILD_ARMNN_TFLITE_OPAQUE_DELEGATE condition
184if(NOT BUILD_SHARED_LIBS AND NOT BUILD_ARMNN_TFLITE_DELEGATE AND NOT BUILD_ARMNN_TFLITE_OPAQUE_DELEGATE)
Ryan OSheab5540542022-07-06 09:52:52 +0100185 set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
186endif()
187
telsoa014fcda012018-03-09 14:13:49 +0000188# pthread
Jim Flynn870b96c2022-03-25 21:24:56 +0000189if (NOT BUILD_BARE_METAL)
190find_package(Threads)
191endif()
telsoa014fcda012018-03-09 14:13:49 +0000192
Ryan OSheab5540542022-07-06 09:52:52 +0100193if (EXECUTE_NETWORK_STATIC)
194 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -pthread")
195endif()
196
telsoa014fcda012018-03-09 14:13:49 +0000197# Favour the protobuf passed on command line
Nikhil Raj5d955cf2021-04-19 16:59:48 +0100198if(BUILD_ONNX_PARSER)
telsoa014fcda012018-03-09 14:13:49 +0000199 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd"
200 PATHS ${PROTOBUF_ROOT}/lib
201 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
202 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd")
203
204 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf"
205 PATHS ${PROTOBUF_ROOT}/lib
206 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
207 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf")
208
209 select_library_configurations(PROTOBUF)
210
211 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h"
212 PATHS ${PROTOBUF_ROOT}/include
213 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
214 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h")
215
216 include_directories(SYSTEM "${PROTOBUF_INCLUDE_DIRS}")
217 add_definitions(-DPROTOBUF_USE_DLLS)
telsoa014fcda012018-03-09 14:13:49 +0000218
telsoa01c577f2c2018-08-31 09:22:23 +0100219 add_definitions(-DARMNN_ONNX_PARSER)
220
221 find_path(ONNX_GENERATED_SOURCES "onnx/onnx.pb.cc")
222
223 # C++ headers generated for onnx protobufs
224 include_directories(SYSTEM "${ONNX_GENERATED_SOURCES}")
225endif()
226
Sadik Armagan5d03e312020-11-17 16:43:56 +0000227if(BUILD_ARMNN_TFLITE_DELEGATE)
228 add_definitions(-DARMNN_TFLITE_DELEGATE)
229endif()
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000230
231if(BUILD_ARMNN_TFLITE_OPAQUE_DELEGATE)
232 add_definitions(-DARMNN_TFLITE_OPAQUE_DELEGATE)
233endif()
234
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100235# Flatbuffers support for TF Lite, Armnn Serializer or the TOSA backend.
236if(BUILD_TF_LITE_PARSER OR BUILD_ARMNN_SERIALIZER OR ARMNNTOSAREF)
telsoa01c577f2c2018-08-31 09:22:23 +0100237 # verify we have a valid flatbuffers include path
238 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
239 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
240
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000241 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
telsoa01c577f2c2018-08-31 09:22:23 +0100242
243 find_library(FLATBUFFERS_LIBRARY
244 NAMES libflatbuffers.a flatbuffers
245 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
246
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000247 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000248endif()
249
250# Flatbuffers schema support for TF Lite
251if(BUILD_TF_LITE_PARSER)
252 find_path(TF_LITE_SCHEMA_INCLUDE_PATH
253 schema_generated.h
254 HINTS ${TF_LITE_GENERATED_PATH})
255
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000256 message(STATUS "Tf Lite generated header found at: ${TF_LITE_SCHEMA_INCLUDE_PATH}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000257
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000258 add_definitions(-DARMNN_TF_LITE_PARSER)
telsoa01c577f2c2018-08-31 09:22:23 +0100259endif()
260
Kevin May43a799c2019-02-08 16:31:42 +0000261if(BUILD_ARMNN_SERIALIZER)
Kevin May43a799c2019-02-08 16:31:42 +0000262 add_definitions(-DARMNN_SERIALIZER)
Matthew Bentham268509a2019-02-25 13:58:24 +0000263 add_definitions(-DARMNN_SERIALIZER_SCHEMA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/src/armnnSerializer/ArmnnSchema.fbs")
Kevin May43a799c2019-02-08 16:31:42 +0000264endif()
265
telsoa014fcda012018-03-09 14:13:49 +0000266include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Sadik Armagana97a0be2020-03-03 10:44:56 +0000267include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling)
telsoa014fcda012018-03-09 14:13:49 +0000268
269# ARM Compute
270# Note that ARM Compute has a different folder layout depending on the branch but also on
271# whether it comes from a prepackaged archive (this is why we add several hints below)
272if(ARMCOMPUTENEON OR ARMCOMPUTECL)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000273 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h
telsoa014fcda012018-03-09 14:13:49 +0000274 PATHS ${ARMCOMPUTE_ROOT}/include
275 PATHS ${ARMCOMPUTE_ROOT}/applications/arm_compute
276 PATHS ${ARMCOMPUTE_ROOT}
277 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000278 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h)
telsoa014fcda012018-03-09 14:13:49 +0000279 include_directories(SYSTEM "${ARMCOMPUTE_INCLUDE}")
280
281 # Find the Arm Compute libraries if not already specified (the user may have already defined this in advance,
282 # e.g. if building clframework as a dependent cmake project)
283 if (NOT DEFINED ARMCOMPUTE_LIBRARIES)
284 # We link to the static variant so that customers don't need to find and build a compatible version of clframework.
285 # First try the folders specified ARMCOMPUTE_BUILD_DIR (with PATH_SUFFIXES for
286 # Windows builds)
Matthew Bentham2624dd72020-05-20 10:44:18 +0100287 if ((NOT DEFINED ARMCOMPUTE_BUILD_DIR) AND (DEFINED ARMCOMPUTE_ROOT))
288 # Default build directory for ComputeLibrary is under the root
289 set(ARMCOMPUTE_BUILD_DIR ${ARMCOMPUTE_ROOT}/build)
290 endif()
291
telsoa014fcda012018-03-09 14:13:49 +0000292 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static
293 PATHS ${ARMCOMPUTE_BUILD_DIR}
294 PATH_SUFFIXES "Debug"
295 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
296 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static
297 PATHS ${ARMCOMPUTE_BUILD_DIR}
298 PATH_SUFFIXES "Release"
299 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
300 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static
301 PATHS ${ARMCOMPUTE_BUILD_DIR}
302 PATH_SUFFIXES "Debug"
303 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
304 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static
305 PATHS ${ARMCOMPUTE_BUILD_DIR}
306 PATH_SUFFIXES "Release"
307 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
308
309 # In case it wasn't there, try a default search (will work in cases where
310 # the library has been installed into a standard location)
311 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static)
312 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static)
313 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static)
314 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static)
315
Matthew Bentham6445cff2020-03-10 11:13:17 +0000316 # In case it wasn't there, try the dynamic libraries
317 # This case will get used in a linux setup where the Compute Library
318 # has been installed in a standard system library path as a dynamic library
319 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute)
320 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute)
321 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core)
322 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core)
323
telsoa014fcda012018-03-09 14:13:49 +0000324 set(ARMCOMPUTE_LIBRARIES
325 debug ${ARMCOMPUTE_LIBRARY_DEBUG} ${ARMCOMPUTE_CORE_LIBRARY_DEBUG}
326 optimized ${ARMCOMPUTE_LIBRARY_RELEASE} ${ARMCOMPUTE_CORE_LIBRARY_RELEASE} )
327 endif()
328endif()
329
330# ARM Compute NEON backend
331if(ARMCOMPUTENEON)
332 # Add preprocessor definition for ARM Compute NEON
333 add_definitions(-DARMCOMPUTENEON_ENABLED)
334 # The ARM Compute headers contain some NEON intrinsics, so we need to build armnn with NEON support on armv7
335 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7 AND COMPILER_IS_GNU_LIKE)
336 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon")
337 endif()
338endif()
339
340# ARM Compute OpenCL backend
341if(ARMCOMPUTECL)
Nikhil Rajb55d3662021-02-11 14:49:19 +0000342 # verify we have a valid flatbuffers include path
343 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
344 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
345
346 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
347
348 find_library(FLATBUFFERS_LIBRARY
349 NAMES libflatbuffers.a flatbuffers
350 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
351
352 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
353
telsoa014fcda012018-03-09 14:13:49 +0000354 # Always use Arm compute library OpenCL headers
Nikhil Raj407cddf2021-11-30 09:57:08 +0000355 find_path(OPENCL_INCLUDE CL/opencl.hpp
telsoa014fcda012018-03-09 14:13:49 +0000356 PATHS ${ARMCOMPUTE_ROOT}/include
357 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
358
Matthew Bentham3b72db02018-10-11 09:47:01 +0100359 # Link against libOpenCL in opencl-1.2-stubs, but don't search there at runtime
360 link_libraries(-L${ARMCOMPUTE_BUILD_DIR}/opencl-1.2-stubs)
361 set(OPENCL_LIBRARIES OpenCL)
telsoa014fcda012018-03-09 14:13:49 +0000362
Matthew Bentham416b41d2020-02-05 22:15:26 +0000363 include_directories(SYSTEM ${OPENCL_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000364
365 # Add preprocessor definition for ARM Compute OpenCL
366 add_definitions(-DARMCOMPUTECL_ENABLED)
367
368 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DARM_COMPUTE_DEBUG_ENABLED")
369endif()
370
371# Used by both Arm Compute backends, but should be added
372# to the search path after the system directories if necessary
373if(ARMCOMPUTENEON OR ARMCOMPUTECL)
374 find_path(HALF_INCLUDE half/half.hpp)
375 find_path(HALF_INCLUDE half/half.hpp
376 PATHS ${ARMCOMPUTE_ROOT}/include
377 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa01c577f2c2018-08-31 09:22:23 +0100378 include_directories(SYSTEM ${HALF_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000379endif()
380
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100381# ArmNN reference backend
382if(ARMNNREF)
383 add_definitions(-DARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100384endif()
385
Matthew Sloyanc01da452023-01-23 10:20:04 +0000386# If a backend requires TOSA common, add it here.
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100387if(ARMNNTOSAREF)
Matthew Sloyanc01da452023-01-23 10:20:04 +0000388 set(ARMNNTOSACOMMON ON)
389endif()
390
391if(ARMNNTOSACOMMON)
392 # Locate the includes for the TOSA serialization library as it is needed for TOSA common and TOSA backends.
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100393 message(STATUS "TOSA serialization library root set to ${TOSA_SERIALIZATION_LIB_ROOT}")
394
Matthew Sloyand646b552022-10-10 12:42:16 +0100395 find_path(TOSA_SERIALIZATION_LIB_INCLUDE tosa_serialization_handler.h
396 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/include)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100397 message(STATUS "TOSA serialization library include directory located at: ${TOSA_SERIALIZATION_LIB_INCLUDE}")
398
399 find_library(TOSA_SERIALIZATION_LIB
Matthew Sloyand646b552022-10-10 12:42:16 +0100400 NAMES tosa_serialization_lib.a tosa_serialization_lib
401 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100402 message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
Matthew Sloyand646b552022-10-10 12:42:16 +0100403
Matthew Sloyanc01da452023-01-23 10:20:04 +0000404 # Include required headers for TOSA Serialization Library
405 include_directories(SYSTEM ${FLATBUFFERS_INCLUDE_PATH})
406 include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/half)
407 include_directories(SYSTEM ${TOSA_SERIALIZATION_LIB_INCLUDE})
408endif()
409
410# ArmNN TOSA reference backend
411if(ARMNNTOSAREF)
412 # Locate the includes for the TOSA Reference Model, which is specific to the TOSA Reference Backend.
Matthew Sloyand646b552022-10-10 12:42:16 +0100413 message(STATUS "TOSA Reference Model root set to ${TOSA_REFERENCE_MODEL_ROOT}")
414
415 find_path(TOSA_REFERENCE_MODEL_INCLUDE model_runner.h
416 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/include)
417 message(STATUS "TOSA Reference Model include directory located at: ${TOSA_REFERENCE_MODEL_INCLUDE}")
418
Matthew Sloyanc01da452023-01-23 10:20:04 +0000419 include_directories(SYSTEM ${TOSA_REFERENCE_MODEL_INCLUDE})
420
Matthew Sloyand646b552022-10-10 12:42:16 +0100421 find_library(TOSA_REFERENCE_MODEL_LIB
422 NAMES tosa_reference_model_lib.a tosa_reference_model_lib
423 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
424 message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
Matthew Sloyan67fd5262022-12-07 19:28:18 +0000425
426 if(TOSA_REFERENCE_MODEL_OUTPUT)
427 add_definitions("-DTOSA_REFERENCE_MODEL_OUTPUT=1")
428 endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100429endif()
430
Colm Donelanaa93d982020-06-28 08:16:46 +0100431# This is the root for the dynamic backend tests to search for dynamic
432# backends. By default it will be the project build directory.
Rob Hughes35c31c02020-08-17 15:47:20 +0100433add_definitions(-DDYNAMIC_BACKEND_BUILD_DIR="${PROJECT_BINARY_DIR}")
Colm Donelanaa93d982020-06-28 08:16:46 +0100434
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +0000435# ArmNN dynamic backend
436if(DYNAMIC_BACKEND_PATHS)
437 add_definitions(-DARMNN_DYNAMIC_BACKEND_ENABLED)
438endif()
439
Narumol Prangnawarat867eba52020-02-03 12:29:56 +0000440if(SAMPLE_DYNAMIC_BACKEND)
441 add_definitions(-DSAMPLE_DYNAMIC_BACKEND_ENABLED)
442endif()
443
telsoa014fcda012018-03-09 14:13:49 +0000444# Streamline annotate
445if(PROFILING_BACKEND_STREAMLINE)
446 include_directories("${GATOR_ROOT}/annotate")
447 add_definitions(-DARMNN_STREAMLINE_ENABLED)
448endif()
449
Ryan OSheab5540542022-07-06 09:52:52 +0100450if(NOT BUILD_BARE_METAL AND NOT EXECUTE_NETWORK_STATIC)
telsoa01c577f2c2018-08-31 09:22:23 +0100451if(HEAP_PROFILING OR LEAK_CHECKING)
Kevin May1bbfaca2022-11-22 11:58:05 +0000452 find_path(HEAP_PROFILER_INCLUDE gperftools/heap-profiler.h
453 PATHS ${GPERFTOOLS_ROOT}/include
454 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
455 include_directories(SYSTEM "${HEAP_PROFILER_INCLUDE}")
456 find_library(GPERF_TOOLS_LIBRARY
457 NAMES tcmalloc_debug
458 HINTS ${GPERFTOOLS_ROOT}/lib)
459 link_directories(${GPERFTOOLS_ROOT}/lib)
surmeh013537c2c2018-05-18 16:31:43 +0100460
Kevin May1bbfaca2022-11-22 11:58:05 +0000461 link_libraries(${GPERF_TOOLS_LIBRARY})
462 if (HEAP_PROFILING)
463 add_definitions("-DARMNN_HEAP_PROFILING_ENABLED=1")
464 endif()
465 if (LEAK_CHECKING)
466 add_definitions("-DARMNN_LEAK_CHECKING_ENABLED=1")
surmeh013537c2c2018-05-18 16:31:43 +0100467 endif()
468else()
469 # Valgrind only works with gperftools version number <= 2.4
470 CHECK_INCLUDE_FILE(valgrind/memcheck.h VALGRIND_FOUND)
471endif()
Jim Flynn870b96c2022-03-25 21:24:56 +0000472endif()
surmeh013537c2c2018-05-18 16:31:43 +0100473
telsoa01c577f2c2018-08-31 09:22:23 +0100474if(NOT BUILD_TF_LITE_PARSER)
475 message(STATUS "Tensorflow Lite parser support is disabled")
476endif()
David Beck10b4dfd2018-09-19 12:03:20 +0100477
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000478if(NOT BUILD_ARMNN_SERIALIZER)
479 message(STATUS "Armnn Serializer support is disabled")
480endif()
481
Pavel Macenauer59e057f2020-04-15 14:17:26 +0000482if(NOT BUILD_PYTHON_WHL)
483 message(STATUS "PyArmNN wheel package is disabled")
484endif()
485
486if(NOT BUILD_PYTHON_SRC)
487 message(STATUS "PyArmNN source package is disabled")
488endif()
489
490if(BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
491 find_package(PythonInterp 3 REQUIRED)
492 if(NOT ${PYTHONINTERP_FOUND})
493 message(FATAL_ERROR "Python 3.x required to build PyArmNN, but not found")
494 endif()
495
496 find_package(PythonLibs 3 REQUIRED)
497 if(NOT ${PYTHONLIBS_FOUND})
498 message(FATAL_ERROR "Python 3.x development package required to build PyArmNN, but not found")
499 endif()
500
501 find_package(SWIG 4 REQUIRED)
502 if(NOT ${SWIG_FOUND})
503 message(FATAL_ERROR "SWIG 4.x requried to build PyArmNN, but not found")
504 endif()
505endif()
506
David Beck10b4dfd2018-09-19 12:03:20 +0100507# ArmNN source files required for all build options
508include_directories(SYSTEM third-party)