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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
if(EXISTS "${ANDROID_EXECUTABLE}")
set(ANDROID_SDK_DETECT_QUIET TRUE)
endif()
# fixup for https://github.com/android-ndk/ndk/issues/596
if(DEFINED ANDROID_NDK_REVISION AND ANDROID_NDK_REVISION MATCHES "(1[56])([0-9]+)\\.([^\n]+)\n")
set(ANDROID_NDK_REVISION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
set(ANDROID_NDK_REVISION "${ANDROID_NDK_REVISION}" CACHE INTERNAL "Android NDK revision")
endif()
# fixup -g option: https://github.com/opencv/opencv/issues/8460#issuecomment-434249750
if(INSTALL_CREATE_DISTRIB
AND (NOT BUILD_WITH_DEBUG_INFO AND NOT CMAKE_BUILD_TYPE MATCHES "Debug")
AND NOT OPENCV_SKIP_ANDROID_G_OPTION_FIX
)
if(" ${CMAKE_CXX_FLAGS} " MATCHES " -g ")
message(STATUS "Android: fixup -g compiler option from Android toolchain")
endif()
string(REPLACE " -g " " " CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} ")
string(REPLACE " -g " " " CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} ")
string(REPLACE " -g " " " CMAKE_ASM_FLAGS " ${CMAKE_ASM_FLAGS} ")
if(NOT " ${CMAKE_CXX_FLAGS_DEBUG}" MATCHES " -g")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
endif()
if(NOT " ${CMAKE_C_FLAGS_DEBUG}" MATCHES " -g")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
endif()
endif()
# https://developer.android.com/studio/command-line/variables.html
ocv_check_environment_variables(ANDROID_SDK_ROOT ANDROID_HOME ANDROID_SDK)
set(__msg_BUILD_ANDROID_PROJECTS "Use BUILD_ANDROID_PROJECTS=OFF to prepare Android project files without building them")
macro(ocv_detect_android_sdk)
if(NOT DEFINED ANDROID_SDK)
if(DEFINED ANDROID_SDK AND EXISTS "${ANDROID_SDK}")
set(ANDROID_SDK "${ANDROID_SDK}" CACHE INTERNAL "Android SDK path")
elseif(DEFINED ANDROID_HOME AND EXISTS "${ANDROID_HOME}")
set(ANDROID_SDK "${ANDROID_HOME}" CACHE INTERNAL "Android SDK path")
elseif(DEFINED ANDROID_SDK_ROOT AND EXISTS "${ANDROID_SDK_ROOT}")
set(ANDROID_SDK "${ANDROID_SDK_ROOT}" CACHE INTERNAL "Android SDK path")
endif()
if(DEFINED ANDROID_SDK)
message(STATUS "Android SDK: using location: ${ANDROID_SDK}")
endif()
endif()
if(NOT DEFINED ANDROID_SDK)
message(FATAL_ERROR "Android SDK: specify path to Android SDK via ANDROID_SDK_ROOT / ANDROID_HOME / ANDROID_SDK variables")
endif()
if(NOT EXISTS "${ANDROID_SDK}")
message(FATAL_ERROR "Android SDK: specified path doesn't exist: ${ANDROID_SDK}")
endif()
endmacro()
macro(ocv_detect_android_sdk_tools)
# https://developer.android.com/studio/releases/sdk-tools.html
if(NOT DEFINED ANDROID_SDK_TOOLS)
if(DEFINED ANDROID_SDK AND EXISTS "${ANDROID_SDK}/tools")
set(ANDROID_SDK_TOOLS "${ANDROID_SDK}/tools" CACHE INTERNAL "Android SDK Tools path")
endif()
endif()
if(NOT DEFINED ANDROID_SDK_TOOLS)
message(FATAL_ERROR "Android SDK Tools: can't automatically find Android SDK Tools. Specify path via ANDROID_SDK_TOOLS variable")
endif()
if(NOT EXISTS "${ANDROID_SDK_TOOLS}")
message(FATAL_ERROR "Android SDK Tools: specified path doesn't exist: ${ANDROID_SDK_TOOLS}")
endif()
if(NOT DEFINED ANDROID_SDK_TOOLS_VERSION)
ocv_parse_properties_file("${ANDROID_SDK_TOOLS}/source.properties"
ANDROID_TOOLS CACHE Pkg_Revision
MSG_PREFIX "Android SDK Tools: "
)
if(NOT DEFINED ANDROID_TOOLS_Pkg_Revision)
message(FATAL_ERROR "Android SDK Tools: Can't determine package version: ANDROID_SDK_TOOLS=${ANDROID_SDK_TOOLS}\n"
"Check specified parameters or force version via 'ANDROID_SDK_TOOLS_VERSION' variable.\n"
"${__msg_BUILD_ANDROID_PROJECTS}")
elseif(NOT ANDROID_SDK_DETECT_QUIET)
set(__info "")
if(DEFINED ANDROID_TOOLS_Pkg_Desc)
set(__info " (description: '${ANDROID_TOOLS_Pkg_Desc}')")
endif()
message(STATUS "Android SDK Tools: ver. ${ANDROID_TOOLS_Pkg_Revision}${__info}")
endif()
set(ANDROID_SDK_TOOLS_VERSION "${ANDROID_TOOLS_Pkg_Revision}" CACHE INTERNAL "Android SDK Tools version")
endif()
if(NOT DEFINED ANDROID_TOOLS_Pkg_Revision)
set(ANDROID_TOOLS_Pkg_Revision "${ANDROID_SDK_TOOLS_VERSION}" CACHE INTERNAL "Android SDK Tools version (deprecated)")
endif()
set(ANDROID_SDK_TOOLS_PATH "${ANDROID_SDK_TOOLS}" CACHE INTERNAL "Android SDK Tools path (deprecated)")
endmacro() # ocv_detect_android_sdk_tools
macro(ocv_detect_android_sdk_build_tools)
# https://developer.android.com/studio/releases/build-tools.html
if(NOT DEFINED ANDROID_SDK_BUILD_TOOLS_VERSION)
if(NOT DEFINED ANDROID_SDK_BUILD_TOOLS)
set(__search_dir ${ANDROID_SDK}/build-tools)
if(NOT EXISTS "${__search_dir}")
message(FATAL_ERROR "Android SDK Build Tools: directory doesn't exist: ${__search_dir} "
"${__msg_BUILD_ANDROID_PROJECTS}")
endif()
if(NOT DEFINED ANDROID_SDK_BUILD_TOOLS_SUBDIR)
file(GLOB __found RELATIVE "${__search_dir}" ${__search_dir}/*)
set(__dirlist "")
set(__selected 0)
set(__versions "")
foreach(d ${__found})
if(IS_DIRECTORY "${__search_dir}/${d}")
list(APPEND __dirlist ${d})
if(d MATCHES "[0-9]+(\\.[0-9]+)*")
list(APPEND __versions "${d}")
endif()
if(__selected VERSION_LESS d)
set(__selected "${d}")
endif()
endif()
endforeach()
if(__selected VERSION_GREATER 0)
set(ANDROID_SDK_BUILD_TOOLS_SUBDIR "${__selected}")
elseif(__dirlist)
set(__versions "")
foreach(d ${__dirlist})
if(EXISTS "${__search_dir}/${d}/source.properties")
ocv_clear_vars(ANDROID_BUILD_TOOLS_Pkg_Revision)
ocv_parse_properties_file("${__search_dir}/${d}/source.properties"
ANDROID_BUILD_TOOLS
MSG_PREFIX "Android SDK Tools: "
)
if(DEFINED ANDROID_BUILD_TOOLS_Pkg_Revision)
list(APPEND __versions "${ANDROID_BUILD_TOOLS_Pkg_Revision}")
if(__selected VERSION_LESS ANDROID_BUILD_TOOLS_Pkg_Revision)
set(ANDROID_SDK_BUILD_TOOLS_SUBDIR "${d}")
set(__selected "${ANDROID_BUILD_TOOLS_Pkg_Revision}")
endif()
endif()
endif()
endforeach()
endif()
if(DEFINED ANDROID_SDK_BUILD_TOOLS_SUBDIR)
set(ANDROID_SDK_BUILD_TOOLS_VERSION "${__selected}" CACHE STRING "Android SDK Build Tools version")
set_property(CACHE ANDROID_SDK_BUILD_TOOLS_VERSION PROPERTY STRINGS ${__versions})
set(ANDROID_SDK_BUILD_TOOLS "${__search_dir}/${d}" CACHE INTERNAL "Android SDK Build Tools path")
message(STATUS "Android SDK Build Tools: ver. ${ANDROID_SDK_BUILD_TOOLS_VERSION} (subdir ${ANDROID_SDK_BUILD_TOOLS_SUBDIR} from ${__dirlist})")
else()
message(FATAL_ERROR "Android SDK Build Tools: autodetection failed. "
"Specify ANDROID_SDK_BUILD_TOOLS_VERSION / ANDROID_SDK_BUILD_TOOLS_SUBDIR / ANDROID_SDK_BUILD_TOOLS variable to bypass autodetection.\n"
"${__msg_BUILD_ANDROID_PROJECTS}")
endif()
endif()
else()
ocv_parse_properties_file("${ANDROID_SDK_BUILD_TOOLS}/source.properties"
ANDROID_BUILD_TOOLS
MSG_PREFIX "Android SDK Tools: "
)
if(NOT DEFINED ANDROID_BUILD_TOOLS_Pkg_Revision)
message(FATAL_ERROR "Android SDK Build Tools: Can't detect version: ANDROID_SDK_BUILD_TOOLS=${ANDROID_SDK_BUILD_TOOLS}\n"
"Specify ANDROID_SDK_BUILD_TOOLS_VERSION variable to bypass autodetection.\n"
"${__msg_BUILD_ANDROID_PROJECTS}")
else()
set(ANDROID_SDK_BUILD_TOOLS_VERSION "${ANDROID_BUILD_TOOLS_Pkg_Revision}" CACHE INTERNAL "Android SDK Build Tools version")
message(STATUS "Android SDK Build Tools: ver. ${ANDROID_SDK_BUILD_TOOLS_VERSION} (ANDROID_SDK_BUILD_TOOLS=${ANDROID_SDK_BUILD_TOOLS})")
endif()
endif() # ANDROID_SDK_BUILD_TOOLS
endif() # ANDROID_SDK_BUILD_TOOLS_VERSION
endmacro() # ocv_detect_android_sdk_build_tools
if(BUILD_ANDROID_PROJECTS)
ocv_detect_android_sdk()
ocv_detect_android_sdk_tools()
ocv_detect_android_sdk_build_tools()
if(ANDROID_SDK_TOOLS_VERSION VERSION_LESS 14)
message(FATAL_ERROR "Android SDK Tools: OpenCV requires Android SDK Tools revision 14 or newer.\n"
"${__msg_BUILD_ANDROID_PROJECTS}")
endif()
if(NOT ANDROID_SDK_TOOLS_VERSION VERSION_LESS 25.3.0)
message(STATUS "Android SDK Tools: Ant (Eclipse) builds are NOT supported by Android SDK")
ocv_update(ANDROID_PROJECTS_SUPPORT_ANT OFF)
if(NOT ANDROID_SDK_BUILD_TOOLS_VERSION VERSION_LESS 26.0.2)
# https://developer.android.com/studio/releases/gradle-plugin.html
message(STATUS "Android SDK Build Tools: Gradle 3.0.0+ builds support is available")
ocv_update(ANDROID_PROJECTS_SUPPORT_GRADLE ON)
endif()
else()
include(${CMAKE_CURRENT_LIST_DIR}/../OpenCVDetectApacheAnt.cmake)
if(ANT_EXECUTABLE AND NOT ANT_VERSION VERSION_LESS 1.7)
message(STATUS "Android SDK Tools: Ant (Eclipse) builds are supported")
ocv_update(ANDROID_PROJECTS_SUPPORT_ANT ON)
endif()
endif()
if(NOT DEFINED ANDROID_PROJECTS_BUILD_TYPE)
if(ANDROID_PROJECTS_SUPPORT_ANT)
ocv_update(ANDROID_PROJECTS_BUILD_TYPE "ANT")
elseif(ANDROID_PROJECTS_SUPPORT_GRADLE)
ocv_update(ANDROID_PROJECTS_BUILD_TYPE "GRADLE")
else()
message(FATAL_ERROR "Android SDK: Can't build Android projects as requested by BUILD_ANDROID_PROJECTS=ON variable.\n"
"${__msg_BUILD_ANDROID_PROJECTS}")
endif()
endif()
if(ANDROID_PROJECTS_BUILD_TYPE STREQUAL "ANT")
message(STATUS "Android SDK Tools: Prepare Android projects for using Ant build scripts (deprecated)")
elseif(ANDROID_PROJECTS_BUILD_TYPE STREQUAL "GRADLE")
message(STATUS "Android SDK Tools: Prepare Android projects for using Gradle 3.0.0+ build scripts")
endif()
else()
message("Android: Projects builds are DISABLED")
macro(add_android_project)
endmacro()
endif() # BUILD_ANDROID_PROJECTS
if(ANDROID_PROJECTS_BUILD_TYPE STREQUAL "ANT")
include(${CMAKE_CURRENT_LIST_DIR}/android_ant_projects.cmake)
elseif(ANDROID_PROJECTS_BUILD_TYPE STREQUAL "GRADLE")
include(${CMAKE_CURRENT_LIST_DIR}/android_gradle_projects.cmake)
elseif(BUILD_ANDROID_PROJECTS)
message(FATAL_ERROR "Internal error")
else()
# TODO
#include(${CMAKE_CURRENT_LIST_DIR}/android_disabled_projects.cmake)
endif()