blob: feeaef1c60d08f7f42e29145e57b0f325211e857 [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)
Ryan OSheaa3dc95e2023-03-20 11:10:40 +000010option(ARMNN_SAMPLE_APPS_ENABLED "Build Sample ArmNN Applications" ON)
telsoa014fcda012018-03-09 14:13:49 +000011option(BUILD_FOR_COVERAGE "Use no optimization and output .gcno and .gcda files" OFF)
12option(ARMCOMPUTENEON "Build with ARM Compute NEON support" OFF)
13option(ARMCOMPUTECL "Build with ARM Compute OpenCL support" OFF)
David Monahan8a570462023-11-22 13:24:25 +000014option(ARMCOMPUTEGPUFSA "Build with GPU Dynamic Fusion Backend" OFF)
Matteo Martincighf88663c2019-08-28 16:38:53 +010015option(ARMNNREF "Build with ArmNN reference support" ON)
Matthew Sloyand646b552022-10-10 12:42:16 +010016option(ARMNNTOSAREF "Build with TOSA reference support" OFF)
telsoa014fcda012018-03-09 14:13:49 +000017option(PROFILING_BACKEND_STREAMLINE "Forward the armNN profiling events to DS-5/Streamline as annotations" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010018# options used for heap profiling and leak checking
surmeh013537c2c2018-05-18 16:31:43 +010019option(HEAP_PROFILING "Build with heap profiling enabled" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010020option(LEAK_CHECKING "Build with leak checking enabled" OFF)
surmeh013537c2c2018-05-18 16:31:43 +010021option(GPERFTOOLS_ROOT "Location where the gperftools 'include' and 'lib' folders to be found" Off)
telsoa01c577f2c2018-08-31 09:22:23 +010022# options used for tensorflow lite support
23option(BUILD_TF_LITE_PARSER "Build Tensorflow Lite parser" OFF)
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +000024option(BUILD_ARMNN_SERIALIZER "Build Armnn Serializer" OFF)
Éanna Ó Catháina563b922019-05-09 11:34:06 +010025option(BUILD_ACCURACY_TOOL "Build Accuracy Tool" OFF)
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +000026option(FLATC_DIR "Path to Flatbuffers compiler" OFF)
telsoa01c577f2c2018-08-31 09:22:23 +010027option(TF_LITE_GENERATED_PATH "Tensorflow lite generated C++ schema location" OFF)
28option(FLATBUFFERS_ROOT "Location where the flatbuffers 'include' and 'lib' folders to be found" Off)
Matthew Sloyand646b552022-10-10 12:42:16 +010029option(TOSA_SERIALIZATION_LIB_ROOT "Location where the TOSA Serialization Library 'include' and 'lib' folders can be found" OFF)
30option(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 +000031option(TOSA_REFERENCE_MODEL_OUTPUT "TOSA Reference Model output is printed during layer support checks" ON)
Matteo Martincighe7d44982019-08-05 12:16:47 +010032option(DYNAMIC_BACKEND_PATHS "Colon seperated list of paths where to load the dynamic backends from" "")
Colm Donelan0dbe00a2020-06-03 08:00:28 +010033option(SAMPLE_DYNAMIC_BACKEND "Include the sample dynamic backend and its tests in the build" OFF)
Colm Donelana21620d2019-10-11 13:09:49 +010034option(BUILD_GATORD_MOCK "Build the Gatord simulator for external profiling testing." ON)
Sadik Armagan6f86b692020-03-09 11:04:32 +000035option(BUILD_TIMELINE_DECODER "Build the Timeline Decoder for external profiling." ON)
Finn Williams2ed809c2020-04-20 21:21:07 +010036option(BUILD_BASE_PIPE_SERVER "Build the server to handle external profiling pipe traffic" ON)
Pavel Macenauer59e057f2020-04-15 14:17:26 +000037option(BUILD_PYTHON_WHL "Build Python wheel package" OFF)
38option(BUILD_PYTHON_SRC "Build Python source package" OFF)
Jim Flynnbbfe6032020-07-20 16:57:44 +010039option(BUILD_STATIC_PIPE_LIBS "Build Static PIPE libraries" OFF)
40option(BUILD_PIPE_ONLY "Build the PIPE libraries only" OFF)
Teresa Charlinad1b3d72023-03-14 12:10:28 +000041option(BUILD_CLASSIC_DELEGATE "Build the Arm NN TfLite delegate" OFF)
42option(BUILD_OPAQUE_DELEGATE "Build the Arm NN TfLite Opaque delegate" OFF)
Jim Flynne1fdd282021-10-26 21:26:10 +010043option(BUILD_MEMORY_STRATEGY_BENCHMARK "Build the MemoryBenchmark" OFF)
Jim Flynn870b96c2022-03-25 21:24:56 +000044option(BUILD_BARE_METAL "Disable features requiring operating system support" OFF)
Jan Eilersa96489a2021-12-08 10:05:47 +000045option(BUILD_SHARED_LIBS "Determines if Armnn will be built statically or dynamically.
46 This is an experimental feature and not fully supported.
47 Only the ArmNN core and the Delegate can be built statically." ON)
Colm Donelan22107e22024-04-23 14:19:22 +010048option(BUILD_ACL_OPENMP "If enabled statically link the OpenMP scheduler for ACL.
49 Note: ACL must already be built with openmp=1 cppthreads=0" OFF)
Ryan OSheab5540542022-07-06 09:52:52 +010050option(EXECUTE_NETWORK_STATIC " This is a limited experimental build that is entirely static.
51 It currently only supports being set by changing the current CMake default options like so:
52 BUILD_TF_LITE_PARSER=1/0
53 BUILD_ARMNN_SERIALIZER=1/0
54 ARMCOMPUTENEON=1/0
55 ARMNNREF=1/0
56 ARMCOMPUTECL=0
57 BUILD_ONNX_PARSER=0
Teresa Charlinad1b3d72023-03-14 12:10:28 +000058 BUILD_CLASSIC_DELEGATE=0
59 BUILD_OPAQUE_DELEGATE=0
Ryan OSheab5540542022-07-06 09:52:52 +010060 BUILD_TIMELINE_DECODER=0
61 BUILD_BASE_PIPE_SERVER=0
62 BUILD_UNIT_TESTS=0
Ryan OSheaa3dc95e2023-03-20 11:10:40 +000063 ARMNN_SAMPLE_APPS_ENABLED=0
64 BUILD_SHARED_LIBS=0
65 BUILD_GATORD_MOCK=0
66 HEAP_PROFILING=0
67 LEAK_CHECKING=0" OFF)
telsoa014fcda012018-03-09 14:13:49 +000068
Teresa Charlinad1b3d72023-03-14 12:10:28 +000069if(BUILD_ARMNN_TFLITE_DELEGATE)
70 message(BUILD_ARMNN_TFLITE_DELEGATE option is deprecated, it will be removed in 24.02, please use BUILD_CLASSIC_DELEGATE instead)
71 set(BUILD_CLASSIC_DELEGATE 1)
72endif()
73
telsoa014fcda012018-03-09 14:13:49 +000074include(SelectLibraryConfigurations)
75
76set(COMPILER_IS_GNU_LIKE 0)
Jim Flynn82262f52020-07-16 11:23:45 +010077if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
78 ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
79 ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
telsoa014fcda012018-03-09 14:13:49 +000080 set(COMPILER_IS_GNU_LIKE 1)
81endif()
82
83# Enable CCache if available and not disabled
84option(USE_CCACHE "USE_CCACHE" ON)
85find_program(CCACHE_FOUND ccache)
86if(CCACHE_FOUND AND USE_CCACHE)
87 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
88 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "CCACHE_CPP2=yes ${rule_launch_compile} ccache")
89endif()
90
91# Enable distcc if available and not disabled
92option(USE_DISTCC "USE_DISTCC" OFF)
93find_program(DISTCC_FOUND distcc)
94if(DISTCC_FOUND AND USE_DISTCC)
95 get_property(rule_launch_compile DIRECTORY PROPERTY RULE_LAUNCH_COMPILE)
96 set_property(DIRECTORY PROPERTY RULE_LAUNCH_COMPILE "${rule_launch_compile} distcc")
97endif()
98
99# Set to release configuration by default
100if(NOT CMAKE_BUILD_TYPE)
101 set(CMAKE_BUILD_TYPE "Release")
102endif()
103
104# Compiler flags that are always set
105set(CMAKE_POSITION_INDEPENDENT_CODE ON)
106if(COMPILER_IS_GNU_LIKE)
Ryan OShea238ecd92023-03-07 11:44:23 +0000107 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 +0100108 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
109 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
110 endif()
telsoa014fcda012018-03-09 14:13:49 +0000111elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Jim Flynn870b96c2022-03-25 21:24:56 +0000112 # Disable C4996 (use of deprecated identifier) due to
113 # https://developercommunity.visualstudio.com/content/problem/252574/deprecated-compilation-warning-for-virtual-overrid.html
Rob Hughesfc6bf052019-12-16 17:10:51 +0000114 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /wd4996")
Rob Hughesbc873d22020-05-20 13:11:37 +0100115 add_definitions(-DNO_STRICT=1)
telsoa014fcda012018-03-09 14:13:49 +0000116endif()
117if("${CMAKE_SYSTEM_NAME}" STREQUAL Android)
Keith Davisb8942bf2021-05-31 11:22:35 +0100118 # -lz is necessary for when building with ACL set with compressed kernels
119 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -llog -lz")
120 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog -lz")
telsoa014fcda012018-03-09 14:13:49 +0000121endif()
122
123# Compiler flags for Release builds
Matthew Benthame30054f2019-06-24 13:10:54 +0100124set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
telsoa014fcda012018-03-09 14:13:49 +0000125if(COMPILER_IS_GNU_LIKE)
126 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
127elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
128 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2")
129endif()
130
131# Compiler flags for Debug builds
132if(COMPILER_IS_GNU_LIKE)
Matthew Benthame30054f2019-06-24 13:10:54 +0100133 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
telsoa014fcda012018-03-09 14:13:49 +0000134elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
Matthew Benthame30054f2019-06-24 13:10:54 +0100135 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI /Od")
telsoa014fcda012018-03-09 14:13:49 +0000136 # Disable SAFESEH which is necessary for Edit and Continue to work
137 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
138 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /SAFESEH:NO")
139endif()
140
141# Modify RelWithDebInfo so that NDEBUG isn't defined.
142# This enables asserts.
143if (COMPILER_IS_GNU_LIKE)
144 string(REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
145elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
146 string(REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
147endif()
148
149# Compiler flags for code coverage measurements
150if(BUILD_FOR_COVERAGE)
151 if(NOT CMAKE_BUILD_TYPE EQUAL "Debug")
152 message(WARNING "BUILD_FOR_COVERAGE set so forcing to Debug build")
153 set(CMAKE_BUILD_TYPE "Debug")
154 endif()
155
156 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
157 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
158endif()
159
160if(BUILD_FOR_COVERAGE AND NOT BUILD_UNIT_TESTS)
161 message(WARNING "BUILD_FOR_COVERAGE set but not BUILD_UNIT_TESTS, so code coverage will not be able to run")
162endif()
163
164set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
165
Derek Lambertieac4adb2020-08-25 13:05:59 +0100166include(CMakeFindDependencyMacro)
167
Ryan OSheab5540542022-07-06 09:52:52 +0100168
169if(EXECUTE_NETWORK_STATIC)
170 add_definitions(-DARMNN_DISABLE_SOCKETS
Ryan OSheaa3dc95e2023-03-20 11:10:40 +0000171 -DARMNN_STUB_PROFILING
172 -DARMNN_DISABLE_DYNAMIC_BACKENDS)
173 set(ARMNN_SAMPLE_APPS_ENABLED 0)
174 set(DISABLE_DYNAMIC_BACKENDS 1)
175 set(BUILD_SHARED_LIBS 0)
Ryan OSheab5540542022-07-06 09:52:52 +0100176endif()
177
178if(BUILD_BARE_METAL)
179 add_definitions(-DARMNN_BUILD_BARE_METAL
Ryan OSheaa3dc95e2023-03-20 11:10:40 +0000180 -DARMNN_DISABLE_FILESYSTEM
181 -DARMNN_DISABLE_PROCESSES
182 -DARMNN_DISABLE_THREADS
183 -DARMNN_DISABLE_SOCKETS
184 -DARMNN_STUB_PROFILING
185 -DARMNN_DISABLE_DYNAMIC_BACKENDS)
186 set(DISABLE_DYNAMIC_BACKENDS 1)
187 set(BUILD_SHARED_LIBS 0)
Ryan OSheab5540542022-07-06 09:52:52 +0100188endif()
189
Jim Flynnbbfe6032020-07-20 16:57:44 +0100190if (NOT BUILD_PIPE_ONLY)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100191 # cxxopts (Alternative to boost::program_options)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200192 find_path(CXXOPTS_INCLUDE cxxopts/cxxopts.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100193 include_directories(SYSTEM "${CXXOPTS_INCLUDE}")
194endif()
Jan Eilers7e989832020-06-19 11:47:21 +0100195
Jim Flynnbbfe6032020-07-20 16:57:44 +0100196if (NOT BUILD_PIPE_ONLY)
197 # ghc (Alternative to boost::filesystem)
Vincent ABRIOU54940192020-09-03 13:02:43 +0200198 find_path(GHC_INCLUDE ghc/filesystem.hpp PATHS third-party NO_CMAKE_FIND_ROOT_PATH)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100199 include_directories(SYSTEM "${GHC_INCLUDE}")
200endif()
Jan Eilers307fd342020-06-23 14:16:04 +0100201
Nikhil Raj23a6d002023-01-17 11:24:01 +0000202# JNI_BUILD has DBUILD_SHARED_LIBS set to 0 and not finding libs while building
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000203# hence added NOT BUILD_CLASSIC_DELEGATE/BUILD_OPAQUE_DELEGATE condition
204if(NOT BUILD_SHARED_LIBS AND NOT BUILD_CLASSIC_DELEGATE AND NOT BUILD_OPAQUE_DELEGATE)
Ryan OSheab5540542022-07-06 09:52:52 +0100205 set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
206endif()
207
telsoa014fcda012018-03-09 14:13:49 +0000208# pthread
Jim Flynn870b96c2022-03-25 21:24:56 +0000209if (NOT BUILD_BARE_METAL)
210find_package(Threads)
211endif()
telsoa014fcda012018-03-09 14:13:49 +0000212
Ryan OSheab5540542022-07-06 09:52:52 +0100213if (EXECUTE_NETWORK_STATIC)
214 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -pthread")
215endif()
216
telsoa014fcda012018-03-09 14:13:49 +0000217# Favour the protobuf passed on command line
Nikhil Raj5d955cf2021-04-19 16:59:48 +0100218if(BUILD_ONNX_PARSER)
telsoa014fcda012018-03-09 14:13:49 +0000219 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd"
220 PATHS ${PROTOBUF_ROOT}/lib
221 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
222 find_library(PROTOBUF_LIBRARY_DEBUG NAMES "protobufd")
223
224 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf"
225 PATHS ${PROTOBUF_ROOT}/lib
226 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
227 find_library(PROTOBUF_LIBRARY_RELEASE NAMES "protobuf")
228
229 select_library_configurations(PROTOBUF)
230
231 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h"
232 PATHS ${PROTOBUF_ROOT}/include
233 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
234 find_path(PROTOBUF_INCLUDE_DIRS "google/protobuf/message.h")
235
236 include_directories(SYSTEM "${PROTOBUF_INCLUDE_DIRS}")
237 add_definitions(-DPROTOBUF_USE_DLLS)
telsoa014fcda012018-03-09 14:13:49 +0000238
telsoa01c577f2c2018-08-31 09:22:23 +0100239 add_definitions(-DARMNN_ONNX_PARSER)
240
241 find_path(ONNX_GENERATED_SOURCES "onnx/onnx.pb.cc")
242
243 # C++ headers generated for onnx protobufs
244 include_directories(SYSTEM "${ONNX_GENERATED_SOURCES}")
245endif()
246
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000247if(BUILD_CLASSIC_DELEGATE)
Sadik Armagan5d03e312020-11-17 16:43:56 +0000248 add_definitions(-DARMNN_TFLITE_DELEGATE)
249endif()
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000250
Teresa Charlinad1b3d72023-03-14 12:10:28 +0000251if(BUILD_OPAQUE_DELEGATE)
Matthew Sloyan9cb5bb62023-03-06 17:09:22 +0000252 add_definitions(-DARMNN_TFLITE_OPAQUE_DELEGATE)
253endif()
254
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100255# Flatbuffers support for TF Lite, Armnn Serializer or the TOSA backend.
256if(BUILD_TF_LITE_PARSER OR BUILD_ARMNN_SERIALIZER OR ARMNNTOSAREF)
telsoa01c577f2c2018-08-31 09:22:23 +0100257 # verify we have a valid flatbuffers include path
258 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
259 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
260
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000261 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
telsoa01c577f2c2018-08-31 09:22:23 +0100262
263 find_library(FLATBUFFERS_LIBRARY
264 NAMES libflatbuffers.a flatbuffers
265 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
266
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000267 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000268endif()
269
270# Flatbuffers schema support for TF Lite
271if(BUILD_TF_LITE_PARSER)
272 find_path(TF_LITE_SCHEMA_INCLUDE_PATH
273 schema_generated.h
274 HINTS ${TF_LITE_GENERATED_PATH})
275
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000276 message(STATUS "Tf Lite generated header found at: ${TF_LITE_SCHEMA_INCLUDE_PATH}")
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000277
Matthew Benthamd1ae3a62019-02-22 17:30:32 +0000278 add_definitions(-DARMNN_TF_LITE_PARSER)
telsoa01c577f2c2018-08-31 09:22:23 +0100279endif()
280
Kevin May43a799c2019-02-08 16:31:42 +0000281if(BUILD_ARMNN_SERIALIZER)
Kevin May43a799c2019-02-08 16:31:42 +0000282 add_definitions(-DARMNN_SERIALIZER)
Matthew Bentham268509a2019-02-25 13:58:24 +0000283 add_definitions(-DARMNN_SERIALIZER_SCHEMA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/src/armnnSerializer/ArmnnSchema.fbs")
Kevin May43a799c2019-02-08 16:31:42 +0000284endif()
285
telsoa014fcda012018-03-09 14:13:49 +0000286include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Sadik Armagana97a0be2020-03-03 10:44:56 +0000287include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling)
telsoa014fcda012018-03-09 14:13:49 +0000288
289# ARM Compute
290# Note that ARM Compute has a different folder layout depending on the branch but also on
291# whether it comes from a prepackaged archive (this is why we add several hints below)
David Monahan8a570462023-11-22 13:24:25 +0000292if(ARMCOMPUTENEON OR ARMCOMPUTECL OR ARMCOMPUTEGPUFSA)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000293 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h
telsoa014fcda012018-03-09 14:13:49 +0000294 PATHS ${ARMCOMPUTE_ROOT}/include
295 PATHS ${ARMCOMPUTE_ROOT}/applications/arm_compute
296 PATHS ${ARMCOMPUTE_ROOT}
297 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
Francis Murtagh82490ee2020-11-04 13:33:41 +0000298 find_path(ARMCOMPUTE_INCLUDE arm_compute/core/CL/OpenCL.h)
telsoa014fcda012018-03-09 14:13:49 +0000299 include_directories(SYSTEM "${ARMCOMPUTE_INCLUDE}")
300
301 # Find the Arm Compute libraries if not already specified (the user may have already defined this in advance,
302 # e.g. if building clframework as a dependent cmake project)
303 if (NOT DEFINED ARMCOMPUTE_LIBRARIES)
304 # We link to the static variant so that customers don't need to find and build a compatible version of clframework.
305 # First try the folders specified ARMCOMPUTE_BUILD_DIR (with PATH_SUFFIXES for
306 # Windows builds)
Matthew Bentham2624dd72020-05-20 10:44:18 +0100307 if ((NOT DEFINED ARMCOMPUTE_BUILD_DIR) AND (DEFINED ARMCOMPUTE_ROOT))
308 # Default build directory for ComputeLibrary is under the root
309 set(ARMCOMPUTE_BUILD_DIR ${ARMCOMPUTE_ROOT}/build)
310 endif()
311
telsoa014fcda012018-03-09 14:13:49 +0000312 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static
313 PATHS ${ARMCOMPUTE_BUILD_DIR}
314 PATH_SUFFIXES "Debug"
315 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
316 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static
317 PATHS ${ARMCOMPUTE_BUILD_DIR}
318 PATH_SUFFIXES "Release"
319 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa014fcda012018-03-09 14:13:49 +0000320
321 # In case it wasn't there, try a default search (will work in cases where
322 # the library has been installed into a standard location)
323 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute-static)
324 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute-static)
telsoa014fcda012018-03-09 14:13:49 +0000325
Matthew Bentham6445cff2020-03-10 11:13:17 +0000326 # In case it wasn't there, try the dynamic libraries
327 # This case will get used in a linux setup where the Compute Library
328 # has been installed in a standard system library path as a dynamic library
329 find_library(ARMCOMPUTE_LIBRARY_DEBUG NAMES arm_compute)
330 find_library(ARMCOMPUTE_LIBRARY_RELEASE NAMES arm_compute)
Matthew Bentham6445cff2020-03-10 11:13:17 +0000331
telsoa014fcda012018-03-09 14:13:49 +0000332 set(ARMCOMPUTE_LIBRARIES
Nikhil Raj4179c6a2023-11-24 10:19:40 +0000333 debug ${ARMCOMPUTE_LIBRARY_DEBUG}
334 optimized ${ARMCOMPUTE_LIBRARY_RELEASE} )
telsoa014fcda012018-03-09 14:13:49 +0000335 endif()
336endif()
337
338# ARM Compute NEON backend
339if(ARMCOMPUTENEON)
340 # Add preprocessor definition for ARM Compute NEON
341 add_definitions(-DARMCOMPUTENEON_ENABLED)
342 # The ARM Compute headers contain some NEON intrinsics, so we need to build armnn with NEON support on armv7
343 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES armv7 AND COMPILER_IS_GNU_LIKE)
344 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon")
345 endif()
346endif()
347
348# ARM Compute OpenCL backend
David Monahan8a570462023-11-22 13:24:25 +0000349if(ARMCOMPUTECL OR ARMCOMPUTEGPUFSA)
Nikhil Rajb55d3662021-02-11 14:49:19 +0000350 # verify we have a valid flatbuffers include path
351 find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
352 HINTS ${FLATBUFFERS_ROOT}/include /usr/local/include /usr/include)
353
354 message(STATUS "Flatbuffers headers are located at: ${FLATBUFFERS_INCLUDE_PATH}")
355
356 find_library(FLATBUFFERS_LIBRARY
357 NAMES libflatbuffers.a flatbuffers
358 HINTS ${FLATBUFFERS_ROOT}/lib /usr/local/lib /usr/lib)
359
360 message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
361
telsoa014fcda012018-03-09 14:13:49 +0000362 # Always use Arm compute library OpenCL headers
Nikhil Raj407cddf2021-11-30 09:57:08 +0000363 find_path(OPENCL_INCLUDE CL/opencl.hpp
telsoa014fcda012018-03-09 14:13:49 +0000364 PATHS ${ARMCOMPUTE_ROOT}/include
365 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
366
Matthew Bentham3b72db02018-10-11 09:47:01 +0100367 # Link against libOpenCL in opencl-1.2-stubs, but don't search there at runtime
368 link_libraries(-L${ARMCOMPUTE_BUILD_DIR}/opencl-1.2-stubs)
369 set(OPENCL_LIBRARIES OpenCL)
telsoa014fcda012018-03-09 14:13:49 +0000370
Matthew Bentham416b41d2020-02-05 22:15:26 +0000371 include_directories(SYSTEM ${OPENCL_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000372
David Monahan8a570462023-11-22 13:24:25 +0000373 if(ARMCOMPUTECL)
374 # Add preprocessor definition for ARM Compute OpenCL
375 add_definitions(-DARMCOMPUTECL_ENABLED)
376 endif()
377
378 if(ARMCOMPUTEGPUFSA)
379 # Add preprocessor definition for ARM Compute OpenCL with Fusion
380 add_definitions(-DARMCOMPUTEGPUFSA_ENABLED)
381 endif()
telsoa014fcda012018-03-09 14:13:49 +0000382
383 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DARM_COMPUTE_DEBUG_ENABLED")
384endif()
385
386# Used by both Arm Compute backends, but should be added
387# to the search path after the system directories if necessary
David Monahan8a570462023-11-22 13:24:25 +0000388if(ARMCOMPUTENEON OR ARMCOMPUTECL OR ARMCOMPUTEGPUFSA)
telsoa014fcda012018-03-09 14:13:49 +0000389 find_path(HALF_INCLUDE half/half.hpp)
390 find_path(HALF_INCLUDE half/half.hpp
391 PATHS ${ARMCOMPUTE_ROOT}/include
392 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
telsoa01c577f2c2018-08-31 09:22:23 +0100393 include_directories(SYSTEM ${HALF_INCLUDE})
telsoa014fcda012018-03-09 14:13:49 +0000394endif()
395
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100396# ArmNN reference backend
397if(ARMNNREF)
398 add_definitions(-DARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100399endif()
400
Matthew Sloyanc01da452023-01-23 10:20:04 +0000401# If a backend requires TOSA common, add it here.
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100402if(ARMNNTOSAREF)
Matthew Sloyanc01da452023-01-23 10:20:04 +0000403 set(ARMNNTOSACOMMON ON)
404endif()
405
406if(ARMNNTOSACOMMON)
407 # 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 +0100408 message(STATUS "TOSA serialization library root set to ${TOSA_SERIALIZATION_LIB_ROOT}")
409
Matthew Sloyand646b552022-10-10 12:42:16 +0100410 find_path(TOSA_SERIALIZATION_LIB_INCLUDE tosa_serialization_handler.h
411 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/include)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100412 message(STATUS "TOSA serialization library include directory located at: ${TOSA_SERIALIZATION_LIB_INCLUDE}")
413
414 find_library(TOSA_SERIALIZATION_LIB
Matthew Sloyand646b552022-10-10 12:42:16 +0100415 NAMES tosa_serialization_lib.a tosa_serialization_lib
416 HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100417 message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
Matthew Sloyand646b552022-10-10 12:42:16 +0100418
Matthew Sloyanc01da452023-01-23 10:20:04 +0000419 # Include required headers for TOSA Serialization Library
420 include_directories(SYSTEM ${FLATBUFFERS_INCLUDE_PATH})
421 include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/half)
422 include_directories(SYSTEM ${TOSA_SERIALIZATION_LIB_INCLUDE})
423endif()
424
425# ArmNN TOSA reference backend
426if(ARMNNTOSAREF)
427 # Locate the includes for the TOSA Reference Model, which is specific to the TOSA Reference Backend.
Matthew Sloyand646b552022-10-10 12:42:16 +0100428 message(STATUS "TOSA Reference Model root set to ${TOSA_REFERENCE_MODEL_ROOT}")
429
430 find_path(TOSA_REFERENCE_MODEL_INCLUDE model_runner.h
431 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/include)
432 message(STATUS "TOSA Reference Model include directory located at: ${TOSA_REFERENCE_MODEL_INCLUDE}")
433
Matthew Sloyanc01da452023-01-23 10:20:04 +0000434 include_directories(SYSTEM ${TOSA_REFERENCE_MODEL_INCLUDE})
435
Matthew Sloyand646b552022-10-10 12:42:16 +0100436 find_library(TOSA_REFERENCE_MODEL_LIB
437 NAMES tosa_reference_model_lib.a tosa_reference_model_lib
438 HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
439 message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
Matthew Sloyan67fd5262022-12-07 19:28:18 +0000440
441 if(TOSA_REFERENCE_MODEL_OUTPUT)
442 add_definitions("-DTOSA_REFERENCE_MODEL_OUTPUT=1")
443 endif()
Cathal Corbett9c9d5b92022-08-17 17:30:16 +0100444endif()
445
Colm Donelanaa93d982020-06-28 08:16:46 +0100446# This is the root for the dynamic backend tests to search for dynamic
447# backends. By default it will be the project build directory.
Rob Hughes35c31c02020-08-17 15:47:20 +0100448add_definitions(-DDYNAMIC_BACKEND_BUILD_DIR="${PROJECT_BINARY_DIR}")
Colm Donelanaa93d982020-06-28 08:16:46 +0100449
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +0000450# ArmNN dynamic backend
451if(DYNAMIC_BACKEND_PATHS)
452 add_definitions(-DARMNN_DYNAMIC_BACKEND_ENABLED)
453endif()
454
Narumol Prangnawarat867eba52020-02-03 12:29:56 +0000455if(SAMPLE_DYNAMIC_BACKEND)
456 add_definitions(-DSAMPLE_DYNAMIC_BACKEND_ENABLED)
457endif()
458
telsoa014fcda012018-03-09 14:13:49 +0000459# Streamline annotate
460if(PROFILING_BACKEND_STREAMLINE)
461 include_directories("${GATOR_ROOT}/annotate")
462 add_definitions(-DARMNN_STREAMLINE_ENABLED)
463endif()
464
telsoa01c577f2c2018-08-31 09:22:23 +0100465if(HEAP_PROFILING OR LEAK_CHECKING)
Kevin May1bbfaca2022-11-22 11:58:05 +0000466 find_path(HEAP_PROFILER_INCLUDE gperftools/heap-profiler.h
467 PATHS ${GPERFTOOLS_ROOT}/include
468 NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
469 include_directories(SYSTEM "${HEAP_PROFILER_INCLUDE}")
470 find_library(GPERF_TOOLS_LIBRARY
471 NAMES tcmalloc_debug
472 HINTS ${GPERFTOOLS_ROOT}/lib)
473 link_directories(${GPERFTOOLS_ROOT}/lib)
surmeh013537c2c2018-05-18 16:31:43 +0100474
Kevin May1bbfaca2022-11-22 11:58:05 +0000475 link_libraries(${GPERF_TOOLS_LIBRARY})
476 if (HEAP_PROFILING)
477 add_definitions("-DARMNN_HEAP_PROFILING_ENABLED=1")
478 endif()
479 if (LEAK_CHECKING)
480 add_definitions("-DARMNN_LEAK_CHECKING_ENABLED=1")
surmeh013537c2c2018-05-18 16:31:43 +0100481 endif()
482else()
483 # Valgrind only works with gperftools version number <= 2.4
Ryan OSheaa3dc95e2023-03-20 11:10:40 +0000484 include(CheckIncludeFiles)
485 CHECK_INCLUDE_FILES("valgrind/memcheck.h" VALGRIND_FOUND)
Jim Flynn870b96c2022-03-25 21:24:56 +0000486endif()
surmeh013537c2c2018-05-18 16:31:43 +0100487
telsoa01c577f2c2018-08-31 09:22:23 +0100488if(NOT BUILD_TF_LITE_PARSER)
489 message(STATUS "Tensorflow Lite parser support is disabled")
490endif()
David Beck10b4dfd2018-09-19 12:03:20 +0100491
Nattapat Chaimanowong949f1252019-01-31 15:36:39 +0000492if(NOT BUILD_ARMNN_SERIALIZER)
493 message(STATUS "Armnn Serializer support is disabled")
494endif()
495
Pavel Macenauer59e057f2020-04-15 14:17:26 +0000496if(NOT BUILD_PYTHON_WHL)
497 message(STATUS "PyArmNN wheel package is disabled")
498endif()
499
500if(NOT BUILD_PYTHON_SRC)
501 message(STATUS "PyArmNN source package is disabled")
502endif()
503
504if(BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
505 find_package(PythonInterp 3 REQUIRED)
506 if(NOT ${PYTHONINTERP_FOUND})
507 message(FATAL_ERROR "Python 3.x required to build PyArmNN, but not found")
508 endif()
509
510 find_package(PythonLibs 3 REQUIRED)
511 if(NOT ${PYTHONLIBS_FOUND})
512 message(FATAL_ERROR "Python 3.x development package required to build PyArmNN, but not found")
513 endif()
514
515 find_package(SWIG 4 REQUIRED)
516 if(NOT ${SWIG_FOUND})
517 message(FATAL_ERROR "SWIG 4.x requried to build PyArmNN, but not found")
518 endif()
519endif()
520
David Beck10b4dfd2018-09-19 12:03:20 +0100521# ArmNN source files required for all build options
522include_directories(SYSTEM third-party)