From f40c8db28b382c21efa97bd892f778a1e51fedf7 Mon Sep 17 00:00:00 2001 From: Andreas Muttscheller Date: Sun, 21 May 2017 17:45:41 +0200 Subject: [PATCH] HADOOP-9320 Fix Hadoop native build failure on ARM hard-float --- .../hadoop-common/HadoopCommon.cmake | 29 --------------- .../hadoop-common/HadoopJNI.cmake | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/hadoop-common-project/hadoop-common/HadoopCommon.cmake b/hadoop-common-project/hadoop-common/HadoopCommon.cmake index c46d9e5343646..a36d68733e133 100644 --- a/hadoop-common-project/hadoop-common/HadoopCommon.cmake +++ b/hadoop-common-project/hadoop-common/HadoopCommon.cmake @@ -153,35 +153,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") endif() endif() - # Determine float ABI of JVM on ARM. - if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") - find_program(READELF readelf) - if(READELF MATCHES "NOTFOUND") - message(WARNING "readelf not found; JVM float ABI detection disabled") - else(READELF MATCHES "NOTFOUND") - execute_process( - COMMAND ${READELF} -A ${JAVA_JVM_LIBRARY} - OUTPUT_VARIABLE JVM_ELF_ARCH - ERROR_QUIET) - if(NOT JVM_ELF_ARCH MATCHES "Tag_ABI_VFP_args: VFP registers") - # Test compilation with -mfloat-abi=softfp using an arbitrary libc function - # (typically fails with "fatal error: bits/predefs.h: No such file or directory" - # if soft-float dev libraries are not installed) - message("Soft-float JVM detected") - include(CMakePushCheckState) - cmake_push_check_state() - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mfloat-abi=softfp") - include(CheckSymbolExists) - check_symbol_exists(exit stdlib.h SOFTFP_AVAILABLE) - if(NOT SOFTFP_AVAILABLE) - message(FATAL_ERROR "Soft-float dev libraries required (e.g. 'apt-get install libc6-dev-armel' on Debian/Ubuntu)") - endif() - cmake_pop_check_state() - hadoop_add_compiler_flags("-mfloat-abi=softfp") - endif() - endif() - endif() - # # Solaris-specific configuration. # diff --git a/hadoop-common-project/hadoop-common/HadoopJNI.cmake b/hadoop-common-project/hadoop-common/HadoopJNI.cmake index 78d7ffda6fb6f..516b706b27410 100644 --- a/hadoop-common-project/hadoop-common/HadoopJNI.cmake +++ b/hadoop-common-project/hadoop-common/HadoopJNI.cmake @@ -95,3 +95,38 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") else() find_package(JNI REQUIRED) endif() + +# Determine float ABI of JVM on ARM Linux +if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_program(READELF readelf) + if (READELF MATCHES "NOTFOUND") + message(WARNING "readelf not found; JVM float ABI detection disabled") + else (READELF MATCHES "NOTFOUND") + message(STATUS "Checking float ABI of ${JAVA_JVM_LIBRARY}") + execute_process( + COMMAND ${READELF} -A ${JAVA_JVM_LIBRARY} + OUTPUT_VARIABLE JVM_ELF_ARCH + ERROR_QUIET) + if (JVM_ELF_ARCH MATCHES "Tag_ABI_VFP_args: VFP registers") + message(STATUS "Hard-float JVM detected") + else () + message(STATUS "Soft-float JVM detected") + + # Test compilation with -mfloat-abi=softfp using an arbitrary libc function + # (typically fails with "fatal error: bits/predefs.h: No such file or directory" + # if soft-float dev libraries are not installed) + include(CMakePushCheckState) + cmake_push_check_state() + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mfloat-abi=softfp") + include(CheckSymbolExists) + check_symbol_exists(exit stdlib.h SOFTFP_AVAILABLE) + if (NOT SOFTFP_AVAILABLE) + message(FATAL_ERROR "Soft-float dev libraries required (e.g. 'apt-get install libc6-dev-armel' on Debian/Ubuntu)") + endif (NOT SOFTFP_AVAILABLE) + cmake_pop_check_state() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp") + endif () + endif (READELF MATCHES "NOTFOUND") +endif (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") +