summaryrefslogtreecommitdiff
path: root/infra/nnfw/cmake/packages/ARMComputeConfig.cmake
blob: ccf96692e8e4849aded0762c8a8465ca10f4f06d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
function(_ARMCompute_Import)
  include(FindPackageHandleStandardArgs)

  list(APPEND ARMCompute_LIB_SEARCH_PATHS ${ARMCompute_PREFIX})

  find_path(INCLUDE_DIR NAMES arm_compute/core/ITensor.h PATHS ${ARMCompute_INCLUDE_SEARCH_PATHS})

  find_library(CORE_LIBRARY NAMES  	 arm_compute_core  PATHS ${ARMCompute_LIB_SEARCH_PATHS})
  find_library(RUNTIME_LIBRARY NAMES arm_compute       PATHS ${ARMCompute_LIB_SEARCH_PATHS})
  find_library(GRAPH_LIBRARY NAMES   arm_compute_graph PATHS ${ARMCompute_LIB_SEARCH_PATHS})

  if(NOT INCLUDE_DIR)
    nnfw_find_package(ARMComputeSource QUIET)
    if (NOT ARMComputeSource_FOUND)
      set(ARMCompute_FOUND FALSE PARENT_SCOPE)
      return()
    endif()
    set(INCLUDE_DIR ${NNFW_EXTERNALS_DIR}/acl ${NNFW_EXTERNALS_DIR}/acl/include)
  endif(NOT INCLUDE_DIR)

  # NOTE '${CMAKE_INSTALL_PREFIX}/lib' should be searched as CI server places
  #       pre-built ARM compute libraries on this directory
  if(NOT CORE_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_core.so)
    set(CORE_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_core.so)
  endif()

  if(NOT CORE_LIBRARY)
    set(ARMCompute_FOUND FALSE PARENT_SCOPE)
    return()
  endif()

  if(NOT RUNTIME_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute.so)
    set(RUNTIME_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute.so)
  endif()

  if(NOT RUNTIME_LIBRARY)
    set(ARMCompute_FOUND FALSE PARENT_SCOPE)
    return()
  endif()

  if(NOT GRAPH_LIBRARY AND EXISTS ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_graph.so)
    set(GRAPH_LIBRARY ${CMAKE_INSTALL_PREFIX}/lib/libarm_compute_graph.so)
  endif()

  if(NOT GRAPH_LIBRARY)
    set(ARMCompute_FOUND FALSE PARENT_SCOPE)
    return()
  endif()

  if(NOT TARGET arm_compute_core)
    add_library(arm_compute_core INTERFACE)
    target_include_directories(arm_compute_core SYSTEM INTERFACE ${INCLUDE_DIR})
	target_link_libraries(arm_compute_core INTERFACE dl ${LIB_PTHREAD})
    target_link_libraries(arm_compute_core INTERFACE ${CORE_LIBRARY})
  endif(NOT TARGET arm_compute_core)

  if(NOT TARGET arm_compute)
    add_library(arm_compute INTERFACE)
    target_include_directories(arm_compute SYSTEM INTERFACE ${INCLUDE_DIR})
    target_link_libraries(arm_compute INTERFACE ${RUNTIME_LIBRARY})
    target_link_libraries(arm_compute INTERFACE arm_compute_core)
  endif(NOT TARGET arm_compute)

  if(NOT TARGET arm_compute_graph)
    add_library(arm_compute_graph INTERFACE)
    target_include_directories(arm_compute_graph SYSTEM INTERFACE ${INCLUDE_DIR})
    target_link_libraries(arm_compute_graph INTERFACE ${GRAPH_LIBRARY})
    target_link_libraries(arm_compute_graph INTERFACE arm_compute)
  endif(NOT TARGET arm_compute_graph)

  set(ARMCompute_FOUND TRUE PARENT_SCOPE)
endfunction(_ARMCompute_Import)

### Check whether library exists
function(_ARMCompute_Check VAR LIBDIR)
  set(FOUND TRUE)

  if(NOT EXISTS "${LIBDIR}/libarm_compute_core.so")
    set(FOUND FALSE)
  endif()

  if(NOT EXISTS "${LIBDIR}/libarm_compute.so")
    set(FOUND FALSE)
  endif()

  if(NOT EXISTS "${LIBDIR}/libarm_compute_graph.so")
    set(FOUND FALSE)
  endif()

  set(${VAR} ${FOUND} PARENT_SCOPE)
endfunction(_ARMCompute_Check)

# Let's build and install ARMCompute libraries
# NOTE This function silently returns on error
function(_ARMCompute_Build ARMCompute_PREFIX)
  ### Check whether library exists
  _ARMCompute_Check(ARMCompute_FOUND ${ARMCompute_PREFIX})

  if(ARMCompute_FOUND)
    return()
  endif(ARMCompute_FOUND)

  ### Let's build with SCONS
  nnfw_find_package(ARMComputeSource QUIET)

  if(NOT ARMComputeSource_FOUND)
    return()
  endif(NOT ARMComputeSource_FOUND)

  find_program(SCONS_PATH scons)

  if(NOT SCONS_PATH)
    return()
  endif(NOT SCONS_PATH)

  if(CMAKE_BUILD_TYPE)
    string(TOLOWER "${CMAKE_BUILD_TYPE}" SCON_BUILD_TYPE)
  else(CMAKE_BUILD_TYPE)
    set(SCON_BUILD_TYPE "release")
  endif(CMAKE_BUILD_TYPE)

  #### Architecture-specific configurations
  if(TARGET_ARCH STREQUAL "armv7l")
    set(BUILD_ARCH "armv7a")
    set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}")
  endif()

  if(TARGET_ARCH STREQUAL "aarch64")
    set(BUILD_ARCH "arm64-v8a")
    set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}")
  endif()

  if(TARGET_ARCH STREQUAL "arm64")
    set(BUILD_ARCH "arm64-v8a")
    set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}")
  endif()

  #### Platform-specific configurations
  #### TODO Support android

  #### Mode-specific configurations
  if(SCON_BUILD_TYPE STREQUAL "debug")
    list(APPEND SCONS_OPTIONS "debug=1")
  endif()

  #### Generic configurations
  list(APPEND SCONS_OPTIONS "neon=1")
  list(APPEND SCONS_OPTIONS "opencl=1")
  list(APPEND SCONS_OPTIONS "examples=0")
  list(APPEND SCONS_OPTIONS "Werror=0")
  list(APPEND SCONS_OPTIONS "os=${TARGET_OS}")
  include(ProcessorCount)
  ProcessorCount(N)
  if((NOT N EQUAL 0) AND BUILD_EXT_MULTITHREAD)
    list(APPEND SCONS_OPTIONS -j${N})
  endif()
  if(DEFINED BUILD_ARCH)
    list(APPEND SCONS_OPTIONS "arch=${BUILD_ARCH}")
  endif(DEFINED BUILD_ARCH)

  if(DEFINED BUILD_DIR)
    list(APPEND SCONS_OPTIONS "build_dir=${BUILD_DIR}")
  endif(DEFINED BUILD_DIR)

  message(STATUS "Build ARMCompute with ${SCONS_PATH} ('${SCONS_OPTIONS}'")

  # Copy externals/SConstruct to externals/acl/ for Tizen build support.
  # TODO The change of externals/SConstruct should be upstreamed to ARM Compute Library community layer.
  execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_LIST_DIR}/ARMCompute/SConstruct" "${ARMComputeSource_DIR}")

  # Build ARMCompute libraries with SCONS
  # NOTE ARMCompute SConstruct unconditioanlly appends "arm-linux-gnueabihf-" prefix for linux
  execute_process(COMMAND /usr/bin/env CC=gcc CXX=g++ "${SCONS_PATH}" ${SCONS_OPTIONS}
                  WORKING_DIRECTORY ${ARMComputeSource_DIR}
                  RESULT_VARIABLE ARMCompute_BUILD)

  # Install ARMCompute libraries
  # Ps. CI server will copy below installed libraries to target device to test.
  execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${ARMCompute_PREFIX}"
                  WORKING_DIRECTORY ${ARMComputeSource_DIR}
                  RESULT_VARIABLE ARMCompute_BUILD)
  execute_process(COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_core.so" "${ARMCompute_PREFIX}"
                  COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute.so" "${ARMCompute_PREFIX}"
                  COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_graph.so" "${ARMCompute_PREFIX}"
                  WORKING_DIRECTORY ${ARMComputeSource_DIR}
                  RESULT_VARIABLE ARMCompute_BUILD)
endfunction(_ARMCompute_Build)


set(ARMCompute_PREFIX ${CMAKE_INSTALL_PREFIX}/lib)

# This is a workaround for CI issues
# Ps. CI server will copy below installed libraries to target device to test.
# TODO Remove this workaround
if(DEFINED ARMCompute_EXTDIR)
  execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${ARMCompute_PREFIX}")
  execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute_core.so" "${ARMCompute_PREFIX}"
                  COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute.so" "${ARMCompute_PREFIX}"
                  COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute_graph.so" "${ARMCompute_PREFIX}")
endif(DEFINED ARMCompute_EXTDIR)

if(BUILD_ARMCOMPUTE)
  _ARMCompute_Build("${ARMCompute_PREFIX}")
endif(BUILD_ARMCOMPUTE)
_ARMCompute_Import()