xref: /aosp_15_r20/external/armnn/CMakeLists.txt (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1#
2# Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
3# Copyright © 2020 NXP
4# SPDX-License-Identifier: MIT
5#
6cmake_minimum_required (VERSION 3.7.0)
7project(armnn)
8set(CMAKE_CXX_STANDARD 17)
9set(CMAKE_CXX_STANDARD_REQUIRED ON)
10
11set(additional_cmake_files)
12list(APPEND additional_cmake_files
13    cmake/ArmnnVersion.cmake
14    cmake/ClassicDelegateVersion.cmake
15    cmake/OpaqueDelegateVersion.cmake
16    cmake/ParserVersion.cmake
17    cmake/Utils.cmake
18    cmake/GlobalConfig.cmake
19    cmake/AddDllCopyCommands.cmake
20    cmake/ArmnnTestUtilsVersion.cmake)
21
22foreach(cmake_file ${additional_cmake_files})
23    include(${cmake_file})
24endforeach()
25
26cmake_policy(SET CMP0057 NEW)
27
28# If the root of the tensorflow source tree has not been specified
29# and we are trying to build the tensorflow lite parser make
30# our best guess as to where it will be i.e. one directory above
31# the one this CMakeLists.txt file lives in, in a subdirectory
32# called tensorflow
33if (BUILD_TF_LITE_PARSER AND "${TENSORFLOW_ROOT}" STREQUAL "")
34  set(TENSORFLOW_ROOT "${PROJECT_SOURCE_DIR}/../tensorflow" CACHE INTERNAL "")
35  message(STATUS "Set TENSORFLOW_ROOT: ${TENSORFLOW_ROOT}")
36else()
37  message(STATUS "TENSORFLOW_ROOT: ${TENSORFLOW_ROOT}")
38endif()
39
40set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/delegate/cmake/Modules/")
41
42set(as_subproject Armnn)
43
44macro(find_package)
45    if(NOT ${ARGV0} IN_LIST as_subproject)
46        _find_package(${ARGV})
47    endif()
48endmacro()
49
50if (DYNAMIC_BACKEND_PATHS)
51    # It's expected to have the format: DYNAMIC_BACKEND_PATHS="PATH_1:PATH_2...:PATH_N"
52    add_definitions('-DDYNAMIC_BACKEND_PATHS="${DYNAMIC_BACKEND_PATHS}"')
53endif()
54
55include(GNUInstallDirs)
56
57add_subdirectory(profiling/common/src)
58add_subdirectory(profiling/client/src)
59
60add_subdirectory(samples)
61add_subdirectory(src/armnnTfLiteParser)
62add_subdirectory(src/armnnSerializer)
63add_subdirectory(src/armnnDeserializer)
64add_subdirectory(src/armnnTestUtils)
65
66if (BUILD_TESTS)
67    add_subdirectory(tests)
68endif()
69
70# Include the additional cmake files in their own target so that they will appear nicely in IDEs
71add_custom_target(AdditionalCMakeFiles SOURCES ${additional_cmake_files})
72
73set(armnnUtils_sources)
74list(APPEND armnnUtils_sources
75    include/armnnUtils/CompatibleTypes.hpp
76    include/armnnUtils/DataLayoutIndexed.hpp
77    include/armnnUtils/Permute.hpp
78    include/armnnUtils/Filesystem.hpp
79    include/armnnUtils/FloatingPointComparison.hpp
80    include/armnnUtils/FloatingPointConverter.hpp
81    include/armnnUtils/QuantizeHelper.hpp
82    include/armnnUtils/TContainer.hpp
83    include/armnnUtils/TensorUtils.hpp
84    include/armnnUtils/Transpose.hpp
85    src/armnnUtils/BFloat16.hpp
86    src/armnnUtils/CompatibleTypes.cpp
87    src/armnnUtils/Filesystem.cpp
88    src/armnnUtils/GraphTopologicalSort.hpp
89    src/armnnUtils/Half.hpp
90    src/armnnUtils/Permute.cpp
91    src/armnnUtils/DataLayoutIndexed.cpp
92    src/armnnUtils/DotSerializer.cpp
93    src/armnnUtils/DotSerializer.hpp
94    src/armnnUtils/HeapProfiling.cpp
95    src/armnnUtils/HeapProfiling.hpp
96    src/armnnUtils/LeakChecking.cpp
97    src/armnnUtils/LeakChecking.hpp
98    src/armnnUtils/ModelAccuracyChecker.cpp
99    src/armnnUtils/ModelAccuracyChecker.hpp
100    src/armnnUtils/FloatingPointConverter.cpp
101    src/armnnUtils/VerificationHelpers.hpp
102    src/armnnUtils/VerificationHelpers.cpp
103    src/armnnUtils/ParserHelper.hpp
104    src/armnnUtils/ParserHelper.cpp
105    src/armnnUtils/ParserPrototxtFixture.hpp
106    src/armnnUtils/ProfilingOptionsConverter.hpp
107    src/armnnUtils/ProfilingOptionsConverter.cpp
108    src/armnnUtils/PrototxtConversions.hpp
109    src/armnnUtils/PrototxtConversions.cpp
110    src/armnnUtils/TensorIOUtils.hpp
111    src/armnnUtils/TensorUtils.cpp
112    src/armnnUtils/Transpose.cpp
113    )
114
115add_library_ex(armnnUtils STATIC ${armnnUtils_sources})
116
117target_include_directories(armnnUtils PRIVATE src/backends)
118
119if(BUILD_ONNX_PARSER)
120    set(armnn_onnx_parser_sources)
121    list(APPEND armnn_onnx_parser_sources
122        include/armnnOnnxParser/IOnnxParser.hpp
123        include/armnnOnnxParser/Version.hpp
124        src/armnnOnnxParser/OnnxParser.hpp
125        src/armnnOnnxParser/OnnxParser.cpp
126        ${ONNX_GENERATED_SOURCES}/onnx/onnx.pb.cc
127        )
128    # The generated onnx protobuf .cc files are not warning clean and we can't fix them.
129    if(COMPILER_IS_GNU_LIKE)
130        set_source_files_properties(${ONNX_GENERATED_SOURCES}/onnx/onnx.pb.cc PROPERTIES COMPILE_FLAGS "-Wno-conversion -Wno-sign-conversion")
131    endif()
132
133    add_library_ex(armnnOnnxParser SHARED ${armnn_onnx_parser_sources})
134
135    target_include_directories(armnnOnnxParser PRIVATE src/armnnUtils)
136
137    target_link_libraries(armnnOnnxParser armnn)
138
139    # Protobuf
140    target_link_libraries(armnnOnnxParser ${PROTOBUF_LIBRARIES})
141    set_target_properties(armnnOnnxParser PROPERTIES VERSION ${ONNX_PARSER_LIB_VERSION} SOVERSION ${ONNX_PARSER_LIB_SOVERSION})
142endif()
143
144list(APPEND armnn_sources
145    include/armnn/ArmNN.hpp
146    include/armnn/BackendHelper.hpp
147    include/armnn/BackendId.hpp
148    include/armnn/BackendOptions.hpp
149    include/armnn/BackendRegistry.hpp
150    include/armnn/Conversion.hpp
151    include/armnn/Deprecated.hpp
152    include/armnn/Descriptors.hpp
153    include/armnn/DescriptorsFwd.hpp
154    include/armnn/Exceptions.hpp
155    include/armnn/backends/ILayerSupport.hpp
156    include/armnn/backends/ICustomAllocator.hpp
157    include/armnn/IAsyncExecutionCallback.hpp
158    include/armnn/INetwork.hpp
159    include/armnn/IProfiler.hpp
160    include/armnn/IRuntime.hpp
161    include/armnn/IStrategy.hpp
162    include/armnn/IWorkingMemHandle.hpp
163    include/armnn/Logging.hpp
164    include/armnn/LstmParams.hpp
165    include/armnn/MemorySources.hpp
166    include/armnn/NetworkFwd.hpp
167    include/armnn/Optional.hpp
168    include/armnn/QuantizedLstmParams.hpp
169    include/armnn/StrategyBase.hpp
170    include/armnn/Tensor.hpp
171    include/armnn/TensorFwd.hpp
172    include/armnn/Threadpool.hpp
173    include/armnn/Types.hpp
174    include/armnn/TypesUtils.hpp
175    include/armnn/Utils.hpp
176    include/armnn/Version.hpp
177    include/armnn/utility/Assert.hpp
178    include/armnn/utility/IgnoreUnused.hpp
179    include/armnn/utility/NumericCast.hpp
180    include/armnn/utility/PolymorphicDowncast.hpp
181    include/armnn/utility/StringUtils.hpp
182    include/armnn/utility/TransformIterator.hpp
183    include/armnn/backends/SubgraphView.hpp
184    src/armnn/layers/LayerCloneBase.hpp
185    src/armnn/layers/LayerWithParameters.hpp
186    src/armnn/layers/ActivationLayer.hpp
187    src/armnn/layers/ActivationLayer.cpp
188    src/armnn/layers/AdditionLayer.hpp
189    src/armnn/layers/AdditionLayer.cpp
190    src/armnn/layers/ArgMinMaxLayer.hpp
191    src/armnn/layers/ArgMinMaxLayer.cpp
192    src/armnn/layers/BatchMatMulLayer.hpp
193    src/armnn/layers/BatchMatMulLayer.cpp
194    src/armnn/layers/BatchNormalizationLayer.hpp
195    src/armnn/layers/BatchNormalizationLayer.cpp
196    src/armnn/layers/BatchToSpaceNdLayer.hpp
197    src/armnn/layers/BatchToSpaceNdLayer.cpp
198    src/armnn/layers/CastLayer.hpp
199    src/armnn/layers/CastLayer.cpp
200    src/armnn/layers/ChannelShuffleLayer.hpp
201    src/armnn/layers/ChannelShuffleLayer.cpp
202    src/armnn/layers/ComparisonLayer.hpp
203    src/armnn/layers/ComparisonLayer.cpp
204    src/armnn/layers/ConcatLayer.hpp
205    src/armnn/layers/ConcatLayer.cpp
206    src/armnn/layers/ConstantLayer.hpp
207    src/armnn/layers/ConstantLayer.cpp
208    src/armnn/layers/Convolution2dLayer.hpp
209    src/armnn/layers/Convolution2dLayer.cpp
210    src/armnn/layers/Convolution3dLayer.hpp
211    src/armnn/layers/Convolution3dLayer.cpp
212    src/armnn/layers/ConvertFp16ToFp32Layer.hpp
213    src/armnn/layers/ConvertFp16ToFp32Layer.cpp
214    src/armnn/layers/ConvertFp32ToFp16Layer.hpp
215    src/armnn/layers/ConvertFp32ToFp16Layer.cpp
216    src/armnn/layers/DebugLayer.hpp
217    src/armnn/layers/DebugLayer.cpp
218    src/armnn/layers/DepthToSpaceLayer.hpp
219    src/armnn/layers/DepthToSpaceLayer.cpp
220    src/armnn/layers/DepthwiseConvolution2dLayer.hpp
221    src/armnn/layers/DepthwiseConvolution2dLayer.cpp
222    src/armnn/layers/DequantizeLayer.hpp
223    src/armnn/layers/DequantizeLayer.cpp
224    src/armnn/layers/DetectionPostProcessLayer.hpp
225    src/armnn/layers/DetectionPostProcessLayer.cpp
226    src/armnn/layers/ElementwiseBaseLayer.hpp
227    src/armnn/layers/ElementwiseBaseLayer.cpp
228    src/armnn/layers/ElementwiseBinaryLayer.hpp
229    src/armnn/layers/ElementwiseBinaryLayer.cpp
230    src/armnn/layers/ElementwiseUnaryLayer.hpp
231    src/armnn/layers/ElementwiseUnaryLayer.cpp
232    src/armnn/layers/FakeQuantizationLayer.hpp
233    src/armnn/layers/FakeQuantizationLayer.cpp
234    src/armnn/layers/FillLayer.hpp
235    src/armnn/layers/FillLayer.cpp
236    src/armnn/layers/FloorLayer.hpp
237    src/armnn/layers/FloorLayer.cpp
238    src/armnn/layers/FullyConnectedLayer.hpp
239    src/armnn/layers/FullyConnectedLayer.cpp
240    src/armnn/layers/GatherLayer.cpp
241    src/armnn/layers/GatherLayer.hpp
242    src/armnn/layers/GatherNdLayer.cpp
243    src/armnn/layers/GatherNdLayer.hpp
244    src/armnn/layers/InputLayer.hpp
245    src/armnn/layers/InputLayer.cpp
246    src/armnn/layers/InstanceNormalizationLayer.hpp
247    src/armnn/layers/InstanceNormalizationLayer.cpp
248    src/armnn/layers/L2NormalizationLayer.hpp
249    src/armnn/layers/L2NormalizationLayer.cpp
250    src/armnn/layers/LogicalBinaryLayer.hpp
251    src/armnn/layers/LogicalBinaryLayer.cpp
252    src/armnn/layers/LogSoftmaxLayer.hpp
253    src/armnn/layers/LogSoftmaxLayer.cpp
254    src/armnn/layers/LstmLayer.cpp
255    src/armnn/layers/LstmLayer.hpp
256    src/armnn/layers/MapLayer.cpp
257    src/armnn/layers/MapLayer.hpp
258    src/armnn/layers/MaximumLayer.cpp
259    src/armnn/layers/MaximumLayer.hpp
260    src/armnn/layers/MeanLayer.hpp
261    src/armnn/layers/MeanLayer.cpp
262    src/armnn/layers/MemCopyLayer.hpp
263    src/armnn/layers/MemCopyLayer.cpp
264    src/armnn/layers/MemImportLayer.hpp
265    src/armnn/layers/MemImportLayer.cpp
266    src/armnn/layers/MergeLayer.hpp
267    src/armnn/layers/MergeLayer.cpp
268    src/armnn/layers/MinimumLayer.cpp
269    src/armnn/layers/MinimumLayer.hpp
270    src/armnn/layers/MultiplicationLayer.hpp
271    src/armnn/layers/MultiplicationLayer.cpp
272    src/armnn/layers/NormalizationLayer.hpp
273    src/armnn/layers/NormalizationLayer.cpp
274    src/armnn/layers/OutputLayer.hpp
275    src/armnn/layers/OutputLayer.cpp
276    src/armnn/layers/PadLayer.hpp
277    src/armnn/layers/PadLayer.cpp
278    src/armnn/layers/PermuteLayer.hpp
279    src/armnn/layers/PermuteLayer.cpp
280    src/armnn/layers/Pooling2dLayer.hpp
281    src/armnn/layers/Pooling2dLayer.cpp
282    src/armnn/layers/Pooling3dLayer.hpp
283    src/armnn/layers/Pooling3dLayer.cpp
284    src/armnn/layers/QuantizeLayer.cpp
285    src/armnn/layers/QuantizeLayer.hpp
286    src/armnn/layers/QLstmLayer.hpp
287    src/armnn/layers/QLstmLayer.cpp
288    src/armnn/layers/QuantizedLstmLayer.hpp
289    src/armnn/layers/QuantizedLstmLayer.cpp
290    src/armnn/layers/DivisionLayer.cpp
291    src/armnn/layers/DivisionLayer.hpp
292    src/armnn/layers/PreCompiledLayer.hpp
293    src/armnn/layers/PreCompiledLayer.cpp
294    src/armnn/layers/PreluLayer.hpp
295    src/armnn/layers/PreluLayer.cpp
296    src/armnn/layers/RankLayer.hpp
297    src/armnn/layers/RankLayer.cpp
298    src/armnn/layers/ReduceLayer.hpp
299    src/armnn/layers/ReduceLayer.cpp
300    src/armnn/layers/ReshapeLayer.hpp
301    src/armnn/layers/ReshapeLayer.cpp
302    src/armnn/layers/ResizeLayer.hpp
303    src/armnn/layers/ResizeLayer.cpp
304    src/armnn/layers/ShapeLayer.cpp
305    src/armnn/layers/ShapeLayer.hpp
306    src/armnn/layers/SliceLayer.cpp
307    src/armnn/layers/SliceLayer.hpp
308    src/armnn/layers/SoftmaxLayer.hpp
309    src/armnn/layers/SoftmaxLayer.cpp
310    src/armnn/layers/SpaceToBatchNdLayer.hpp
311    src/armnn/layers/SpaceToBatchNdLayer.cpp
312    src/armnn/layers/SpaceToDepthLayer.hpp
313    src/armnn/layers/SpaceToDepthLayer.cpp
314    src/armnn/layers/SplitterLayer.hpp
315    src/armnn/layers/SplitterLayer.cpp
316    src/armnn/layers/StackLayer.hpp
317    src/armnn/layers/StackLayer.cpp
318    src/armnn/layers/StandInLayer.cpp
319    src/armnn/layers/StandInLayer.hpp
320    src/armnn/layers/StridedSliceLayer.cpp
321    src/armnn/layers/StridedSliceLayer.hpp
322    src/armnn/layers/SubtractionLayer.cpp
323    src/armnn/layers/SubtractionLayer.hpp
324    src/armnn/layers/SwitchLayer.cpp
325    src/armnn/layers/SwitchLayer.hpp
326    src/armnn/layers/TransposeConvolution2dLayer.cpp
327    src/armnn/layers/TransposeConvolution2dLayer.hpp
328    src/armnn/layers/TransposeLayer.hpp
329    src/armnn/layers/TransposeLayer.cpp
330    src/armnn/layers/UnidirectionalSequenceLstmLayer.cpp
331    src/armnn/layers/UnidirectionalSequenceLstmLayer.hpp
332    src/armnn/layers/UnmapLayer.cpp
333    src/armnn/layers/UnmapLayer.hpp
334    src/armnn/ArmNNProfilingServiceInitialiser.cpp
335    src/armnn/ArmNNProfilingServiceInitialiser.hpp
336    src/armnn/AsyncExecutionCallback.cpp
337    src/armnn/AsyncExecutionCallback.hpp
338    src/armnn/BackendRegistry.cpp
339    src/armnn/BackendSettings.hpp
340    src/armnn/BackendHelper.cpp
341    src/armnn/Descriptors.cpp
342    src/armnn/DeviceSpec.hpp
343    src/armnn/DllExport.hpp
344    src/armnn/Exceptions.cpp
345    src/armnn/ExecutionData.hpp
346    src/armnn/ExecutionFrame.cpp
347    src/armnn/ExecutionFrame.hpp
348    src/armnn/Graph.cpp
349    src/armnn/Graph.hpp
350    src/armnn/IGraphObservable.hpp
351    src/armnn/ILayerSupport.cpp
352    src/armnn/Instrument.hpp
353    src/armnn/InternalTypes.cpp
354    src/armnn/InternalTypes.hpp
355    src/armnn/ISubgraphViewConverter.hpp
356    src/armnn/JsonPrinter.cpp
357    src/armnn/JsonPrinter.hpp
358    src/armnn/Layer.cpp
359    src/armnn/LayerFwd.hpp
360    src/armnn/Layer.hpp
361    src/armnn/LayersFwd.hpp
362    src/armnn/LayerSupportCommon.hpp
363    src/armnn/LoadedNetwork.cpp
364    src/armnn/LoadedNetwork.hpp
365    src/armnn/Logging.cpp
366    src/armnn/Network.cpp
367    src/armnn/Network.hpp
368    src/armnn/NetworkUtils.cpp
369    src/armnn/NetworkUtils.hpp
370    src/armnn/Observable.cpp
371    src/armnn/Observable.hpp
372    src/armnn/Optimizer.cpp
373    src/armnn/Optimizer.hpp
374    src/armnn/OutputHandler.cpp
375    src/armnn/OutputHandler.hpp
376    src/armnn/Profiling.cpp
377    src/armnn/ProfilingEvent.cpp
378    src/armnn/ProfilingDetails.hpp
379    src/armnn/ProfilingEvent.hpp
380    src/armnn/Profiling.hpp
381    src/armnn/Runtime.cpp
382    src/armnn/Runtime.hpp
383    src/armnn/RangeTracker.cpp
384    src/armnn/RangeTracker.hpp
385    src/armnn/ResolveType.hpp
386    src/armnn/SerializeLayerParameters.cpp
387    src/armnn/SerializeLayerParameters.hpp
388    src/armnn/SubgraphView.cpp
389    src/armnn/SubgraphViewSelector.cpp
390    src/armnn/SubgraphViewSelector.hpp
391    src/armnn/Tensor.cpp
392    src/armnn/Threadpool.cpp
393    src/armnn/TypesUtils.cpp
394    src/armnn/Utils.cpp
395    src/armnn/WallClockTimer.cpp
396    src/armnn/WallClockTimer.hpp
397    src/armnn/WorkingMemDescriptor.hpp
398    src/armnn/WorkingMemHandle.cpp
399    src/armnn/WorkingMemHandle.hpp
400    src/armnn/optimizations/AddBroadcastReshapeLayer.hpp
401    src/armnn/optimizations/AddDebug.hpp
402    src/armnn/optimizations/All.hpp
403    src/armnn/optimizations/ConvertConstants.hpp
404    src/armnn/optimizations/ConvertFp32NetworkToFp16.hpp
405    src/armnn/optimizations/FoldPadIntoLayer2d.hpp
406    src/armnn/optimizations/MovePermuteUp.hpp
407    src/armnn/optimizations/MoveTransposeUp.hpp
408    src/armnn/optimizations/Optimization.hpp
409    src/armnn/optimizations/OptimizeConsecutiveReshapes.hpp
410    src/armnn/optimizations/OptimizeInverseConversions.hpp
411    src/armnn/optimizations/OptimizeInversePermutes.hpp
412    src/armnn/optimizations/PermuteAndBatchToSpaceAsDepthToSpace.hpp
413    src/armnn/optimizations/PermuteAsReshape.hpp
414    src/armnn/optimizations/SquashEqualSiblings.hpp
415    third-party/cxxopts/cxxopts.hpp
416    third-party/ghc/filesystem.hpp
417    third-party/half/half.hpp
418    third-party/mapbox/optional.hpp
419    third-party/mapbox/recursive_wrapper.hpp
420    third-party/mapbox/variant.hpp
421    third-party/mapbox/variant_cast.hpp
422    third-party/mapbox/variant_io.hpp
423    third-party/mapbox/variant_visitor.hpp
424    )
425
426# Files used for Streamline-based profiling backend
427if(PROFILING_BACKEND_STREAMLINE)
428    list(APPEND armnn_sources
429        ${GATOR_ROOT}/annotate/streamline_annotate.h
430        ${GATOR_ROOT}/annotate/streamline_annotate.c)
431endif()
432
433# the backends under src/backends extend the list of
434# object libs armnn to include in the build
435include(src/backends/backends.cmake)
436foreach(lib ${armnnLibraries})
437    message(STATUS "Adding object library dependency to armnn: ${lib}")
438    list(APPEND armnn_sources $<TARGET_OBJECTS:${lib}>)
439endforeach()
440
441# The delegate needs to be placed after armnnLibraries has been fully populated. The armnn_delegate_jni library
442# requires a static armnn build.
443# Explanation:
444# Because backends are added as object libraries they won't be linked to armnn when building armnn statically.
445# A target that uses a static armnn library has to link to the object libraries in the variable armnnLibraries
446# manually to include all symbols from backends.
447if (BUILD_CLASSIC_DELEGATE OR BUILD_OPAQUE_DELEGATE)
448    set(ARMNN_SUB_PROJECT ON)
449    set(ARMNN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
450    add_subdirectory(delegate)
451endif()
452if (BUILD_CLASSIC_DELEGATE)
453    add_definitions(-DARMNN_TFLITE_DELEGATE)
454endif()
455if (BUILD_OPAQUE_DELEGATE)
456    add_definitions(-DARMNN_TFLITE_OPAQUE_DELEGATE)
457endif()
458
459if(BUILD_BARE_METAL OR EXECUTE_NETWORK_STATIC)
460    add_library_ex(armnn STATIC ${armnn_sources})
461else()
462    if (BUILD_SHARED_LIBS)
463        add_library_ex(armnn SHARED ${armnn_sources})
464    else()
465        add_library(armnn ${armnn_sources})
466    endif()
467endif()
468
469target_compile_definitions(armnn PRIVATE "ARMNN_COMPILING_DLL")
470
471# Generate a map file for all build modes
472set_property(TARGET armnn APPEND_STRING PROPERTY
473        LINK_FLAGS " -Wl,-Map=libarmnnMapFile.map")
474message(STATUS "Linker will generate mapfile ")
475
476target_include_directories(armnn
477    PUBLIC
478        $<INSTALL_INTERFACE:include>
479        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
480    PRIVATE
481        src/armnn
482        src/armnnUtils
483        src/backends
484        src/profiling
485        profiling/common/include
486        profiling/client/include
487)
488
489# Link fmt third-party library
490add_subdirectory(third-party/fmt)
491target_link_libraries(armnn PUBLIC fmt)
492
493target_link_libraries(armnn PUBLIC armnnUtils)
494target_link_libraries(armnn PUBLIC pipeCommon)
495target_link_libraries(armnn PUBLIC pipeClient)
496
497if(NOT BUILD_BARE_METAL AND NOT EXECUTE_NETWORK_STATIC)
498    target_link_libraries(armnn PUBLIC ${CMAKE_DL_LIBS})
499endif()
500
501if ("${CMAKE_SYSTEM_NAME}" STREQUAL Windows)
502    target_link_libraries(armnn PUBLIC Ws2_32.lib)
503endif()
504
505
506if(BUILD_ONNX_PARSER)
507    install(TARGETS armnnOnnxParser
508            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
509            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
510            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
511endif()
512
513install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
514
515if(ARMCOMPUTENEON OR ARMCOMPUTECL)
516    target_link_libraries(armnn PUBLIC ${ARMCOMPUTE_LIBRARIES})
517endif()
518
519# Flatbuffers is not included in armnn if the armnnSerializer is not present
520# Required to target link both flatbuffers and tosa_serialization_lib to armnn
521if(ARMNNTOSACOMMON)
522    if (FLATBUFFERS_LIBRARY)
523        target_link_libraries(armnn PUBLIC ${FLATBUFFERS_LIBRARY})
524    else()
525        # Use PATH_SUFFIXES to help find separate libs for debug/release on Windows builds
526        find_library(FLATBUFFERS_LIBRARY_DEBUG NAMES flatbuffers
527                     HINTS ${FLATBUFFERS_BUILD_DIR}
528                     PATH_SUFFIXES "Debug")
529        find_library(FLATBUFFERS_LIBRARY_RELEASE NAMES flatbuffers
530                     HINTS ${FLATBUFFERS_BUILD_DIR}
531                     PATH_SUFFIXES "Release")
532        target_link_libraries(armnn PUBLIC
533                     debug ${FLATBUFFERS_LIBRARY_DEBUG}
534                     optimized ${FLATBUFFERS_LIBRARY_RELEASE})
535    endif()
536
537    if (TOSA_SERIALIZATION_LIB)
538        target_link_libraries(armnn PUBLIC -Wl,--whole-archive ${TOSA_SERIALIZATION_LIB} -Wl,--no-whole-archive)
539    else()
540        find_library(TOSA_SERIALIZATION_LIB
541                     NAMES libtosa_serialization_lib.a tosa_serialization_lib
542                     HINTS ${TOSA_SERIALIZATION_LIB_ROOT}/lib /usr/local/lib /usr/lib)
543
544        message(STATUS "TOSA serialization library set to ${TOSA_SERIALIZATION_LIB}")
545
546        target_link_libraries(armnn PUBLIC -Wl,--whole-archive ${TOSA_SERIALIZATION_LIB} -Wl,--no-whole-archive)
547    endif()
548endif()
549
550if (ARMNNTOSAREF)
551    if (TOSA_REFERENCE_MODEL_LIB)
552        target_link_libraries(armnn PUBLIC -Wl,--whole-archive ${TOSA_REFERENCE_MODEL_LIB} -Wl,--no-whole-archive)
553    else()
554        find_library(TOSA_REFERENCE_MODEL_LIB
555            NAMES libtosa_reference_model_lib.a tosa_reference_model_lib
556            HINTS ${TOSA_REFERENCE_MODEL_ROOT}/lib /usr/local/lib /usr/lib)
557        message(STATUS "TOSA Reference Model set to ${TOSA_REFERENCE_MODEL_LIB}")
558
559        target_link_libraries(armnn PUBLIC -Wl,--whole-archive ${TOSA_REFERENCE_MODEL_LIB} -Wl,--no-whole-archive)
560    endif()
561endif()
562
563if(PROFILING_BACKEND_STREAMLINE AND (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android)))
564    target_link_libraries(armnn PUBLIC ${CMAKE_THREAD_LIBS_INIT})
565endif()
566
567set_target_properties(armnn PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION})
568
569if(BUILD_UNIT_TESTS)
570    set(unittest_sources)
571    list(APPEND unittest_sources
572        src/armnn/test/CloneTests.cpp
573        src/armnn/test/ConstTensorLayerVisitor.hpp
574        src/armnn/test/ConstTensorLayerVisitor.cpp
575        src/armnn/test/EndToEndTest.cpp
576        src/armnn/test/ExecutionFrameTest.cpp
577        src/armnn/test/FloatingPointConverterTest.cpp
578        src/armnn/test/FlowControl.cpp
579        src/armnn/test/GraphTests.cpp
580        src/armnn/test/InstrumentTests.cpp
581        src/armnn/test/InferOutputTests.cpp
582        src/armnn/test/InferOutputTests.hpp
583        src/armnn/test/ModelAccuracyCheckerTest.cpp
584        src/armnn/test/NetworkTests.cpp
585        src/armnn/test/ObservableTest.cpp
586        src/armnn/test/OptimizerTests.cpp
587        src/armnn/test/optimizations/AddBroadcastReshapeLayerTests.cpp
588        src/armnn/test/optimizations/ConvertConstDequantisationLayersToConstLayersTest.cpp
589        src/armnn/test/optimizations/ConvertConstPermuteLayersToConstLayersTest.cpp
590        src/armnn/test/optimizations/ConvertConstantsFloatToHalfTests.cpp
591        src/armnn/test/optimizations/ConvertConstantsHalfToFloatTests.cpp
592        src/armnn/test/optimizations/FoldPadIntoQuantizedAveragePooling2DTests.cpp
593        src/armnn/test/optimizations/FoldPadTests.cpp
594        src/armnn/test/optimizations/Fp32NetworkToFp16ConverterTests.cpp
595        src/armnn/test/optimizations/FuseActivationTests.cpp
596        src/armnn/test/optimizations/InsertDebugLayerTests.cpp
597        src/armnn/test/optimizations/MovePermuteUpTests.cpp
598        src/armnn/test/optimizations/MoveTransposeUpTests.cpp
599        src/armnn/test/optimizations/OptimizeConsecutiveReshapesTests.cpp
600        src/armnn/test/optimizations/OptimizeInverseConversionsTests.cpp
601        src/armnn/test/optimizations/OptimizeInversePermutesTests.cpp
602        src/armnn/test/optimizations/PermuteAndBatchToSpaceAsDepthToSpaceTests.cpp
603        src/armnn/test/optimizations/PermuteAsReshapeTests.cpp
604        src/armnn/test/optimizations/ReduceMultipleAxesTests.cpp
605        src/armnn/test/optimizations/SquashEqualSiblingsTests.cpp
606        src/armnn/test/optimizations/TransposeAsReshapeTests.cpp
607        src/armnn/test/OptionalTest.cpp
608        src/armnn/test/ProfilerTests.cpp
609        src/armnn/test/ProfilingEventTest.cpp
610        src/armnn/test/ShapeInferenceTests.cpp
611        src/armnn/test/SubgraphViewTests.cpp
612        src/armnn/test/TensorHandleStrategyTest.cpp
613        src/armnn/test/TensorTest.cpp
614        src/armnn/test/TestInputOutputLayerVisitor.cpp
615        src/armnn/test/TestInputOutputLayerVisitor.hpp
616        src/armnn/test/TestLayerVisitor.cpp
617        src/armnn/test/TestLayerVisitor.hpp
618        src/armnn/test/TestNameOnlyLayerVisitor.cpp
619        src/armnn/test/TestNameOnlyLayerVisitor.hpp
620        src/armnn/test/TestNameAndDescriptorLayerVisitor.hpp
621        src/armnn/test/TestNameAndDescriptorLayerVisitor.cpp
622        src/armnn/test/UtilityTests.cpp
623        src/armnn/test/UtilsTests.cpp
624        src/armnnUtils/test/FloatingPointComparisonTest.cpp
625        src/armnnUtils/test/ParserHelperTest.cpp
626        src/armnnUtils/test/PrototxtConversionsTest.cpp
627        src/armnnUtils/test/QuantizeHelperTest.cpp
628        src/armnnUtils/test/TensorUtilsTest.cpp
629        src/armnnUtils/test/TransformIteratorTest.cpp
630        src/profiling/test/BufferTests.cpp
631        src/profiling/test/FileOnlyProfilingDecoratorTests.cpp
632        src/profiling/test/PrintPacketHeaderHandler.cpp
633        src/profiling/test/PrintPacketHeaderHandler.hpp
634        src/profiling/test/ProfilingConnectionDumpToFileDecoratorTests.cpp
635        src/profiling/test/ProfilingGuidTest.cpp
636        src/profiling/test/ProfilingMocks.hpp
637        src/profiling/test/ProfilingTests.cpp
638        src/profiling/test/ProfilingTests.hpp
639        src/profiling/test/ProfilingTestUtils.cpp
640        src/profiling/test/ProfilingTestUtils.hpp
641        src/profiling/test/RequestCountersPacketHandler.cpp
642        src/profiling/test/RequestCountersPacketHandler.hpp
643        src/profiling/test/SendCounterPacketTests.cpp
644        src/profiling/test/SendCounterPacketTests.hpp
645        src/profiling/test/TestTimelinePacketHandler.cpp
646        src/profiling/test/TestTimelinePacketHandler.hpp
647        src/profiling/test/TimelineModel.cpp
648        src/profiling/test/TimelineModel.hpp
649        src/profiling/test/SendTimelinePacketTests.cpp
650        src/profiling/test/TimelinePacketTests.cpp
651        src/profiling/test/TimelineUtilityMethodsTests.cpp
652        third-party/doctest/doctest.h
653        )
654
655    if(ARMNNREF)
656        list(APPEND unittest_sources
657            src/armnn/test/optimizations/FuseBatchNormTests.cpp
658            src/armnn/test/DebugCallbackTest.cpp
659            src/armnn/test/RuntimeTests.cpp
660            src/armnn/test/RuntimeTests.hpp
661            )
662    endif()
663
664    if(BUILD_TF_LITE_PARSER AND ARMNNREF)
665        list(APPEND unittest_sources
666             src/armnnTfLiteParser/test/Activations.cpp
667             src/armnnTfLiteParser/test/Addition.cpp
668             src/armnnTfLiteParser/test/ArgMinMax.cpp
669             src/armnnTfLiteParser/test/AvgPool2D.cpp
670             src/armnnTfLiteParser/test/BatchMatMul.cpp
671             src/armnnTfLiteParser/test/BatchToSpaceND.cpp
672             src/armnnTfLiteParser/test/Cast.cpp
673             src/armnnTfLiteParser/test/Comparison.cpp
674             src/armnnTfLiteParser/test/Concatenation.cpp
675             src/armnnTfLiteParser/test/Constant.cpp
676             src/armnnTfLiteParser/test/Conv2D.cpp
677             src/armnnTfLiteParser/test/Conv3D.cpp
678             src/armnnTfLiteParser/test/DepthwiseConvolution2D.cpp
679             src/armnnTfLiteParser/test/DepthToSpace.cpp
680             src/armnnTfLiteParser/test/Dequantize.cpp
681             src/armnnTfLiteParser/test/DetectionPostProcess.cpp
682             src/armnnTfLiteParser/test/Div.cpp
683             src/armnnTfLiteParser/test/ElementWiseUnary.cpp
684             src/armnnTfLiteParser/test/ExpandDims.cpp
685             src/armnnTfLiteParser/test/FloorDiv.cpp
686             src/armnnTfLiteParser/test/FullyConnected.cpp
687             src/armnnTfLiteParser/test/Gather.cpp
688             src/armnnTfLiteParser/test/GatherNd.cpp
689             src/armnnTfLiteParser/test/L2Normalization.cpp
690             src/armnnTfLiteParser/test/LeakyRelu.cpp
691             src/armnnTfLiteParser/test/LoadScopeDynamicTensor.cpp
692             src/armnnTfLiteParser/test/LocalResponseNormalization.cpp
693             src/armnnTfLiteParser/test/Maximum.cpp
694             src/armnnTfLiteParser/test/MaxPool2D.cpp
695             src/armnnTfLiteParser/test/Mean.cpp
696             src/armnnTfLiteParser/test/Minimum.cpp
697             src/armnnTfLiteParser/test/MirrorPad.cpp
698             src/armnnTfLiteParser/test/Multiplication.cpp
699             src/armnnTfLiteParser/test/Pack.cpp
700             src/armnnTfLiteParser/test/Pad.cpp
701             src/armnnTfLiteParser/test/PadV2.cpp
702             src/armnnTfLiteParser/test/Prelu.cpp
703             src/armnnTfLiteParser/test/Reduce.cpp
704             src/armnnTfLiteParser/test/Reshape.cpp
705             src/armnnTfLiteParser/test/ReshapeDynamic.cpp
706             src/armnnTfLiteParser/test/ResizeBilinear.cpp
707             src/armnnTfLiteParser/test/ResizeNearestNeighbor.cpp
708             src/armnnTfLiteParser/test/Quantize.cpp
709             src/armnnTfLiteParser/test/Softmax.cpp
710             src/armnnTfLiteParser/test/SpaceToBatchND.cpp
711             src/armnnTfLiteParser/test/Shape.cpp
712             src/armnnTfLiteParser/test/Slice.cpp
713             src/armnnTfLiteParser/test/Split.cpp
714             src/armnnTfLiteParser/test/SplitV.cpp
715             src/armnnTfLiteParser/test/Squeeze.cpp
716             src/armnnTfLiteParser/test/StridedSlice.cpp
717             src/armnnTfLiteParser/test/Sub.cpp
718             src/armnnTfLiteParser/test/Sum.cpp
719             src/armnnTfLiteParser/test/TransposeConv.cpp
720             src/armnnTfLiteParser/test/Transpose.cpp
721             src/armnnTfLiteParser/test/Unpack.cpp
722             src/armnnTfLiteParser/test/Unsupported.cpp
723             src/armnnTfLiteParser/test/LoadModel.cpp
724             src/armnnTfLiteParser/test/GetBuffer.cpp
725             src/armnnTfLiteParser/test/OutputShapeOfSqueeze.cpp
726             src/armnnTfLiteParser/test/InputOutputTensorNames.cpp
727             src/armnnTfLiteParser/test/GetTensorIds.cpp
728             src/armnnTfLiteParser/test/GetSubgraphInputsOutputs.cpp
729             src/armnnTfLiteParser/test/GetInputsOutputs.cpp
730             src/armnnTfLiteParser/test/TfLiteParser.cpp
731             )
732
733        # Generate SchemaText.cpp file which contains the TfLite schema text as a
734        # static C-array of bytes. This is needed at runtime for TfLite parser tests.
735        add_custom_command(
736            OUTPUT  SchemaText.cpp
737            COMMAND cp ${TF_LITE_SCHEMA_INCLUDE_PATH}/schema.fbs g_TfLiteSchemaText
738            COMMAND xxd -i g_TfLiteSchemaText SchemaText.cpp
739            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
740            DEPENDS ${TF_LITE_SCHEMA_INCLUDE_PATH}/schema.fbs
741        )
742        list(APPEND unittest_sources ${CMAKE_CURRENT_BINARY_DIR}/SchemaText.cpp)
743    endif()
744
745    if(BUILD_ONNX_PARSER AND ARMNNREF)
746        list(APPEND unittest_sources
747            src/armnnOnnxParser/test/Addition.cpp
748            src/armnnOnnxParser/test/BatchNorm.cpp
749            src/armnnOnnxParser/test/Clip.cpp
750            src/armnnOnnxParser/test/Concat.cpp
751            src/armnnOnnxParser/test/Const.cpp
752            src/armnnOnnxParser/test/Constructor.cpp
753            src/armnnOnnxParser/test/Conv2D.cpp
754            src/armnnOnnxParser/test/CreateNetwork.cpp
755            src/armnnOnnxParser/test/DepthConv.cpp
756            src/armnnOnnxParser/test/Flatten.cpp
757            src/armnnOnnxParser/test/FullyConnected.cpp
758            src/armnnOnnxParser/test/Gather.cpp
759            src/armnnOnnxParser/test/Gemm.cpp
760            src/armnnOnnxParser/test/GetInputsOutputs.cpp
761            src/armnnOnnxParser/test/LoadScopeDynamicTensor.cpp
762            src/armnnOnnxParser/test/OnnxParserTestUtils.cpp
763            src/armnnOnnxParser/test/OnnxParserTestUtils.hpp
764            src/armnnOnnxParser/test/Pooling.cpp
765            src/armnnOnnxParser/test/ProtoxtFixture.cpp
766            src/armnnOnnxParser/test/Relu.cpp
767            src/armnnOnnxParser/test/Reshape.cpp
768            src/armnnOnnxParser/test/Shape.cpp
769            src/armnnOnnxParser/test/Unsqueeze.cpp
770            )
771    endif()
772
773    if(BUILD_ARMNN_SERIALIZER AND ARMNNREF)
774        enable_language(ASM)
775        list(APPEND unittest_sources
776            src/armnnSerializer/test/ActivationSerializationTests.cpp
777            src/armnnSerializer/test/ComparisonSerializationTests.cpp
778            src/armnnSerializer/test/LstmSerializationTests.cpp
779            src/armnnSerializer/test/SerializerTests.cpp
780            src/armnnSerializer/test/SerializerTestUtils.cpp
781            src/armnnSerializer/test/SerializerTestUtils.hpp
782            src/armnnDeserializer/test/DeserializeAbs.cpp
783            src/armnnDeserializer/test/DeserializeActivation.cpp
784            src/armnnDeserializer/test/DeserializeAdd.cpp
785            src/armnnDeserializer/test/DeserializeArgMinMax.cpp
786            src/armnnDeserializer/test/DeserializeBatchMatMul.cpp
787            src/armnnDeserializer/test/DeserializeBatchToSpaceNd.cpp
788            src/armnnDeserializer/test/DeserializeBatchNormalization.cpp
789            src/armnnDeserializer/test/DeserializeCast.cpp
790            src/armnnDeserializer/test/DeserializeChannelShuffle.cpp
791            src/armnnDeserializer/test/DeserializeComparison.cpp
792            src/armnnDeserializer/test/DeserializeConstant.cpp
793            src/armnnDeserializer/test/DeserializeConvolution2d.cpp
794            src/armnnDeserializer/test/DeserializeConvolution3d.cpp
795            src/armnnDeserializer/test/DeserializeDepthToSpace.cpp
796            src/armnnDeserializer/test/DeserializeDepthwiseConv2d.cpp
797            src/armnnDeserializer/test/DeserializeDivision.cpp
798            src/armnnDeserializer/test/DeserializeFill.cpp
799            src/armnnDeserializer/test/DeserializeFloor.cpp
800            src/armnnDeserializer/test/DeserializeFullyConnected.cpp
801            src/armnnDeserializer/test/DeserializeGather.cpp
802            src/armnnDeserializer/test/DeserializeGatherNd.cpp
803            src/armnnDeserializer/test/DeserializeInstanceNormalization.cpp
804            src/armnnDeserializer/test/DeserializeL2Normalization.cpp
805            src/armnnDeserializer/test/DeserializeLogSoftmax.cpp
806            src/armnnDeserializer/test/DeserializeMean.cpp
807            src/armnnDeserializer/test/DeserializeMultiplication.cpp
808            src/armnnDeserializer/test/DeserializeNormalization.cpp
809            src/armnnDeserializer/test/DeserializePad.cpp
810            src/armnnDeserializer/test/DeserializePermute.cpp
811            src/armnnDeserializer/test/DeserializePooling2d.cpp
812            src/armnnDeserializer/test/DeserializePooling3d.cpp
813            src/armnnDeserializer/test/DeserializeRank.cpp
814            src/armnnDeserializer/test/DeserializeReduceSum.cpp
815            src/armnnDeserializer/test/DeserializeReshape.cpp
816            src/armnnDeserializer/test/DeserializeResizeBilinear.cpp
817            src/armnnDeserializer/test/DeserializeRsqrt.cpp
818            src/armnnDeserializer/test/DeserializeShape.cpp
819            src/armnnDeserializer/test/DeserializeSlice.cpp
820            src/armnnDeserializer/test/DeserializeSpaceToBatchNd.cpp
821            src/armnnDeserializer/test/DeserializeStridedSlice.cpp
822            src/armnnDeserializer/test/DeserializeSubtraction.cpp
823            src/armnnDeserializer/test/ParserFlatbuffersSerializeFixture.hpp
824            src/armnnDeserializer/test/SchemaSerialize.s
825            )
826        set_source_files_properties(src/armnnDeserializer/test/SchemaSerialize.s PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp")
827    endif()
828
829    if(BUILD_GATORD_MOCK)
830        list(APPEND unittest_sources
831            tests/profiling/gatordmock/tests/GatordMockTests.cpp
832            )
833    endif()
834
835    if(BUILD_TIMELINE_DECODER)
836        list(APPEND unittest_sources
837             src/timelineDecoder/tests/JSONTimelineDecoderTests.cpp
838             profiling/server/src/timelineDecoder/tests/TimelineTests.cpp
839             )
840    endif()
841
842    if(BUILD_BASE_PIPE_SERVER)
843        list(APPEND unittest_sources
844                profiling/server/src/basePipeServer/tests/BasePipeServerTests.cpp
845                )
846    endif()
847
848    if(BUILD_TESTS)
849        list(APPEND unittest_sources
850            ./tests/NetworkExecutionUtils/NetworkExecutionUtils.cpp
851            ./tests/NetworkExecutionUtils/test/NetworkExecutionUtilsTests.cpp)
852    endif()
853
854    foreach(lib ${armnnUnitTestLibraries})
855        message(STATUS "Adding object library dependency to UnitTests: ${lib}")
856        list(APPEND unittest_sources $<TARGET_OBJECTS:${lib}>)
857    endforeach()
858
859    add_executable(UnitTests ${unittest_sources})
860    target_include_directories(UnitTests PRIVATE src/armnn)
861    target_include_directories(UnitTests PRIVATE src/armnnUtils)
862    target_include_directories(UnitTests PRIVATE src/armnnTestUtils)
863    target_include_directories(UnitTests PRIVATE src/backends)
864    target_include_directories(UnitTests PRIVATE src/profiling)
865
866    if(VALGRIND_FOUND)
867        if(HEAP_PROFILING OR LEAK_CHECKING)
868            message(STATUS "Valgrind is disabled for heap profiling and leak checking builds.")
869        else()
870            # Valgrind works with gperftools version number <= 2.4
871            target_compile_definitions(UnitTests PRIVATE "WITH_VALGRIND=1")
872        endif()
873    endif()
874
875    target_link_libraries(UnitTests ${CMAKE_THREAD_LIBS_INIT})
876
877    target_link_libraries(UnitTests armnn)
878    target_link_libraries(UnitTests armnnTestUtils)
879
880    if(BUILD_GATORD_MOCK)
881        target_link_libraries(UnitTests gatordMockService)
882    endif()
883
884    if(BUILD_TIMELINE_DECODER)
885        target_link_libraries(UnitTests timelineDecoder)
886        target_link_libraries(UnitTests timelineDecoderJson)
887    endif()
888
889    if(BUILD_TF_LITE_PARSER)
890        target_include_directories(UnitTests SYSTEM PRIVATE "${TF_LITE_SCHEMA_INCLUDE_PATH}")
891        target_include_directories(UnitTests SYSTEM PRIVATE "${FLATBUFFERS_INCLUDE_PATH}")
892        target_link_libraries(UnitTests armnnTfLiteParser)
893    endif()
894
895    if(BUILD_ARMNN_SERIALIZER AND ARMNNREF)
896        target_include_directories(UnitTests SYSTEM PRIVATE generated)
897        target_include_directories(UnitTests SYSTEM PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/armnnSerializer)
898        target_include_directories(UnitTests SYSTEM PRIVATE "${FLATBUFFERS_INCLUDE_PATH}")
899        target_link_libraries(UnitTests armnnSerializer)
900    endif()
901
902    if(BUILD_ONNX_PARSER)
903        target_link_libraries(UnitTests armnnOnnxParser)
904    endif()
905
906    if(BUILD_BASE_PIPE_SERVER)
907        target_link_libraries(UnitTests armnnBasePipeServer)
908    endif()
909
910    addDllCopyCommands(UnitTests)
911endif()
912
913if (BUILD_ARMNN_SERIALIZER AND (BUILD_TF_LITE_PARSER OR BUILD_ONNX_PARSER) AND ARMNNREF)
914    set(ArmnnConverter_sources
915        src/armnnConverter/ArmnnConverter.cpp)
916
917    add_executable_ex(ArmnnConverter ${ArmnnConverter_sources})
918    target_include_directories(ArmnnConverter PRIVATE src/armnn)
919    target_include_directories(ArmnnConverter PRIVATE src/armnnUtils)
920
921    if(BUILD_ONNX_PARSER)
922        target_link_libraries(ArmnnConverter armnnOnnxParser)
923    endif()
924
925    if(BUILD_TF_LITE_PARSER)
926        target_link_libraries(ArmnnConverter armnnTfLiteParser)
927    endif()
928
929    target_link_libraries(ArmnnConverter armnnSerializer)
930
931    target_link_libraries(ArmnnConverter armnn)
932    target_link_libraries(ArmnnConverter ${CMAKE_THREAD_LIBS_INIT})
933    addDllCopyCommands(ArmnnConverter)
934
935    install(TARGETS ArmnnConverter
936            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
937endif()
938
939if(BUILD_BASE_PIPE_SERVER)
940    add_subdirectory(profiling/server/src/basePipeServer)
941endif()
942
943if(BUILD_TIMELINE_DECODER)
944    add_subdirectory(profiling/server/src/timelineDecoder)
945    add_subdirectory(src/timelineDecoder)
946endif()
947
948if(BUILD_GATORD_MOCK AND NOT BUILD_BASE_PIPE_SERVER)
949    message(ERROR, "In order to build GatordMock you must set BUILD_BASE_PIPE_SERVER = YES")
950endif()
951
952if(BUILD_GATORD_MOCK AND NOT BUILD_TIMELINE_DECODER)
953    message(ERROR, "In order to build GatordMock you must set BUILD_TIMELINE_DECODER = YES")
954endif()
955
956if(BUILD_GATORD_MOCK)
957    set(gatord_mock_sources)
958    list(APPEND gatord_mock_sources
959        tests/profiling/gatordmock/CommandFileParser.hpp
960        tests/profiling/gatordmock/CommandFileParser.cpp
961        tests/profiling/gatordmock/CommandLineProcessor.hpp
962        tests/profiling/gatordmock/CommandLineProcessor.cpp
963        tests/profiling/gatordmock/GatordMockService.hpp
964        tests/profiling/gatordmock/GatordMockService.cpp
965        tests/profiling/gatordmock/PeriodicCounterCaptureCommandHandler.cpp
966        tests/profiling/gatordmock/PeriodicCounterCaptureCommandHandler.hpp
967        tests/profiling/gatordmock/PeriodicCounterSelectionResponseHandler.cpp
968        tests/profiling/gatordmock/PeriodicCounterSelectionResponseHandler.hpp
969        tests/profiling/gatordmock/StreamMetadataCommandHandler.cpp
970        tests/profiling/gatordmock/StreamMetadataCommandHandler.hpp
971        tests/profiling/gatordmock/StubCommandHandler.hpp
972        )
973
974    add_library_ex(gatordMockService STATIC ${gatord_mock_sources})
975
976    target_include_directories(gatordMockService PRIVATE profiling/common/include
977                                                         profiling/client/include
978                                                         profiling/server/src/basePipeServer
979                                                         src/armnnUtils
980                                                         src/profiling
981                                                         src/timelineDecoder)
982
983    if(BUILD_UNIT_TESTS)
984        target_include_directories(UnitTests PRIVATE tests/profiling/gatordmock)
985        target_include_directories(UnitTests PRIVATE src/backends/backendsCommon/test)
986    endif()
987
988    add_executable_ex(GatordMock tests/profiling/gatordmock/GatordMockMain.cpp)
989
990    target_include_directories(GatordMock PRIVATE profiling/common/include
991                                                  profiling/client/include
992                                                  profiling/server/src/basePipeServer
993                                                  src/armnnUtils
994                                                  src/profiling
995                                                  src/timelineDecoder)
996
997    target_link_libraries(GatordMock PUBLIC
998                          armnn
999                          armnnBasePipeServer
1000                          timelineDecoder
1001                          gatordMockService)
1002
1003    if(Threads_FOUND AND (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android)))
1004        target_link_libraries(GatordMock PUBLIC ${CMAKE_THREAD_LIBS_INIT})
1005    endif()
1006
1007endif()
1008
1009####################################################
1010# export targets
1011set(armnn_export_targets)
1012list(APPEND armnn_export_targets
1013    armnn
1014    armnnUtils
1015)
1016
1017install(
1018    TARGETS ${armnn_export_targets}
1019    EXPORT  armnn-targets
1020    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1021    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1022)
1023
1024####################################################
1025## Set export alias
1026set_target_properties(armnn
1027    PROPERTIES
1028    EXPORT_NAME Armnn
1029)
1030
1031## Export target scrips
1032install(
1033    EXPORT      armnn-targets
1034    FILE        ArmnnTargets.cmake
1035    NAMESPACE   Armnn::
1036    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
1037)
1038
1039####################################################
1040## Create ArmnnConfig.cmake
1041include(CMakePackageConfigHelpers)
1042set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR})
1043
1044message(STATUS "CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_DIR}" )
1045message(STATUS "CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}" )
1046configure_package_config_file(
1047    ${CMAKE_CURRENT_LIST_DIR}/cmake/ArmnnConfig.cmake.in
1048    ${CMAKE_CURRENT_BINARY_DIR}/ArmnnConfig.cmake
1049    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
1050)
1051
1052####################################################
1053## Install Armnn config file
1054install(
1055    FILES
1056    ${CMAKE_CURRENT_BINARY_DIR}/ArmnnConfig.cmake
1057    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
1058)
1059
1060####################################################
1061## Export from build tree
1062export(
1063    EXPORT      armnn-targets
1064    FILE        ${CMAKE_CURRENT_BINARY_DIR}/ArmnnTargets.cmake
1065    NAMESPACE   Armnn::
1066)
1067
1068add_library(Armnn::Armnn ALIAS armnn)
1069add_library(Armnn::armnnUtils ALIAS armnnUtils)
1070
1071####################################################
1072## Build Python bindings
1073if (BUILD_PYTHON_WHL OR BUILD_PYTHON_SRC)
1074    add_subdirectory(python/pyarmnn)
1075endif()
1076