Skip to content

Commit faa6684

Browse files
committed
Merge pull request opencv#5098 from powderluv:master
2 parents a78da45 + 7bb3fef commit faa6684

File tree

1 file changed

+35
-11
lines changed

1 file changed

+35
-11
lines changed

platforms/android/android.toolchain.cmake

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
# "armeabi" - ARMv5TE based CPU with software floating point operations
6666
# "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions
6767
# this ABI target is used by default
68+
# "armeabi-v7a-hard with NEON" - ARMv7 based devices with hardware FPU instructions and hardfp
6869
# "armeabi-v7a with NEON" - same as armeabi-v7a, but
6970
# sets NEON as floating-point unit
7071
# "armeabi-v7a with VFPV3" - same as armeabi-v7a, but
@@ -178,7 +179,7 @@
178179
# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
179180
# variables to make necessary Android-specific configuration changes.
180181
#
181-
# Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
182+
# Also ARMEABI or ARMEABI_V7A or ARMEABI_V7A_HARD or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
182183
# will be set true, mutually exclusive. NEON option will be set true
183184
# if VFP is set to NEON.
184185
#
@@ -231,7 +232,7 @@ if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
231232
endif()
232233

233234
# known ABIs
234-
set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
235+
set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a-hard with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
235236
set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" )
236237
set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
237238
set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" )
@@ -711,6 +712,14 @@ elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
711712
set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
712713
set( VFPV3 true )
713714
set( NEON true )
715+
elseif( ANDROID_ABI STREQUAL "armeabi-v7a-hard with NEON" )
716+
set( ARMEABI_V7A_HARD true )
717+
set( ANDROID_NDK_ABI_NAME "armeabi-v7a-hard" )
718+
set( ANDROID_ARCH_NAME "arm" )
719+
set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
720+
set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
721+
set( VFPV3 true )
722+
set( NEON true )
714723
else()
715724
message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." )
716725
endif()
@@ -904,17 +913,17 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
904913
# old location ( pre r8c )
905914
set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" )
906915
endif()
907-
if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
916+
if( (ARMEABI_V7A OR ARMEABI_V7A_HARD) AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
908917
list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" )
909918
elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" )
910919
list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" )
911920
else()
912921
list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" )
913922
endif()
914923
# always search static GNU STL to get the location of libsupc++.a
915-
if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
924+
if( (ARMEABI_V7A OR ARMEABI_V7A_HARD) AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
916925
set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" )
917-
elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
926+
elseif( (ARMEABI_V7A OR ARMEABI_V7A_HARD) AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
918927
set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" )
919928
elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" )
920929
set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" )
@@ -935,7 +944,7 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
935944
" )
936945
endif()
937946
if( ANDROID_STL STREQUAL "gnustl_shared" )
938-
if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
947+
if( (ARMEABI_V7A OR ARMEABI_V7A_HARD) AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
939948
set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
940949
elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
941950
set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
@@ -1198,7 +1207,7 @@ if (ARM64_V8A )
11981207
if( NOT ANDROID_COMPILER_IS_CLANG )
11991208
set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
12001209
endif()
1201-
elseif( ARMEABI OR ARMEABI_V7A)
1210+
elseif( ARMEABI OR ARMEABI_V7A OR ARMEABI_V7A_HARD)
12021211
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
12031212
if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
12041213
set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
@@ -1245,7 +1254,16 @@ if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
12451254
endif()
12461255

12471256
# ABI-specific flags
1248-
if( ARMEABI_V7A )
1257+
if( ARMEABI_V7A_HARD )
1258+
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=hard -mhard-float -D_NDK_MATH_NO_SOFTFP=1" )
1259+
if( NEON )
1260+
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
1261+
elseif( VFPV3 )
1262+
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" )
1263+
else()
1264+
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
1265+
endif()
1266+
elseif( ARMEABI_V7A )
12491267
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" )
12501268
if( NEON )
12511269
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
@@ -1254,6 +1272,7 @@ if( ARMEABI_V7A )
12541272
else()
12551273
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
12561274
endif()
1275+
12571276
elseif( ARMEABI_V6 )
12581277
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2
12591278
elseif( ARMEABI )
@@ -1330,6 +1349,10 @@ if( ARMEABI_V7A )
13301349
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" )
13311350
endif()
13321351

1352+
if( ARMEABI_V7A_HARD )
1353+
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-warn-mismatch -lm_hard" )
1354+
endif()
1355+
13331356
if( ANDROID_NO_UNDEFINED )
13341357
if( MIPS )
13351358
# there is some sysroot-related problem in mips linker...
@@ -1351,7 +1374,7 @@ if( ANDROID_FUNCTION_LEVEL_LINKING )
13511374
endif()
13521375

13531376
if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
1354-
if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) )
1377+
if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR ARMEABI_V7A_HARD OR X86) )
13551378
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
13561379
elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b
13571380
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" )
@@ -1626,7 +1649,7 @@ endif()
16261649

16271650

16281651
# Variables controlling behavior or set by cmake toolchain:
1629-
# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
1652+
# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a-hard with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
16301653
# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version)
16311654
# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none
16321655
# ANDROID_FORBID_SYGWIN : ON/OFF
@@ -1653,6 +1676,7 @@ endif()
16531676
# ARMEABI : TRUE for arm v6 and older devices
16541677
# ARMEABI_V6 : TRUE for arm v6
16551678
# ARMEABI_V7A : TRUE for arm v7a
1679+
# ARMEABI_V7A_HARD : TRUE for arm v7a with hardfp
16561680
# ARM64_V8A : TRUE for arm64-v8a
16571681
# NEON : TRUE if NEON unit is enabled
16581682
# VFPV3 : TRUE if VFP version 3 is enabled
@@ -1663,7 +1687,7 @@ endif()
16631687
# BUILD_WITH_ANDROID_NDK : TRUE if NDK is used
16641688
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
16651689
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
1666-
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
1690+
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "armeabi-v7a-hard", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
16671691
# ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK
16681692
# ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor)
16691693
# ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI

0 commit comments

Comments
 (0)