blob: 3337f41cbfe8c2bcf8aa3d5e86bc33f0dfd7c006 [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)
Teresa Charlinad1b3d72023-03-14 12:10:28 +000039option(BUILD_CLASSIC_DELEGATE "Build the Arm NN TfLite delegate" OFF)
40option(BUILD_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
Teresa Charlinad1b3d72023-03-14 12:10:28 +000054 BUILD_CLASSIC_DELEGATE=0
55 BUILD_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
Teresa Charlinad1b3d72023-03-14 12:10:28 +000061if(BUILD_ARMNN_TFLITE_DELEGATE)
62 message(BUILD_ARMNN_TFLITE_DELEGATE option is deprecated, it will be removed in 24.02, please use BUILD_CLASSIC_DELEGATE instead)
63 set(BUILD_CLASSIC_DELEGATE 1)
64endif()
65
telsoa014fcda012018-03-09 14:13:49 +000066include(SelectLibraryConfigurations)
67
68set(COMPILER_IS_GNU_LIKE 0)
Jim Flynn82262f52020-07-16 11:23:45 +010069if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
70 ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
71 ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
telsoa014fcda012018-03-09 14:13:49 +000072 set(COMPILER_IS_GNU_LIKE 1)
73endif()
74
75# Enable CCache if available and not disabled
76option(USE_CCACHE "USE_CCACHE" ON)
77find_program(CCACHE_FOUND ccache)
78if(CCACHE_FOUND AND USE_CCACHE)
79 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
80 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "CCACHE_CPP2=yes ${rule_launch_compile} ccache")
81endif()
82
83# Enable distcc if available and not disabled
84option(USE_DISTCC "USE_DISTCC" OFF)
85find_program(DISTCC_FOUND distcc)
86if(DISTCC_FOUND AND USE_DISTCC)
87 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
88 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "${rule_launch_compile} distcc")
89endif()
90
91# Set to release configuration by default
92if(NOT CMAKE_BUILD_TYPE)
93 set(CMAKE_BUILD_TYPE "Release")
94endif()
95
96# Compiler flags that are always set
97set(CMAKE_POSITION_INDEPENDENT_CODE ON)
98if(COMPILER_IS_GNU_LIKE)
Ryan OShea238ecd92023-03-07 11:44:23 +000099 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -Wextra -Werror -Wold-style-cast -Wno-missing-braces -Wconversion -Wsign-conversion")
Finn Williams3d626142021-08-11 13:04:32 +0100100 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
101 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
102 endif()
telsoa014fcda012018-03-09 14:13:49 +0000103elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Jim Flynn870b96c2022-03-25 21:24:56 +0000104 # Disable C4996 (use of deprecated identifier) due to
105 # https://developercommunity.visualstudio.com/content/problem/252574/deprecated-compilation-warning-for-virtual-overrid.html
Rob Hughesfc6bf052019-12-16 17:10:51 +0000106 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /wd4996")
Rob Hughesbc873d22020-05-20 13:11:37 +0100107 add_definitions(-DNO_STRICT=1)
telsoa014fcda012018-03-09 14:13:49 +0000108endif()
109if("${CMAKE_SYSTEM_NAME}" STREQUAL Android)
Keith Davisb8942bf2021-05-31 11:22:35 +0100110 # -lz is necessary for when building with ACL set with compressed kernels
111 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -llog -lz")
112 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog -lz")
telsoa014fcda012018-03-09 14:13:49 +0000113endif()
114
115# Compiler flags for Release builds
Matthew Benthame30054f2019-06-24 13:10:54 +0100116set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
telsoa014fcda012018-03-09 14:13:49 +0000117if(COMPILER_IS_GNU_LIKE)
118 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
119elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
120 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2")
121endif()
122
123# Compiler flags for Debug builds
124if(COMPILER_IS_GNU_LIKE)
Matthew Benthame30054f2019-06-24 13:10:54 +0100125 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
telsoa014fcda012018-03-09 14:13:49 +0000126elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Matthew Benthame30054f2019-06-24 13:10:54 +0100127 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI /Od")
telsoa014fcda012018-03-09 14:13:49 +0000128 # Disable SAFESEH which is necessary for Edit and Continue to work
129 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
130 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
131endif()
132
133# Modify RelWithDebInfo so that NDEBUG isn't defined.
134# This enables asserts.
135if (COMPILER_IS_GNU_LIKE)
136 string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
137elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
138 string(REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
139endif()
140
141# Compiler flags for code coverage measurements
142if(BUILD_FOR_COVERAGE)
143 if(NOT CMAKE_BUILD_TYPE EQUAL "Debug")
144 message(WARNING "BUILD_FOR_COVERAGE set so forcing to Debug build")
145 set(CMAKE_BUILD_TYPE "Debug")
146 endif()
147
148 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
149 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
150endif()
151
152if(BUILD_FOR_COVERAGE AND NOT BUILD_UNIT_TESTS)
153 message(WARNING "BUILD_FOR_COVERAGE set but not BUILD_UNIT_TESTS, so code coverage will not be able to run")
154endif()
155
156set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
157
Derek Lambertieac4adb2020-08-25 13:05:59 +0100158include(CMakeFindDependencyMacro)
159
Ryan OSheab5540542022-07-06 09:52:52 +0100160
161if(EXECUTE_NETWORK_STATIC)
162 add_definitions(-DARMNN_DISABLE_SOCKETS
163 -DBUILD_SHARED_LIBS=0
164 -DARMNN_EXECUTE_NETWORK_STATIC)
165endif()
166
167if(BUILD_BARE_METAL)
168 add_definitions(-DARMNN_BUILD_BARE_METAL
169 -DARMNN_DISABLE_FILESYSTEM
170 -DARMNN_DISABLE_PROCESSES
171 -DARMNN_DISABLE_THREADS
172 -DARMNN_DISABLE_SOCKETS)
173endif()
174
Jim Flynnbbfe6032020-07-20 16:57:44 +0100175if (NOT BUILD_PIPE_ONLY)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100176 # cxxopts (Alternative to boost::program_options)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200177 find_path(CXXOPTS_INCLUDE cxxopts/cxxopts.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100178 include_directories(SYSTEM "${CXXOPTS_INCLUDE}")
179endif()
Jan Eilers7e989832020-06-19 11:47:21 +0100180
Jim Flynnbbfe6032020-07-20 16:57:44 +0100181if (NOT BUILD_PIPE_ONLY)
182 # ghc (Alternative to boost::filesystem)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200183 find_path(GHC_INCLUDE ghc/filesystem.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100184 include_directories(SYSTEM "${GHC_INCLUDE}")
185endif()
Jan Eilers307fd342020-06-23 14:16:04 +0100186
Nikhil Raj23a6d002023-01-17 11:24:01 +0000187# JNI_BUILD has DBUILD_SHARED_LIBS set to 0 and not finding libs while building
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000188# hence added NOT BUILD_CLASSIC_DELEGATE/BUILD_OPAQUE_DELEGATE condition
189if(NOT BUILD_SHARED_LIBS AND NOT BUILD_CLASSIC_DELEGATE AND NOT BUILD_OPAQUE_DELEGATE)
Ryan OSheab5540542022-07-06 09:52:52 +0100190 set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
191endif()
192
telsoa014fcda012018-03-09 14:13:49 +0000193# pthread
Jim Flynn870b96c2022-03-25 21:24:56 +0000194if (NOT BUILD_BARE_METAL)
195find_package(Threads)
196endif()
telsoa014fcda012018-03-09 14:13:49 +0000197
Ryan OSheab5540542022-07-06 09:52:52 +0100198if (EXECUTE_NETWORK_STATIC)
199 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -pthread")
200endif()
201
telsoa014fcda012018-03-09 14:13:49 +0000202# Favour the protobuf passed on command line
Nikhil Raj5d955cf2021-04-19 16:59:48 +0100203if(BUILD_ONNX_PARSER)
telsoa014fcda012018-03-09 14:13:49 +0000204 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd"
205 PATHS ${PROTOBUF_ROOT}/lib
206 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
207 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd")
208
209 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf"
210 PATHS ${PROTOBUF_ROOT}/lib
211 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
212 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf")
213
214 select_library_configurations(PROTOBUF)
215
216 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h"
217 PATHS ${PROTOBUF_ROOT}/include
218 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
219 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h")
220
221 include_directories(SYSTEM "${PROTOBUF_INCLUDE_DIRS}")
222 add_definitions(-DPROTOBUF_USE_DLLS)
telsoa014fcda012018-03-09 14:13:49 +0000223
telsoa01c577f2c2018-08-31 09:22:23 +0100224 add_definitions(-DARMNN_ONNX_PARSER)
225
226 find_path(ONNX_GENERATED_SOURCES "onnx/onnx.pb.cc")
227
228 # C++ headers generated for onnx protobufs
229 include_directories(SYSTEM "${ONNX_GENERATED_SOURCES}")
230endif()
231
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000232if(BUILD_CLASSIC_DELEGATE)
Sadik Armagan5d03e312020-11-17 16:43:56 +0000233 add_definitions(-DARMNN_TFLITE_DELEGATE)
234endif()
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000235
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000236if(BUILD_OPAQUE_DELEGATE)
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000237 add_definitions(-DARMNN_TFLITE_OPAQUE_DELEGATE)
238endif()
239
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100240# Flatbuffers support for TF Lite, Armnn Serializer or the TOSA backend.
241if(BUILD_TF_LITE_PARSER OR BUILD_ARMNN_SERIALIZER OR ARMNNTOSAREF)
telsoa01c577f2c2018-08-31 09:22:23 +0100242 # verify we have a valid flatbuffers include path
243 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
244 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
245
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000246 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
telsoa01c577f2c2018-08-31 09:22:23 +0100247
248 find_library(FLATBUFFERS_LIBRARY
249 NAMES libflatbuffers.a flatbuffers
250 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
251
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000252 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000253endif()
254
255# Flatbuffers schema support for TF Lite
256if(BUILD_TF_LITE_PARSER)
257 find_path(TF_LITE_SCHEMA_INCLUDE_PATH
258 schema_generated.h
259 HINTS ${TF_LITE_GENERATED_PATH})
260
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000261 message(STATUS "Tf Lite generated header found at: ${TF_LITE_SCHEMA_INCLUDE_PATH}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000262
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000263 add_definitions(-DARMNN_TF_LITE_PARSER)
telsoa01c577f2c2018-08-31 09:22:23 +0100264endif()
265
Kevin May43a799c2019-02-08 16:31:42 +0000266if(BUILD_ARMNN_SERIALIZER)
Kevin May43a799c2019-02-08 16:31:42 +0000267 add_definitions(-DARMNN_SERIALIZER)
Matthew Bentham268509a2019-02-25 13:58:24 +0000268 add_definitions(-DARMNN_SERIALIZER_SCHEMA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/src/armnnSerializer/ArmnnSchema.fbs")
Kevin May43a799c2019-02-08 16:31:42 +0000269endif()
270
telsoa014fcda012018-03-09 14:13:49 +0000271include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Sadik Armagana97a0be2020-03-03 10:44:56 +0000272include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling)
telsoa014fcda012018-03-09 14:13:49 +0000273
274# ARM Compute
275# Note that ARM Compute has a different folder layout depending on the branch but also on
276# whether it comes from a prepackaged archive (this is why we add several hints below)
277if(ARMCOMPUTENEON OR ARMCOMPUTECL)
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 PATHS ${ARMCOMPUTE_ROOT}/include
280 PATHS ${ARMCOMPUTE_ROOT}/applications/arm_compute
281 PATHS ${ARMCOMPUTE_ROOT}
282 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000283 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h)
telsoa014fcda012018-03-09 14:13:49 +0000284 include_directories(SYSTEM "${ARMCOMPUTE_INCLUDE}")
285
286 # Find the Arm Compute libraries if not already specified (the user may have already defined this in advance,
287 # e.g. if building clframework as a dependent cmake project)
288 if (NOT DEFINED ARMCOMPUTE_LIBRARIES)
289 # We link to the static variant so that customers don't need to find and build a compatible version of clframework.
290 # First try the folders specified ARMCOMPUTE_BUILD_DIR (with PATH_SUFFIXES for
291 # Windows builds)
Matthew Bentham2624dd72020-05-20 10:44:18 +0100292 if ((NOT DEFINED ARMCOMPUTE_BUILD_DIR) AND (DEFINED ARMCOMPUTE_ROOT))
293 # Default build directory for ComputeLibrary is under the root
294 set(ARMCOMPUTE_BUILD_DIR ${ARMCOMPUTE_ROOT}/build)
295 endif()
296
telsoa014fcda012018-03-09 14:13:49 +0000297 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static
298 PATHS ${ARMCOMPUTE_BUILD_DIR}
299 PATH_SUFFIXES "Debug"
300 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
301 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static
302 PATHS ${ARMCOMPUTE_BUILD_DIR}
303 PATH_SUFFIXES "Release"
304 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
305 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static
306 PATHS ${ARMCOMPUTE_BUILD_DIR}
307 PATH_SUFFIXES "Debug"
308 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
309 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static
310 PATHS ${ARMCOMPUTE_BUILD_DIR}
311 PATH_SUFFIXES "Release"
312 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
313
314 # In case it wasn't there, try a default search (will work in cases where
315 # the library has been installed into a standard location)
316 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static)
317 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static)
318 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core-static)
319 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core-static)
320
Matthew Bentham6445cff2020-03-10 11:13:17 +0000321 # In case it wasn't there, try the dynamic libraries
322 # This case will get used in a linux setup where the Compute Library
323 # has been installed in a standard system library path as a dynamic library
324 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute)
325 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute)
326 find_library(ARMCOMPUTE_CORE_LIBRARY_DEBUG NAMES arm_compute_core)
327 find_library(ARMCOMPUTE_CORE_LIBRARY_RELEASE NAMES arm_compute_core)
328
telsoa014fcda012018-03-09 14:13:49 +0000329 set(ARMCOMPUTE_LIBRARIES
330 debug ${ARMCOMPUTE_LIBRARY_DEBUG} ${ARMCOMPUTE_CORE_LIBRARY_DEBUG}
331 optimized ${ARMCOMPUTE_LIBRARY_RELEASE} ${ARMCOMPUTE_CORE_LIBRARY_RELEASE} )
332 endif()
333endif()
334
335# ARM Compute NEON backend
336if(ARMCOMPUTENEON)
337 # Add preprocessor definition for ARM Compute NEON
338 add_definitions(-DARMCOMPUTENEON_ENABLED)
339 # The ARM Compute headers contain some NEON intrinsics, so we need to build armnn with NEON support on armv7
340 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7 AND COMPILER_IS_GNU_LIKE)
341 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon")
342 endif()
343endif()
344
345# ARM Compute OpenCL backend
346if(ARMCOMPUTECL)
Nikhil Rajb55d3662021-02-11 14:49:19 +0000347 # verify we have a valid flatbuffers include path
348 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
349 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
350
351 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
352
353 find_library(FLATBUFFERS_LIBRARY
354 NAMES libflatbuffers.a flatbuffers
355 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
356
357 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
358
telsoa014fcda012018-03-09 14:13:49 +0000359 # Always use Arm compute library OpenCL headers
Nikhil Raj407cddf2021-11-30 09:57:08 +0000360 find_path(OPENCL_INCLUDE CL/opencl.hpp
telsoa014fcda012018-03-09 14:13:49 +0000361 PATHS ${ARMCOMPUTE_ROOT}/include
362 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
363
Matthew Bentham3b72db02018-10-11 09:47:01 +0100364 # Link against libOpenCL in opencl-1.2-stubs, but don't search there at runtime
365 link_libraries(-L${ARMCOMPUTE_BUILD_DIR}/opencl-1.2-stubs)
366 set(OPENCL_LIBRARIES OpenCL)
telsoa014fcda012018-03-09 14:13:49 +0000367
Matthew Bentham416b41d2020-02-05 22:15:26 +0000368 include_directories(SYSTEM ${OPENCL_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000369
370 # Add preprocessor definition for ARM Compute OpenCL
371 add_definitions(-DARMCOMPUTECL_ENABLED)
372
373 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DARM_COMPUTE_DEBUG_ENABLED")
374endif()
375
376# Used by both Arm Compute backends, but should be added
377# to the search path after the system directories if necessary
378if(ARMCOMPUTENEON OR ARMCOMPUTECL)
379 find_path(HALF_INCLUDE half/half.hpp)
380 find_path(HALF_INCLUDE half/half.hpp
381 PATHS ${ARMCOMPUTE_ROOT}/include
382 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa01c577f2c2018-08-31 09:22:23 +0100383 include_directories(SYSTEM ${HALF_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000384endif()
385
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100386# ArmNN reference backend
387if(ARMNNREF)
388 add_definitions(-DARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100389endif()
390
Matthew Sloyanc01da452023-01-23 10:20:04 +0000391# If a backend requires TOSA common, add it here.
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100392if(ARMNNTOSAREF)
Matthew Sloyanc01da452023-01-23 10:20:04 +0000393 set(ARMNNTOSACOMMON ON)
394endif()
395
396if(ARMNNTOSACOMMON)
397 # 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 +0100398 message(STATUS "TOSA serialization library root set to ${TOSA_SERIALIZATION_LIB_ROOT}")
399
Matthew Sloyand646b552022-10-10 12:42:16 +0100400 find_path(TOSA_SERIALIZATION_LIB_INCLUDE tosa_serialization_handler.h
401 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/include)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100402 message(STATUS "TOSA serialization library include directory located at: ${TOSA_SERIALIZATION_LIB_INCLUDE}")
403
404 find_library(TOSA_SERIALIZATION_LIB
Matthew Sloyand646b552022-10-10 12:42:16 +0100405 NAMES tosa_serialization_lib.a tosa_serialization_lib
406 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100407 message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
Matthew Sloyand646b552022-10-10 12:42:16 +0100408
Matthew Sloyanc01da452023-01-23 10:20:04 +0000409 # Include required headers for TOSA Serialization Library
410 include_directories(SYSTEM ${FLATBUFFERS_INCLUDE_PATH})
411 include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/half)
412 include_directories(SYSTEM ${TOSA_SERIALIZATION_LIB_INCLUDE})
413endif()
414
415# ArmNN TOSA reference backend
416if(ARMNNTOSAREF)
417 # Locate the includes for the TOSA Reference Model, which is specific to the TOSA Reference Backend.
Matthew Sloyand646b552022-10-10 12:42:16 +0100418 message(STATUS "TOSA Reference Model root set to ${TOSA_REFERENCE_MODEL_ROOT}")
419
420 find_path(TOSA_REFERENCE_MODEL_INCLUDE model_runner.h
421 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/include)
422 message(STATUS "TOSA Reference Model include directory located at: ${TOSA_REFERENCE_MODEL_INCLUDE}")
423
Matthew Sloyanc01da452023-01-23 10:20:04 +0000424 include_directories(SYSTEM ${TOSA_REFERENCE_MODEL_INCLUDE})
425
Matthew Sloyand646b552022-10-10 12:42:16 +0100426 find_library(TOSA_REFERENCE_MODEL_LIB
427 NAMES tosa_reference_model_lib.a tosa_reference_model_lib
428 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
429 message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
Matthew Sloyan67fd5262022-12-07 19:28:18 +0000430
431 if(TOSA_REFERENCE_MODEL_OUTPUT)
432 add_definitions("-DTOSA_REFERENCE_MODEL_OUTPUT=1")
433 endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100434endif()
435
Colm Donelanaa93d982020-06-28 08:16:46 +0100436# This is the root for the dynamic backend tests to search for dynamic
437# backends. By default it will be the project build directory.
Rob Hughes35c31c02020-08-17 15:47:20 +0100438add_definitions(-DDYNAMIC_BACKEND_BUILD_DIR="${PROJECT_BINARY_DIR}")
Colm Donelanaa93d982020-06-28 08:16:46 +0100439
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +0000440# ArmNN dynamic backend
441if(DYNAMIC_BACKEND_PATHS)
442 add_definitions(-DARMNN_DYNAMIC_BACKEND_ENABLED)
443endif()
444
Narumol Prangnawarat867eba52020-02-03 12:29:56 +0000445if(SAMPLE_DYNAMIC_BACKEND)
446 add_definitions(-DSAMPLE_DYNAMIC_BACKEND_ENABLED)
447endif()
448
telsoa014fcda012018-03-09 14:13:49 +0000449# Streamline annotate
450if(PROFILING_BACKEND_STREAMLINE)
451 include_directories("${GATOR_ROOT}/annotate")
452 add_definitions(-DARMNN_STREAMLINE_ENABLED)
453endif()
454
Ryan OSheab5540542022-07-06 09:52:52 +0100455if(NOT BUILD_BARE_METAL AND NOT EXECUTE_NETWORK_STATIC)
telsoa01c577f2c2018-08-31 09:22:23 +0100456if(HEAP_PROFILING OR LEAK_CHECKING)
Kevin May1bbfaca2022-11-22 11:58:05 +0000457 find_path(HEAP_PROFILER_INCLUDE gperftools/heap-profiler.h
458 PATHS ${GPERFTOOLS_ROOT}/include
459 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
460 include_directories(SYSTEM "${HEAP_PROFILER_INCLUDE}")
461 find_library(GPERF_TOOLS_LIBRARY
462 NAMES tcmalloc_debug
463 HINTS ${GPERFTOOLS_ROOT}/lib)
464 link_directories(${GPERFTOOLS_ROOT}/lib)
surmeh013537c2c2018-05-18 16:31:43 +0100465
Kevin May1bbfaca2022-11-22 11:58:05 +0000466 link_libraries(${GPERF_TOOLS_LIBRARY})
467 if (HEAP_PROFILING)
468 add_definitions("-DARMNN_HEAP_PROFILING_ENABLED=1")
469 endif()
470 if (LEAK_CHECKING)
471 add_definitions("-DARMNN_LEAK_CHECKING_ENABLED=1")
surmeh013537c2c2018-05-18 16:31:43 +0100472 endif()
473else()
474 # Valgrind only works with gperftools version number <= 2.4
475 CHECK_INCLUDE_FILE(valgrind/memcheck.h VALGRIND_FOUND)
476endif()
Jim Flynn870b96c2022-03-25 21:24:56 +0000477endif()
surmeh013537c2c2018-05-18 16:31:43 +0100478
telsoa01c577f2c2018-08-31 09:22:23 +0100479if(NOT BUILD_TF_LITE_PARSER)
480 message(STATUS "Tensorflow Lite parser support is disabled")
481endif()
David Beck10b4dfd2018-09-19 12:03:20 +0100482
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000483if(NOT BUILD_ARMNN_SERIALIZER)
484 message(STATUS "Armnn Serializer support is disabled")
485endif()
486
Pavel Macenauer59e057f2020-04-15 14:17:26 +0000487if(NOT BUILD_PYTHON_WHL)
488 message(STATUS "PyArmNN wheel package is disabled")
489endif()
490
491if(NOT BUILD_PYTHON_SRC)
492 message(STATUS "PyArmNN source package is disabled")
493endif()
494
495if(BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
496 find_package(PythonInterp 3 REQUIRED)
497 if(NOT ${PYTHONINTERP_FOUND})
498 message(FATAL_ERROR "Python 3.x required to build PyArmNN, but not found")
499 endif()
500
501 find_package(PythonLibs 3 REQUIRED)
502 if(NOT ${PYTHONLIBS_FOUND})
503 message(FATAL_ERROR "Python 3.x development package required to build PyArmNN, but not found")
504 endif()
505
506 find_package(SWIG 4 REQUIRED)
507 if(NOT ${SWIG_FOUND})
508 message(FATAL_ERROR "SWIG 4.x requried to build PyArmNN, but not found")
509 endif()
510endif()
511
David Beck10b4dfd2018-09-19 12:03:20 +0100512# ArmNN source files required for all build options
513include_directories(SYSTEM third-party)