Advertisement
Guest User

Untitled

a guest
Jan 27th, 2019
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.29 KB | None | 0 0
  1. # Copyright (C) 2016 The Android Open Source Project
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14.  
  15. # Configurable variables.
  16. # Modeled after the ndk-build system.
  17. # For any variables defined in:
  18. # https://developer.android.com/ndk/guides/android_mk.html
  19. # https://developer.android.com/ndk/guides/application_mk.html
  20. # if it makes sense for CMake, then replace LOCAL, APP, or NDK with ANDROID, and
  21. # we have that variable below.
  22. # The exception is ANDROID_TOOLCHAIN vs NDK_TOOLCHAIN_VERSION.
  23. # Since we only have one version of each gcc and clang, specifying a version
  24. # doesn't make much sense.
  25. #
  26. # ANDROID_TOOLCHAIN
  27. # ANDROID_ABI
  28. # ANDROID_PLATFORM
  29. # ANDROID_STL
  30. # ANDROID_PIE
  31. # ANDROID_CPP_FEATURES
  32. # ANDROID_ALLOW_UNDEFINED_SYMBOLS
  33. # ANDROID_ARM_MODE
  34. # ANDROID_ARM_NEON
  35. # ANDROID_DISABLE_NO_EXECUTE
  36. # ANDROID_DISABLE_RELRO
  37. # ANDROID_DISABLE_FORMAT_STRING_CHECKS
  38. # ANDROID_CCACHE
  39.  
  40. cmake_minimum_required(VERSION 3.6.0)
  41.  
  42. # Inhibit all of CMake's own NDK handling code.
  43. set(CMAKE_SYSTEM_VERSION 1)
  44.  
  45. # CMake invokes the toolchain file twice during the first build, but only once
  46. # during subsequent rebuilds. This was causing the various flags to be added
  47. # twice on the first build, and on a rebuild ninja would see only one set of the
  48. # flags and rebuild the world.
  49. # https://github.com/android-ndk/ndk/issues/323
  50. if(ANDROID_NDK_TOOLCHAIN_INCLUDED)
  51. return()
  52. endif(ANDROID_NDK_TOOLCHAIN_INCLUDED)
  53. set(ANDROID_NDK_TOOLCHAIN_INCLUDED true)
  54.  
  55. # Android NDK
  56. get_filename_component(ANDROID_NDK "$ENV{ANDROID_NDK}" ABSOLUTE)
  57.  
  58. # Android NDK revision
  59. # Possible formats:
  60. # * r16, build 1234: 16.0.1234
  61. # * r16b, build 1234: 16.1.1234
  62. # * r16 beta 1, build 1234: 16.0.1234-beta1
  63. #
  64. # Canary builds are not specially marked.
  65. file(READ "${ANDROID_NDK}/source.properties" ANDROID_NDK_SOURCE_PROPERTIES)
  66.  
  67. set(ANDROID_NDK_REVISION_REGEX
  68. "^Pkg\\.Desc = Android NDK\nPkg\\.Revision = ([0-9]+)\\.([0-9]+)\\.([0-9]+)(-beta([0-9]+))?")
  69. if(NOT ANDROID_NDK_SOURCE_PROPERTIES MATCHES "${ANDROID_NDK_REVISION_REGEX}")
  70. message(SEND_ERROR "Failed to parse Android NDK revision: ${ANDROID_NDK}/source.properties.\n${ANDROID_NDK_SOURCE_PROPERTIES}")
  71. endif()
  72.  
  73. set(ANDROID_NDK_MAJOR "${CMAKE_MATCH_1}")
  74. set(ANDROID_NDK_MINOR "${CMAKE_MATCH_2}")
  75. set(ANDROID_NDK_BUILD "${CMAKE_MATCH_3}")
  76. set(ANDROID_NDK_BETA "${CMAKE_MATCH_5}")
  77. if(ANDROID_NDK_BETA STREQUAL "")
  78. set(ANDROID_NDK_BETA "0")
  79. endif()
  80. set(ANDROID_NDK_REVISION
  81. "${ANDROID_NDK_MAJOR}.${ANDROID_NDK_MINOR}.${ANDROID_NDK_BUILD}${CMAKE_MATCH_4}")
  82.  
  83. # Touch toolchain variable to suppress "unused variable" warning.
  84. # This happens if CMake is invoked with the same command line the second time.
  85. if(CMAKE_TOOLCHAIN_FILE)
  86. endif()
  87.  
  88. # Compatibility for configurable variables.
  89. # Compatible with configurable variables from the other toolchain file:
  90. # https://github.com/taka-no-me/android-cmake
  91. # TODO: We should consider dropping compatibility to simplify things once most
  92. # of our users have migrated to our standard set of configurable variables.
  93. if(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_TOOLCHAIN)
  94. if(ANDROID_TOOLCHAIN_NAME MATCHES "-clang([0-9].[0-9])?$")
  95. set(ANDROID_TOOLCHAIN clang)
  96. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "-[0-9].[0-9]$")
  97. set(ANDROID_TOOLCHAIN gcc)
  98. endif()
  99. endif()
  100. if(ANDROID_ABI STREQUAL "armeabi-v7a with NEON")
  101. set(ANDROID_ABI armeabi-v7a)
  102. set(ANDROID_ARM_NEON TRUE)
  103. elseif(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_ABI)
  104. if(ANDROID_TOOLCHAIN_NAME MATCHES "^arm-linux-androideabi-")
  105. set(ANDROID_ABI armeabi-v7a)
  106. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^aarch64-linux-android-")
  107. set(ANDROID_ABI arm64-v8a)
  108. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^x86-")
  109. set(ANDROID_ABI x86)
  110. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^x86_64-")
  111. set(ANDROID_ABI x86_64)
  112. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^mipsel-linux-android-")
  113. set(ANDROID_ABI mips)
  114. elseif(ANDROID_TOOLCHAIN_NAME MATCHES "^mips64el-linux-android-")
  115. set(ANDROID_ABI mips64)
  116. endif()
  117. endif()
  118. if(ANDROID_NATIVE_API_LEVEL AND NOT ANDROID_PLATFORM)
  119. if(ANDROID_NATIVE_API_LEVEL MATCHES "^android-[0-9]+$")
  120. set(ANDROID_PLATFORM ${ANDROID_NATIVE_API_LEVEL})
  121. elseif(ANDROID_NATIVE_API_LEVEL MATCHES "^[0-9]+$")
  122. set(ANDROID_PLATFORM android-${ANDROID_NATIVE_API_LEVEL})
  123. endif()
  124. endif()
  125. if(DEFINED ANDROID_APP_PIE AND NOT DEFINED ANDROID_PIE)
  126. set(ANDROID_PIE "${ANDROID_APP_PIE}")
  127. endif()
  128. if(ANDROID_STL_FORCE_FEATURES AND NOT DEFINED ANDROID_CPP_FEATURES)
  129. set(ANDROID_CPP_FEATURES "rtti exceptions")
  130. endif()
  131. if(DEFINED ANDROID_NO_UNDEFINED AND NOT DEFINED ANDROID_ALLOW_UNDEFINED_SYMBOLS)
  132. if(ANDROID_NO_UNDEFINED)
  133. set(ANDROID_ALLOW_UNDEFINED_SYMBOLS FALSE)
  134. else()
  135. set(ANDROID_ALLOW_UNDEFINED_SYMBOLS TRUE)
  136. endif()
  137. endif()
  138. if(DEFINED ANDROID_SO_UNDEFINED AND NOT DEFINED ANDROID_ALLOW_UNDEFINED_SYMBOLS)
  139. set(ANDROID_ALLOW_UNDEFINED_SYMBOLS "${ANDROID_SO_UNDEFINED}")
  140. endif()
  141. if(DEFINED ANDROID_FORCE_ARM_BUILD AND NOT ANDROID_ARM_MODE)
  142. if(ANDROID_FORCE_ARM_BUILD)
  143. set(ANDROID_ARM_MODE arm)
  144. else()
  145. set(ANDROID_ARM_MODE thumb)
  146. endif()
  147. endif()
  148. if(DEFINED ANDROID_NOEXECSTACK AND NOT DEFINED ANDROID_DISABLE_NO_EXECUTE)
  149. if(ANDROID_NOEXECSTACK)
  150. set(ANDROID_DISABLE_NO_EXECUTE FALSE)
  151. else()
  152. set(ANDROID_DISABLE_NO_EXECUTE TRUE)
  153. endif()
  154. endif()
  155. if(DEFINED ANDROID_RELRO AND NOT DEFINED ANDROID_DISABLE_RELRO)
  156. if(ANDROID_RELRO)
  157. set(ANDROID_DISABLE_RELRO FALSE)
  158. else()
  159. set(ANDROID_DISABLE_RELRO TRUE)
  160. endif()
  161. endif()
  162. if(NDK_CCACHE AND NOT ANDROID_CCACHE)
  163. set(ANDROID_CCACHE "${NDK_CCACHE}")
  164. endif()
  165.  
  166. # Default values for configurable variables.
  167. if(NOT ANDROID_TOOLCHAIN)
  168. set(ANDROID_TOOLCHAIN clang)
  169. elseif(ANDROID_TOOLCHAIN STREQUAL gcc)
  170. message(FATAL_ERROR "GCC is no longer supported. See "
  171. "https://android.googlesource.com/platform/ndk/+/master/docs/ClangMigration.md.")
  172. endif()
  173. if(NOT ANDROID_ABI)
  174. set(ANDROID_ABI armeabi-v7a)
  175. endif()
  176.  
  177. if(ANDROID_ABI STREQUAL armeabi)
  178. message(FATAL_ERROR "armeabi is no longer supported. Use armeabi-v7a.")
  179. elseif(ANDROID_ABI MATCHES "^(mips|mips64)$")
  180. message(FATAL_ERROR "MIPS and MIPS64 are no longer supported.")
  181. endif()
  182.  
  183. include(${ANDROID_NDK}/build/cmake/platforms.cmake)
  184.  
  185. # If no platform version was chosen by the user, default to the minimum version
  186. # supported by this NDK.
  187. if(NOT ANDROID_PLATFORM)
  188. message(STATUS "\
  189. ANDROID_PLATFORM not set. Defaulting to minimum supported version
  190. ${NDK_MIN_PLATFORM_LEVEL}.")
  191.  
  192. set(ANDROID_PLATFORM "android-${NDK_MIN_PLATFORM_LEVEL}")
  193. endif()
  194.  
  195. if(ANDROID_PLATFORM STREQUAL "latest")
  196. message(STATUS
  197. "Using latest available ANDROID_PLATFORM: ${NDK_MAX_PLATFORM_LEVEL}.")
  198. set(ANDROID_PLATFORM "android-${NDK_MAX_PLATFORM_LEVEL}")
  199. string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
  200. endif()
  201.  
  202. string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
  203.  
  204. # Aliases defined by meta/platforms.json include codename aliases for platform
  205. # API levels as well as cover any gaps in platforms that may not have had NDK
  206. # APIs.
  207. if(NOT "${NDK_PLATFORM_ALIAS_${ANDROID_PLATFORM_LEVEL}}" STREQUAL "")
  208. message(STATUS "\
  209. ${ANDROID_PLATFORM} is an alias for \
  210. ${NDK_PLATFORM_ALIAS_${ANDROID_PLATFORM_LEVEL}}. Adjusting ANDROID_PLATFORM to \
  211. match.")
  212. set(ANDROID_PLATFORM "${NDK_PLATFORM_ALIAS_${ANDROID_PLATFORM_LEVEL}}")
  213. string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
  214. endif()
  215.  
  216. # Pull up to the minimum supported version if an old API level was requested.
  217. if(ANDROID_PLATFORM_LEVEL LESS NDK_MIN_PLATFORM_LEVEL)
  218. message(STATUS "\
  219. ${ANDROID_PLATFORM} is unsupported. Using minimum supported version \
  220. ${NDK_MIN_PLATFORM_LEVEL}.")
  221. set(ANDROID_PLATFORM "android-${NDK_MIN_PLATFORM_LEVEL}")
  222. string(REPLACE "android-" "" ANDROID_PLATFORM_LEVEL ${ANDROID_PLATFORM})
  223. endif()
  224.  
  225. # And for LP64 we need to pull up to 21. No diagnostic is provided here because
  226. # minSdkVersion < 21 is valid for the project even though it may not be for this
  227. # ABI.
  228. if(ANDROID_ABI MATCHES "64(-v8a)?$" AND ANDROID_PLATFORM_LEVEL LESS 21)
  229. set(ANDROID_PLATFORM android-21)
  230. set(ANDROID_PLATFORM_LEVEL 21)
  231. endif()
  232.  
  233. # ANDROID_PLATFORM beyond the maximum is an error. The correct way to specify
  234. # the latest version is ANDROID_PLATFORM=latest.
  235. if(ANDROID_PLATFORM_LEVEL GREATER NDK_MAX_PLATFORM_LEVEL)
  236. message(SEND_ERROR "\
  237. ${ANDROID_PLATFORM} is above the maximum supported version \
  238. ${NDK_MAX_PLATFORM_LEVEL}. Choose a supported API level or set \
  239. ANDROID_PLATFORM to \"latest\".")
  240. endif()
  241.  
  242. if(NOT ANDROID_STL)
  243. set(ANDROID_STL c++_static)
  244. endif()
  245.  
  246. if("${ANDROID_STL}" STREQUAL "gnustl_shared" OR
  247. "${ANDROID_STL}" STREQUAL "gnustl_static" OR
  248. "${ANDROID_STL}" STREQUAL "stlport_shared" OR
  249. "${ANDROID_STL}" STREQUAL "stlport_static")
  250. message(FATAL_ERROR "\
  251. ${ANDROID_STL} is no longer supported. Please switch to either c++_shared or \
  252. c++_static. See https://developer.android.com/ndk/guides/cpp-support.html \
  253. for more information.")
  254. endif()
  255.  
  256. set(ANDROID_PIE TRUE)
  257. if(NOT ANDROID_ARM_MODE)
  258. set(ANDROID_ARM_MODE thumb)
  259. endif()
  260.  
  261. if(ANDROID_ABI STREQUAL "armeabi-v7a" AND NOT DEFINED ANDROID_ARM_NEON)
  262. if(NOT ANDROID_PLATFORM_LEVEL LESS 23)
  263. set(ANDROID_ARM_NEON TRUE)
  264. endif()
  265. endif()
  266.  
  267. # Export configurable variables for the try_compile() command.
  268. set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
  269. ANDROID_TOOLCHAIN
  270. ANDROID_ABI
  271. ANDROID_PLATFORM
  272. ANDROID_STL
  273. ANDROID_PIE
  274. ANDROID_CPP_FEATURES
  275. ANDROID_ALLOW_UNDEFINED_SYMBOLS
  276. ANDROID_ARM_MODE
  277. ANDROID_ARM_NEON
  278. ANDROID_DISABLE_NO_EXECUTE
  279. ANDROID_DISABLE_RELRO
  280. ANDROID_DISABLE_FORMAT_STRING_CHECKS
  281. ANDROID_CCACHE)
  282.  
  283. # Standard cross-compiling stuff.
  284. set(ANDROID TRUE)
  285. set(CMAKE_SYSTEM_NAME Android)
  286.  
  287. # Allow users to override these values in case they want more strict behaviors.
  288. # For example, they may want to prevent the NDK's libz from being picked up so
  289. # they can use their own.
  290. # https://github.com/android-ndk/ndk/issues/517
  291. if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
  292. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  293. endif()
  294.  
  295. if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
  296. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  297. endif()
  298.  
  299. if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
  300. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  301. endif()
  302.  
  303. if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
  304. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  305. endif()
  306.  
  307. # ABI.
  308. set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI})
  309. if(ANDROID_ABI STREQUAL armeabi-v7a)
  310. set(ANDROID_SYSROOT_ABI arm)
  311. set(ANDROID_TOOLCHAIN_NAME arm-linux-androideabi)
  312. set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME})
  313. set(ANDROID_HEADER_TRIPLE arm-linux-androideabi)
  314. set(CMAKE_SYSTEM_PROCESSOR armv7-a)
  315. set(ANDROID_LLVM_TRIPLE armv7-none-linux-androideabi)
  316. elseif(ANDROID_ABI STREQUAL arm64-v8a)
  317. set(ANDROID_SYSROOT_ABI arm64)
  318. set(CMAKE_SYSTEM_PROCESSOR aarch64)
  319. set(ANDROID_TOOLCHAIN_NAME aarch64-linux-android)
  320. set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_NAME})
  321. set(ANDROID_LLVM_TRIPLE aarch64-none-linux-android)
  322. set(ANDROID_HEADER_TRIPLE aarch64-linux-android)
  323. elseif(ANDROID_ABI STREQUAL x86)
  324. set(ANDROID_SYSROOT_ABI x86)
  325. set(CMAKE_SYSTEM_PROCESSOR i686)
  326. set(ANDROID_TOOLCHAIN_NAME i686-linux-android)
  327. set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_ABI})
  328. set(ANDROID_LLVM_TRIPLE i686-none-linux-android)
  329. set(ANDROID_HEADER_TRIPLE i686-linux-android)
  330. elseif(ANDROID_ABI STREQUAL x86_64)
  331. set(ANDROID_SYSROOT_ABI x86_64)
  332. set(CMAKE_SYSTEM_PROCESSOR x86_64)
  333. set(ANDROID_TOOLCHAIN_NAME x86_64-linux-android)
  334. set(ANDROID_TOOLCHAIN_ROOT ${ANDROID_ABI})
  335. set(ANDROID_LLVM_TRIPLE x86_64-none-linux-android)
  336. set(ANDROID_HEADER_TRIPLE x86_64-linux-android)
  337. else()
  338. message(FATAL_ERROR "Invalid Android ABI: ${ANDROID_ABI}.")
  339. endif()
  340.  
  341. set(ANDROID_LLVM_TRIPLE "${ANDROID_LLVM_TRIPLE}${ANDROID_PLATFORM_LEVEL}")
  342.  
  343. # Don't re-export libgcc symbols in every binary.
  344. list(APPEND ANDROID_LINKER_FLAGS -Wl,--exclude-libs,libgcc.a)
  345. list(APPEND ANDROID_LINKER_FLAGS -Wl,--exclude-libs,libatomic.a)
  346.  
  347. # STL.
  348. set(USE_NOSTDLIBXX TRUE)
  349. set(ANDROID_STL_STATIC_LIBRARIES)
  350. set(ANDROID_STL_SHARED_LIBRARIES)
  351. set(ANDROID_STL_LDLIBS)
  352. if(ANDROID_STL STREQUAL system)
  353. set(USE_NOSTDLIBXX FALSE)
  354. if(NOT "x${ANDROID_CPP_FEATURES}" STREQUAL "x")
  355. set(ANDROID_STL_STATIC_LIBRARIES c++abi)
  356. if(ANDROID_PLATFORM_LEVEL LESS 21)
  357. list(APPEND ANDROID_STL_STATIC_LIBRARIES android_support)
  358. endif()
  359. if(ANDROID_ABI STREQUAL armeabi-v7a)
  360. list(APPEND ANDROID_STL_STATIC_LIBRARIES unwind)
  361. list(APPEND ANDROID_STL_LDLIBS dl)
  362. endif()
  363. endif()
  364. elseif(ANDROID_STL STREQUAL c++_static)
  365. list(APPEND ANDROID_STL_STATIC_LIBRARIES c++_static c++abi)
  366. if(ANDROID_PLATFORM_LEVEL LESS 21)
  367. list(APPEND ANDROID_STL_STATIC_LIBRARIES android_support)
  368. endif()
  369. if(ANDROID_ABI STREQUAL armeabi-v7a)
  370. list(APPEND ANDROID_STL_STATIC_LIBRARIES unwind)
  371. list(APPEND ANDROID_STL_LDLIBS dl)
  372. endif()
  373. elseif(ANDROID_STL STREQUAL c++_shared)
  374. if(ANDROID_PLATFORM_LEVEL LESS 21)
  375. list(APPEND ANDROID_STL_STATIC_LIBRARIES android_support)
  376. endif()
  377. if(ANDROID_ABI STREQUAL armeabi-v7a)
  378. list(APPEND ANDROID_STL_STATIC_LIBRARIES unwind)
  379. endif()
  380. list(APPEND ANDROID_STL_SHARED_LIBRARIES c++_shared)
  381. elseif(ANDROID_STL STREQUAL none)
  382. else()
  383. message(FATAL_ERROR "Invalid Android STL: ${ANDROID_STL}.")
  384. endif()
  385.  
  386. if(USE_NOSTDLIBXX AND ANDROID_TOOLCHAIN STREQUAL clang)
  387. list(APPEND ANDROID_LINKER_FLAGS "-nostdlib++")
  388. endif()
  389.  
  390. # Behavior of CMAKE_SYSTEM_LIBRARY_PATH and CMAKE_LIBRARY_PATH are really weird
  391. # when CMAKE_SYSROOT is set. The library path is appended to the sysroot even if
  392. # the library path is an abspath. Using a relative path from the sysroot doesn't
  393. # work either, because the relative path is abspath'd relative to the current
  394. # CMakeLists.txt file before being appended :(
  395. #
  396. # We can try to get out of this problem by providing another root path for cmake
  397. # to check. CMAKE_FIND_ROOT_PATH is intended for this purpose:
  398. # https://cmake.org/cmake/help/v3.8/variable/CMAKE_FIND_ROOT_PATH.html
  399. #
  400. # In theory this should just be our sysroot, but since we don't have a single
  401. # sysroot that is correct (there's only one set of headers, but multiple
  402. # locations for libraries that need to be handled differently). Some day we'll
  403. # want to move all the libraries into ${ANDROID_NDK}/sysroot, but we'll need to
  404. # make some fixes to Clang, various build systems, and possibly CMake itself to
  405. # get that working.
  406. list(APPEND CMAKE_FIND_ROOT_PATH "${ANDROID_NDK}")
  407.  
  408. # Sysroot.
  409. set(CMAKE_SYSROOT "${ANDROID_NDK}/sysroot")
  410.  
  411. # CMake 3.9 tries to use CMAKE_SYSROOT_COMPILE before it gets set from
  412. # CMAKE_SYSROOT, which leads to using the system's /usr/include. Set this
  413. # manually.
  414. # https://github.com/android-ndk/ndk/issues/467
  415. set(CMAKE_SYSROOT_COMPILE "${CMAKE_SYSROOT}")
  416.  
  417. # The compiler driver doesn't check any arch specific include locations (though
  418. # maybe we should add that). Architecture specific headers like asm/ and
  419. # machine/ are installed to an arch-$ARCH subdirectory of the sysroot.
  420. list(APPEND ANDROID_COMPILER_FLAGS
  421. "-isystem ${CMAKE_SYSROOT}/usr/include/${ANDROID_HEADER_TRIPLE}")
  422.  
  423. # We need different sysroots for linking and compiling, but cmake doesn't
  424. # support that. Pass the sysroot flag manually when linking.
  425. set(ANDROID_SYSTEM_LIBRARY_PATH
  426. "${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}/arch-${ANDROID_SYSROOT_ABI}")
  427. list(APPEND ANDROID_LINKER_FLAGS "--sysroot ${ANDROID_SYSTEM_LIBRARY_PATH}")
  428.  
  429. # find_library searches a handful of paths as described by
  430. # https://cmake.org/cmake/help/v3.6/command/find_library.html. Since libraries
  431. # are per-API level and headers aren't, We don't have libraries in the
  432. # CMAKE_SYSROOT. Set up CMAKE_SYSTEM_LIBRARY_PATH
  433. # (https://cmake.org/cmake/help/v3.6/variable/CMAKE_SYSTEM_LIBRARY_PATH.html)
  434. # instead.
  435. #
  436. # NB: The suffix is just lib here instead of dealing with lib64 because
  437. # apparently CMake does some automatic rewriting of that? I've been testing by
  438. # building my own CMake with a bunch of logging added, and that seems to be the
  439. # case.
  440. list(APPEND CMAKE_SYSTEM_LIBRARY_PATH
  441. "${ANDROID_SYSTEM_LIBRARY_PATH}/usr/lib")
  442.  
  443. # Toolchain.
  444. if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
  445. set(ANDROID_HOST_TAG linux-x86_64)
  446. elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
  447. set(ANDROID_HOST_TAG darwin-x86_64)
  448. elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
  449. set(ANDROID_HOST_TAG windows-x86_64)
  450. endif()
  451. set(ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_ROOT}-4.9/prebuilt/${ANDROID_HOST_TAG}")
  452. set(ANDROID_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_NAME}-")
  453. if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
  454. set(ANDROID_TOOLCHAIN_SUFFIX .exe)
  455. endif()
  456.  
  457. set(ANDROID_COMPILER_FLAGS)
  458. set(ANDROID_COMPILER_FLAGS_CXX)
  459. set(ANDROID_COMPILER_FLAGS_DEBUG)
  460. set(ANDROID_COMPILER_FLAGS_RELEASE)
  461. set(ANDROID_LINKER_FLAGS)
  462. set(ANDROID_LINKER_FLAGS_EXE)
  463.  
  464. set(ANDROID_HOST_PREBUILTS "${ANDROID_NDK}/prebuilt/${ANDROID_HOST_TAG}")
  465.  
  466. set(ANDROID_LLVM_TOOLCHAIN_PREFIX
  467. "${ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}/bin/")
  468. set(ANDROID_C_COMPILER
  469. "${ANDROID_LLVM_TOOLCHAIN_PREFIX}clang${ANDROID_TOOLCHAIN_SUFFIX}")
  470. set(ANDROID_CXX_COMPILER
  471. "${ANDROID_LLVM_TOOLCHAIN_PREFIX}clang++${ANDROID_TOOLCHAIN_SUFFIX}")
  472. set(ANDROID_ASM_COMPILER
  473. "${ANDROID_LLVM_TOOLCHAIN_PREFIX}clang${ANDROID_TOOLCHAIN_SUFFIX}")
  474.  
  475. list(APPEND ANDROID_COMPILER_FLAGS
  476. -target ${ANDROID_LLVM_TRIPLE}
  477. -gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT})
  478. set(ANDROID_AR "${ANDROID_TOOLCHAIN_PREFIX}ar${ANDROID_TOOLCHAIN_SUFFIX}")
  479. set(ANDROID_RANLIB
  480. "${ANDROID_TOOLCHAIN_PREFIX}ranlib${ANDROID_TOOLCHAIN_SUFFIX}")
  481.  
  482. if(NOT IS_DIRECTORY "${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}")
  483. message(FATAL_ERROR "Invalid Android platform: ${ANDROID_PLATFORM}.")
  484. elseif(NOT IS_DIRECTORY "${CMAKE_SYSROOT}")
  485. message(FATAL_ERROR "Invalid Android sysroot: ${CMAKE_SYSROOT}.")
  486. endif()
  487.  
  488. # Generic flags.
  489. list(APPEND ANDROID_COMPILER_FLAGS
  490. -g
  491. -DANDROID
  492. -ffunction-sections
  493. -funwind-tables
  494. -fstack-protector-strong
  495. -no-canonical-prefixes)
  496. list(APPEND ANDROID_LINKER_FLAGS
  497. -Wl,--build-id
  498. -Wl,--warn-shared-textrel
  499. -Wl,--fatal-warnings)
  500. list(APPEND ANDROID_LINKER_FLAGS_EXE
  501. -Wl,--gc-sections
  502. -Wl,-z,nocopyreloc)
  503.  
  504. # Debug and release flags.
  505. list(APPEND ANDROID_COMPILER_FLAGS_DEBUG -O0)
  506. if(ANDROID_ABI MATCHES "^armeabi" AND ANDROID_ARM_MODE STREQUAL thumb)
  507. list(APPEND ANDROID_COMPILER_FLAGS_RELEASE -Oz)
  508. else()
  509. list(APPEND ANDROID_COMPILER_FLAGS_RELEASE -O2)
  510. endif()
  511. list(APPEND ANDROID_COMPILER_FLAGS_RELEASE -DNDEBUG)
  512. if(ANDROID_TOOLCHAIN STREQUAL clang)
  513. list(APPEND ANDROID_COMPILER_FLAGS_DEBUG -fno-limit-debug-info)
  514. endif()
  515.  
  516. # Toolchain and ABI specific flags.
  517. if(ANDROID_ABI STREQUAL armeabi)
  518. list(APPEND ANDROID_COMPILER_FLAGS
  519. -march=armv5te
  520. -mtune=xscale
  521. -msoft-float)
  522. endif()
  523. if(ANDROID_ABI STREQUAL armeabi-v7a)
  524. list(APPEND ANDROID_COMPILER_FLAGS
  525. -march=armv7-a
  526. -mfloat-abi=softfp
  527. -mfpu=vfpv3-d16)
  528. list(APPEND ANDROID_LINKER_FLAGS
  529. -Wl,--fix-cortex-a8)
  530. endif()
  531. if(ANDROID_ABI STREQUAL x86 AND ANDROID_PLATFORM_LEVEL LESS 24)
  532. # http://b.android.com/222239
  533. # http://b.android.com/220159 (internal http://b/31809417)
  534. # x86 devices have stack alignment issues.
  535. list(APPEND ANDROID_COMPILER_FLAGS -mstackrealign)
  536. endif()
  537.  
  538. # STL specific flags.
  539. set(ANDROID_STL_PATH "${ANDROID_NDK}/sources/cxx-stl/llvm-libc++")
  540. if(ANDROID_STL STREQUAL system)
  541. set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
  542. "${ANDROID_NDK}/sources/cxx-stl/system/include")
  543. elseif(ANDROID_STL MATCHES "^c\\+\\+_")
  544. if(ANDROID_ABI MATCHES "^armeabi")
  545. list(APPEND ANDROID_LINKER_FLAGS -Wl,--exclude-libs,libunwind.a)
  546. endif()
  547.  
  548. list(APPEND ANDROID_COMPILER_FLAGS_CXX -std=c++11)
  549.  
  550. # Add the libc++ lib directory to the path so the linker scripts can pick up
  551. # the extra libraries.
  552. list(APPEND ANDROID_LINKER_FLAGS
  553. "-L${ANDROID_STL_PATH}/libs/${ANDROID_ABI}")
  554.  
  555. set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "${ANDROID_STL_PATH}/include")
  556.  
  557. if(ANDROID_PLATFORM_LEVEL LESS 21)
  558. set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
  559. "${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES}"
  560. "${ANDROID_NDK}/sources/android/support/include")
  561. endif()
  562.  
  563. set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
  564. "${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES}"
  565. "${ANDROID_STL_PATH}abi/include")
  566. endif()
  567.  
  568. set(ANDROID_CXX_STANDARD_LIBRARIES)
  569. foreach(library ${ANDROID_STL_STATIC_LIBRARIES})
  570. list(APPEND ANDROID_CXX_STANDARD_LIBRARIES
  571. "${ANDROID_STL_PATH}/libs/${ANDROID_ABI}/lib${library}.a")
  572. endforeach()
  573. foreach(library ${ANDROID_STL_SHARED_LIBRARIES})
  574. list(APPEND ANDROID_CXX_STANDARD_LIBRARIES
  575. "${ANDROID_STL_PATH}/libs/${ANDROID_ABI}/lib${library}.so")
  576. endforeach()
  577. foreach(library ${ANDROID_STL_LDLIBS})
  578. list(APPEND ANDROID_CXX_STANDARD_LIBRARIES "-l${library}")
  579. endforeach()
  580. set(CMAKE_C_STANDARD_LIBRARIES_INIT "-latomic -lm")
  581. set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}")
  582. if(ANDROID_CXX_STANDARD_LIBRARIES)
  583. string(REPLACE ";" "\" \"" ANDROID_CXX_STANDARD_LIBRARIES "\"${ANDROID_CXX_STANDARD_LIBRARIES}\"")
  584. set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_CXX_STANDARD_LIBRARIES_INIT} ${ANDROID_CXX_STANDARD_LIBRARIES}")
  585. endif()
  586.  
  587. # Configuration specific flags.
  588.  
  589. # x86 and x86_64 use large model pic, whereas everything else uses small model.
  590. # In the past we've always used -fPIE, but the LLVMgold plugin (for LTO)
  591. # complains if the models are mismatched.
  592. list(APPEND ANDROID_PIE_FLAGS -pie)
  593. if(ANDROID_ABI MATCHES "x86")
  594. list(APPEND ANDROID_PIE_FLAGS -fPIE)
  595. else()
  596. list(APPEND ANDROID_PIE_FLAGS -fpie)
  597. endif()
  598.  
  599. # PIE is supported on all currently supported Android releases, but it is not
  600. # supported with static executables, so we still provide ANDROID_PIE as an
  601. # escape hatch for those.
  602. if(ANDROID_PIE)
  603. set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
  604. list(APPEND ANDROID_LINKER_FLAGS_EXE ${ANDROID_PIE_FLAGS})
  605. endif()
  606.  
  607. if(ANDROID_CPP_FEATURES)
  608. separate_arguments(ANDROID_CPP_FEATURES)
  609. foreach(feature ${ANDROID_CPP_FEATURES})
  610. if(NOT ${feature} MATCHES "^(rtti|exceptions)$")
  611. message(FATAL_ERROR "Invalid Android C++ feature: ${feature}.")
  612. endif()
  613. list(APPEND ANDROID_COMPILER_FLAGS_CXX
  614. -f${feature})
  615. endforeach()
  616. string(REPLACE ";" " " ANDROID_CPP_FEATURES "${ANDROID_CPP_FEATURES}")
  617. endif()
  618. if(NOT ANDROID_ALLOW_UNDEFINED_SYMBOLS)
  619. list(APPEND ANDROID_LINKER_FLAGS
  620. -Wl,--no-undefined)
  621. endif()
  622. if(ANDROID_ABI MATCHES "armeabi")
  623. if(ANDROID_ARM_MODE STREQUAL thumb)
  624. list(APPEND ANDROID_COMPILER_FLAGS
  625. -mthumb)
  626. elseif(ANDROID_ARM_MODE STREQUAL arm)
  627. list(APPEND ANDROID_COMPILER_FLAGS
  628. -marm)
  629. else()
  630. message(FATAL_ERROR "Invalid Android ARM mode: ${ANDROID_ARM_MODE}.")
  631. endif()
  632. if(ANDROID_ABI STREQUAL armeabi-v7a AND ANDROID_ARM_NEON)
  633. list(APPEND ANDROID_COMPILER_FLAGS
  634. -mfpu=neon)
  635. endif()
  636. endif()
  637. if(ANDROID_DISABLE_NO_EXECUTE)
  638. list(APPEND ANDROID_COMPILER_FLAGS
  639. -Wa,--execstack)
  640. list(APPEND ANDROID_LINKER_FLAGS
  641. -Wl,-z,execstack)
  642. else()
  643. list(APPEND ANDROID_COMPILER_FLAGS
  644. -Wa,--noexecstack)
  645. list(APPEND ANDROID_LINKER_FLAGS
  646. -Wl,-z,noexecstack)
  647. endif()
  648. if(ANDROID_TOOLCHAIN STREQUAL clang)
  649. # CMake automatically forwards all compiler flags to the linker,
  650. # and clang doesn't like having -Wa flags being used for linking.
  651. # To prevent CMake from doing this would require meddling with
  652. # the CMAKE_<LANG>_COMPILE_OBJECT rules, which would get quite messy.
  653. list(APPEND ANDROID_LINKER_FLAGS
  654. -Qunused-arguments)
  655. endif()
  656. if(ANDROID_DISABLE_RELRO)
  657. list(APPEND ANDROID_LINKER_FLAGS
  658. -Wl,-z,norelro -Wl,-z,lazy)
  659. else()
  660. list(APPEND ANDROID_LINKER_FLAGS
  661. -Wl,-z,relro -Wl,-z,now)
  662. endif()
  663. if(ANDROID_DISABLE_FORMAT_STRING_CHECKS)
  664. list(APPEND ANDROID_COMPILER_FLAGS
  665. -Wno-error=format-security)
  666. else()
  667. list(APPEND ANDROID_COMPILER_FLAGS
  668. -Wformat -Werror=format-security)
  669. endif()
  670.  
  671. # Convert these lists into strings.
  672. string(REPLACE ";" " " ANDROID_COMPILER_FLAGS "${ANDROID_COMPILER_FLAGS}")
  673. string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_CXX "${ANDROID_COMPILER_FLAGS_CXX}")
  674. string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG}")
  675. string(REPLACE ";" " " ANDROID_COMPILER_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE}")
  676. string(REPLACE ";" " " ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}")
  677. string(REPLACE ";" " " ANDROID_LINKER_FLAGS_EXE "${ANDROID_LINKER_FLAGS_EXE}")
  678.  
  679. if(ANDROID_CCACHE)
  680. set(CMAKE_C_COMPILER_LAUNCHER "${ANDROID_CCACHE}")
  681. set(CMAKE_CXX_COMPILER_LAUNCHER "${ANDROID_CCACHE}")
  682. endif()
  683. set(CMAKE_C_COMPILER "${ANDROID_C_COMPILER}")
  684. set(CMAKE_CXX_COMPILER "${ANDROID_CXX_COMPILER}")
  685. set(CMAKE_AR "${ANDROID_AR}" CACHE FILEPATH "Archiver")
  686. set(CMAKE_RANLIB "${ANDROID_RANLIB}" CACHE FILEPATH "Ranlib")
  687. set(_CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_PREFIX}")
  688.  
  689. if(ANDROID_ABI STREQUAL "x86" OR ANDROID_ABI STREQUAL "x86_64")
  690. set(CMAKE_ASM_NASM_COMPILER
  691. "${ANDROID_HOST_PREBUILTS}/bin/yasm${ANDROID_TOOLCHAIN_SUFFIX}")
  692. set(CMAKE_ASM_NASM_COMPILER_ARG1 "-DELF")
  693. endif()
  694.  
  695. # Set or retrieve the cached flags.
  696. # This is necessary in case the user sets/changes flags in subsequent
  697. # configures. If we included the Android flags in here, they would get
  698. # overwritten.
  699. set(CMAKE_C_FLAGS ""
  700. CACHE STRING "Flags used by the compiler during all build types.")
  701. set(CMAKE_CXX_FLAGS ""
  702. CACHE STRING "Flags used by the compiler during all build types.")
  703. set(CMAKE_ASM_FLAGS ""
  704. CACHE STRING "Flags used by the compiler during all build types.")
  705. set(CMAKE_C_FLAGS_DEBUG ""
  706. CACHE STRING "Flags used by the compiler during debug builds.")
  707. set(CMAKE_CXX_FLAGS_DEBUG ""
  708. CACHE STRING "Flags used by the compiler during debug builds.")
  709. set(CMAKE_ASM_FLAGS_DEBUG ""
  710. CACHE STRING "Flags used by the compiler during debug builds.")
  711. set(CMAKE_C_FLAGS_RELEASE ""
  712. CACHE STRING "Flags used by the compiler during release builds.")
  713. set(CMAKE_CXX_FLAGS_RELEASE ""
  714. CACHE STRING "Flags used by the compiler during release builds.")
  715. set(CMAKE_ASM_FLAGS_RELEASE ""
  716. CACHE STRING "Flags used by the compiler during release builds.")
  717. set(CMAKE_MODULE_LINKER_FLAGS ""
  718. CACHE STRING "Flags used by the linker during the creation of modules.")
  719. set(CMAKE_SHARED_LINKER_FLAGS ""
  720. CACHE STRING "Flags used by the linker during the creation of dll's.")
  721. set(CMAKE_EXE_LINKER_FLAGS ""
  722. CACHE STRING "Flags used by the linker.")
  723.  
  724. set(CMAKE_C_FLAGS "${ANDROID_COMPILER_FLAGS} ${CMAKE_C_FLAGS}")
  725. set(CMAKE_CXX_FLAGS "${ANDROID_COMPILER_FLAGS} ${ANDROID_COMPILER_FLAGS_CXX} ${CMAKE_CXX_FLAGS}")
  726. set(CMAKE_ASM_FLAGS "${ANDROID_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS}")
  727. set(CMAKE_C_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}")
  728. set(CMAKE_CXX_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}")
  729. set(CMAKE_ASM_FLAGS_DEBUG "${ANDROID_COMPILER_FLAGS_DEBUG} ${CMAKE_ASM_FLAGS_DEBUG}")
  730. set(CMAKE_C_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}")
  731. set(CMAKE_CXX_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}")
  732. set(CMAKE_ASM_FLAGS_RELEASE "${ANDROID_COMPILER_FLAGS_RELEASE} ${CMAKE_ASM_FLAGS_RELEASE}")
  733. set(CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
  734. set(CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
  735. set(CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${ANDROID_LINKER_FLAGS_EXE} ${CMAKE_EXE_LINKER_FLAGS}")
  736.  
  737. # Compatibility for read-only variables.
  738. # Read-only variables for compatibility with the other toolchain file.
  739. # We'll keep these around for the existing projects that still use them.
  740. # TODO: All of the variables here have equivalents in our standard set of
  741. # configurable variables, so we can remove these once most of our users migrate
  742. # to those variables.
  743. set(ANDROID_NATIVE_API_LEVEL ${ANDROID_PLATFORM_LEVEL})
  744. if(ANDROID_ALLOW_UNDEFINED_SYMBOLS)
  745. set(ANDROID_SO_UNDEFINED TRUE)
  746. else()
  747. set(ANDROID_NO_UNDEFINED TRUE)
  748. endif()
  749. set(ANDROID_FUNCTION_LEVEL_LINKING TRUE)
  750. set(ANDROID_GOLD_LINKER TRUE)
  751. if(NOT ANDROID_DISABLE_NO_EXECUTE)
  752. set(ANDROID_NOEXECSTACK TRUE)
  753. endif()
  754. if(NOT ANDROID_DISABLE_RELRO)
  755. set(ANDROID_RELRO TRUE)
  756. endif()
  757. if(ANDROID_ARM_MODE STREQUAL arm)
  758. set(ANDROID_FORCE_ARM_BUILD TRUE)
  759. endif()
  760. if(ANDROID_CPP_FEATURES MATCHES "rtti"
  761. AND ANDROID_CPP_FEATURES MATCHES "exceptions")
  762. set(ANDROID_STL_FORCE_FEATURES TRUE)
  763. endif()
  764. if(ANDROID_CCACHE)
  765. set(NDK_CCACHE "${ANDROID_CCACHE}")
  766. endif()
  767. if(ANDROID_TOOLCHAIN STREQUAL clang)
  768. set(ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}-clang)
  769. else()
  770. set(ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}-4.9)
  771. endif()
  772. set(ANDROID_NDK_HOST_X64 TRUE)
  773. set(ANDROID_NDK_LAYOUT RELEASE)
  774. if(ANDROID_ABI STREQUAL armeabi-v7a)
  775. set(ARMEABI_V7A TRUE)
  776. if(ANDROID_ARM_NEON)
  777. set(NEON TRUE)
  778. endif()
  779. elseif(ANDROID_ABI STREQUAL arm64-v8a)
  780. set(ARM64_V8A TRUE)
  781. elseif(ANDROID_ABI STREQUAL x86)
  782. set(X86 TRUE)
  783. elseif(ANDROID_ABI STREQUAL x86_64)
  784. set(X86_64 TRUE)
  785. endif()
  786. set(ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_HOST_TAG})
  787. set(ANDROID_NDK_ABI_NAME ${ANDROID_ABI})
  788. set(ANDROID_NDK_RELEASE r${ANDROID_NDK_REVISION})
  789. set(ANDROID_ARCH_NAME ${ANDROID_SYSROOT_ABI})
  790. set(ANDROID_SYSROOT "${CMAKE_SYSROOT}")
  791. set(TOOL_OS_SUFFIX ${ANDROID_TOOLCHAIN_SUFFIX})
  792. if(ANDROID_TOOLCHAIN STREQUAL clang)
  793. set(ANDROID_COMPILER_IS_CLANG TRUE)
  794. endif()
  795.  
  796. # CMake 3.7+ compatibility.
  797. if (CMAKE_VERSION VERSION_GREATER 3.7.0)
  798. set(CMAKE_ANDROID_NDK ${ANDROID_NDK})
  799. set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
  800.  
  801. set(CMAKE_ANDROID_STL_TYPE ${ANDROID_STL})
  802.  
  803. if(ANDROID_ABI MATCHES "^armeabi(-v7a)?$")
  804. set(CMAKE_ANDROID_ARM_NEON ${ANDROID_ARM_NEON})
  805. set(CMAKE_ANDROID_ARM_MODE ${ANDROID_ARM_MODE})
  806. endif()
  807. endif()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement