summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: faf88ef6d2be03f10a993cfa2db762084a572cff (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
cmake_minimum_required(VERSION 2.8.12)

project(nnfw)

if(CMAKE_VERSION VERSION_LESS 3.1.0)
  set(CMAKE_CXX_FLAGS "-std=c++11")
else(CMAKE_VERSION VERSION_LESS 3.1.0)
  set(CMAKE_CXX_STANDARD 11)
endif(CMAKE_VERSION VERSION_LESS 3.1.0)

# set host platform to build
if(NOT HOST_ARCH OR "${HOST_ARCH}" STREQUAL "")
  set(HOST_ARCH ${CMAKE_HOST_SYSTEM_PROCESSOR})
endif()

# set target platform to run
if(NOT TARGET_ARCH OR "${TARGET_ARCH}" STREQUAL "")
  set(TARGET_ARCH "${HOST_ARCH}")
endif()

if(NOT DEFINED TARGET_OS)
  set(TARGET_OS "${HOST_OS}")
endif()

if("${HOST_ARCH}" STREQUAL "x86_64")
  set(HOST_ARCH_BASE ${HOST_ARCH})
elseif("${HOST_ARCH}" STREQUAL "armv7l")
  set(HOST_ARCH_BASE "arm")
elseif("${HOST_ARCH}" STREQUAL "arm64")
  set(HOST_ARCH_BASE "arm64")
elseif("${HOST_ARCH}" STREQUAL "aarch64")
  set(HOST_ARCH_BASE "aarch64")
else()
  message(FATAL_ERROR "'${HOST_ARCH}' architecture is not supported")
endif()

if("${TARGET_ARCH}" STREQUAL "x86_64")
  set(TARGET_ARCH_BASE ${TARGET_ARCH})
elseif("${TARGET_ARCH}" STREQUAL "armv7l")
  set(TARGET_ARCH_BASE "arm")
elseif("${TARGET_ARCH}" STREQUAL "arm64")
  set(TARGET_ARCH_BASE "arm64")
elseif("${TARGET_ARCH}" STREQUAL "aarch64")
  set(TARGET_ARCH_BASE "aarch64")
else()
  message(FATAL_ERROR "'${TARGET_ARCH}' architecture is not supported")
endif()

# Determine native or cross build
if("${HOST_ARCH}" STREQUAL "${TARGET_ARCH}")
  set(BUILD_IS_NATIVE True)
else()
  set(BUILD_IS_NATIVE False)
endif()

# host & target platform name
set(HOST_PLATFORM "${HOST_ARCH}-${HOST_OS}")
set(TARGET_PLATFORM "${TARGET_ARCH}-${TARGET_OS}")

# lib pthread as a variable (pthread must be disabled on android)
set(LIB_PTHREAD pthread)

# platform specific options
include("cmake/option/option_${TARGET_PLATFORM}.cmake")

# test-coverage build flag
if("${COVERAGE_BUILD}" STREQUAL "1")
  set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
  set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
  set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
endif()

# add common flags
foreach(FLAG ${FLAGS_COMMON})
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
endforeach()

# add c flags
foreach(FLAG ${FLAGS_CONLY})
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}")
endforeach()

# add cxx flags
foreach(FLAG ${FLAGS_CXXONLY})
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
endforeach()

#
# Configuration flags
#
option(BUILD_ACL "Build ARM Compute Library" OFF)
option(BUILD_ACL_STATIC_LIB "Build ARM Comput Static Library" OFF)
option(BUILD_BENCHMARK_ACL "Build ARM Compute Library Benchmarks" OFF)
option(BUILD_NN_RUNTIME "Build NN Runtime" ON)
option(BUILD_LABS "Build lab projects" ON)
option(BUILD_ANDROID_NN_RUNTIME_TEST "Build Android NN Runtime Test" ON)

#
# Common variables
#
set(NNFW_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)

if(NOT "${TARGET_OS}" STREQUAL "tizen" AND NOT "${TARGET_OS}" STREQUAL "android")
  set(NNFW_ACL_FOLDER ${CMAKE_SOURCE_DIR}/externals/acl)
  set(NNFW_ACL_INCLUDES ${NNFW_ACL_FOLDER}
    ${NNFW_ACL_FOLDER}/include)
else()
  set(NNFW_ACL_FOLDER "")
  set(NNFW_ACL_INCLUDES "")
endif()
set(NNFW_ACL_LIBS arm_compute_graph arm_compute arm_compute_core)
set(NNFW_NN_RUNTIME_ROOT ${CMAKE_SOURCE_DIR}/runtimes/nn)

# NOTE '${CMAKE_INSTALL_PREFIX}/lib' should be added as a link directory as
#      CI server places pre-built ARM compute libraries on this directory.
link_directories(${CMAKE_INSTALL_PREFIX}/lib)

#
# GTest support
#
if("${TARGET_OS}" STREQUAL "tizen" AND NOT "${TARGET_OS}" STREQUAL "android")
  enable_testing()
  find_package(GTest REQUIRED)
  include_directories(${GTEST_INCLUDE_DIR})
else()
  include(ExternalProject)
  # Download and install GoogleTest
  ExternalProject_Add(
    googletest
    URL https://github.com/google/googletest/archive/release-1.8.0.zip
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/googletest
    # Disable install step
    INSTALL_COMMAND ""
    LOG_DOWNLOAD 1
    LOG_BUILD 1
    LOG_CONFIGURE 1
    CMAKE_ARGS
    -DCMAKE_TOOLCHAIN_FILE=${PROJECT_SOURCE_DIR}/cmake/config/config_${TARGET_ARCH}-${TARGET_OS}.cmake
    )
  ExternalProject_Get_Property(googletest source_dir binary_dir)

  # include and link path for all sub project
  include_directories(${source_dir}/googletest/include/)
  link_directories(${binary_dir}/googlemock/gtest/)
endif()

# gtest libs
set(NNFW_GTEST_LIBS libgtest.a libgtest_main.a ${LIB_PTHREAD})

# TODO For now Android build is being enabled incrementally so not all subdirectories are added yet.
#      However we are going to have the same subdirectories with other OS eventually.
if("${TARGET_OS}" STREQUAL "android")

  include_directories(externals/tensorflow)
  include_directories(externals/flatbuffers/include)
  include_directories(include)

  add_subdirectory(libs)
  add_subdirectory(externals)
  add_subdirectory(tools/nnapi_test)

  if(BUILD_NN_RUNTIME)
    add_subdirectory(runtimes/nn)
  endif(BUILD_NN_RUNTIME)
  add_subdirectory(src/support/tflite)

else("${TARGET_OS}" STREQUAL "android") # General case (non-android build)

# TODO Fix indentation

if (NOT ${TARGET_OS} STREQUAL "tizen")
  add_subdirectory(externals)
endif()
add_subdirectory(libs)
add_subdirectory(tools)
add_subdirectory(runtimes)

endif("${TARGET_OS}" STREQUAL "android")