Browse Source

Merge topic 'android-no-libstdc++'

843d55de29 Android: Suppress implicit -lstdc++ linker flag

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1919
Brad King 7 years ago
parent
commit
8496d11ef8

+ 7 - 0
Modules/Platform/Android-Clang-CXX.cmake

@@ -1,2 +1,9 @@
 include(Platform/Android-Clang)
 __android_compiler_clang(CXX)
+if(_ANDROID_STL_NOSTDLIBXX)
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6)
+    string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " -nostdlib++")
+  else()
+    string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " -nodefaultlibs -lgcc -lc -lm -ldl")
+  endif()
+endif()

+ 3 - 0
Modules/Platform/Android-GNU-CXX.cmake

@@ -1,2 +1,5 @@
 include(Platform/Android-GNU)
 __android_compiler_gnu(CXX)
+if(_ANDROID_STL_NOSTDLIBXX)
+  string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " -nodefaultlibs -lgcc -lc -lm -ldl")
+endif()

+ 1 - 0
Modules/Platform/Android/ndk-stl-c++.cmake

@@ -1,6 +1,7 @@
 # <ndk>/sources/cxx-stl/llvm-libc++/Android.mk
 set(_ANDROID_STL_RTTI 1)
 set(_ANDROID_STL_EXCEPTIONS 1)
+set(_ANDROID_STL_NOSTDLIBXX 1)
 macro(__android_stl_cxx lang filename)
   # Add the include directory.
   if(EXISTS "${CMAKE_ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef")

+ 1 - 0
Modules/Platform/Android/ndk-stl-gabi++.cmake

@@ -1,6 +1,7 @@
 # <ndk>/sources/cxx-stl/gabi++/Android.mk
 set(_ANDROID_STL_RTTI 1)
 set(_ANDROID_STL_EXCEPTIONS 1)
+set(_ANDROID_STL_NOSTDLIBXX 1)
 macro(__android_stl_gabixx lang filename)
   __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/gabi++/include" 1)
   __android_stl_lib(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${CMAKE_ANDROID_ARCH_ABI}/${filename}" 1)

+ 1 - 0
Modules/Platform/Android/ndk-stl-gnustl.cmake

@@ -1,6 +1,7 @@
 # <ndk>/sources/cxx-stl/gnu-libstdc++/Android.mk
 set(_ANDROID_STL_RTTI 1)
 set(_ANDROID_STL_EXCEPTIONS 1)
+set(_ANDROID_STL_NOSTDLIBXX 1)
 macro(__android_stl_gnustl lang filename)
   __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${CMAKE_${lang}_ANDROID_TOOLCHAIN_VERSION}/include" 1)
   __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${CMAKE_${lang}_ANDROID_TOOLCHAIN_VERSION}/libs/${CMAKE_ANDROID_ARCH_ABI}/include" 1)

+ 1 - 0
Modules/Platform/Android/ndk-stl-none.cmake

@@ -1,2 +1,3 @@
+set(_ANDROID_STL_NOSTDLIBXX 1)
 macro(__android_stl lang)
 endmacro()

+ 1 - 0
Modules/Platform/Android/ndk-stl-stlport.cmake

@@ -1,6 +1,7 @@
 # <ndk>/sources/cxx-stl/stlport/Android.mk
 set(_ANDROID_STL_RTTI 1)
 set(_ANDROID_STL_EXCEPTIONS 1)
+set(_ANDROID_STL_NOSTDLIBXX 0)
 macro(__android_stl_stlport lang filename)
   __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/stlport/stlport" 1)
   __android_stl_lib(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/stlport/libs/${CMAKE_ANDROID_ARCH_ABI}/${filename}" 1)

+ 1 - 0
Modules/Platform/Android/ndk-stl-system.cmake

@@ -1,6 +1,7 @@
 # <ndk>/android-ndk-r11c/sources/cxx-stl/system/Android.mk
 set(_ANDROID_STL_RTTI 0)
 set(_ANDROID_STL_EXCEPTIONS 0)
+set(_ANDROID_STL_NOSTDLIBXX 0)
 macro(__android_stl lang)
   __android_stl_inc(${lang} "${CMAKE_ANDROID_NDK}/sources/cxx-stl/system/include" 1)
 endmacro()

+ 4 - 0
Tests/RunCMake/Android/android_lib.cxx

@@ -0,0 +1,4 @@
+int android_lib()
+{
+  return 0;
+}

+ 8 - 0
Tests/RunCMake/Android/check_binary.cmake

@@ -0,0 +1,8 @@
+if(NOT EXISTS "${file}")
+  message(FATAL_ERROR "Missing file:\n  ${file}")
+endif()
+execute_process(COMMAND "${objdump}" -p ${file} OUTPUT_VARIABLE out)
+if(out MATCHES "NEEDED[^\n]*stdc\\+\\+")
+  string(REPLACE "\n" "\n  " out "  ${out}")
+  message(FATAL_ERROR "File:\n  ${file}\ndepends on libstdc++:\n${out}")
+endif()

+ 17 - 0
Tests/RunCMake/Android/common.cmake

@@ -92,6 +92,23 @@ if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a")
 endif()
 add_executable(android_c android.c)
 add_executable(android_cxx android.cxx)
+add_library(android_cxx_lib SHARED android_lib.cxx)
+
+set(objdump "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}objdump")
+if(NOT EXISTS "${objdump}")
+  message(FATAL_ERROR "Expected tool missing:\n  ${objdump}")
+endif()
+
+if(NOT CMAKE_ANDROID_STL_TYPE MATCHES "^(system|stlport_static|stlport_shared)$")
+  foreach(tgt android_cxx android_cxx_lib)
+    add_custom_command(TARGET ${tgt} POST_BUILD
+      COMMAND ${CMAKE_COMMAND}
+        -Dobjdump=${objdump}
+        -Dfile=$<TARGET_FILE:${tgt}>
+        -P ${CMAKE_CURRENT_SOURCE_DIR}/check_binary.cmake
+      )
+  endforeach()
+endif()
 
 # Test that an explicit /usr/include is ignored in favor of
 # appearing as a standard include directory at the end.