JNIFlags.cmake 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #
  2. # Licensed to the Apache Software Foundation (ASF) under one
  3. # or more contributor license agreements. See the NOTICE file
  4. # distributed with this work for additional information
  5. # regarding copyright ownership. The ASF licenses this file
  6. # to you under the Apache License, Version 2.0 (the
  7. # "License"); you may not use this file except in compliance
  8. # with the License. You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS,
  14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. # See the License for the specific language governing permissions and
  16. # limitations under the License.
  17. #
  18. cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
  19. # If JVM_ARCH_DATA_MODEL is 32, compile all binaries as 32-bit.
  20. # This variable is set by maven.
  21. if (JVM_ARCH_DATA_MODEL EQUAL 32)
  22. # Force 32-bit code generation on amd64/x86_64, ppc64, sparc64
  23. if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_SYSTEM_PROCESSOR MATCHES ".*64")
  24. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
  25. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  26. set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -m32")
  27. endif ()
  28. if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64")
  29. # Set CMAKE_SYSTEM_PROCESSOR to ensure that find_package(JNI) will use
  30. # the 32-bit version of libjvm.so.
  31. set(CMAKE_SYSTEM_PROCESSOR "i686")
  32. endif ()
  33. endif (JVM_ARCH_DATA_MODEL EQUAL 32)
  34. # Determine float ABI of JVM on ARM Linux
  35. if (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
  36. find_program(READELF readelf)
  37. if (READELF MATCHES "NOTFOUND")
  38. message(WARNING "readelf not found; JVM float ABI detection disabled")
  39. else (READELF MATCHES "NOTFOUND")
  40. execute_process(
  41. COMMAND ${READELF} -A ${JAVA_JVM_LIBRARY}
  42. OUTPUT_VARIABLE JVM_ELF_ARCH
  43. ERROR_QUIET)
  44. if (NOT JVM_ELF_ARCH MATCHES "Tag_ABI_VFP_args: VFP registers")
  45. message("Soft-float JVM detected")
  46. # Test compilation with -mfloat-abi=softfp using an arbitrary libc function
  47. # (typically fails with "fatal error: bits/predefs.h: No such file or directory"
  48. # if soft-float dev libraries are not installed)
  49. include(CMakePushCheckState)
  50. cmake_push_check_state()
  51. set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mfloat-abi=softfp")
  52. include(CheckSymbolExists)
  53. check_symbol_exists(exit stdlib.h SOFTFP_AVAILABLE)
  54. if (NOT SOFTFP_AVAILABLE)
  55. message(FATAL_ERROR "Soft-float dev libraries required (e.g. 'apt-get install libc6-dev-armel' on Debian/Ubuntu)")
  56. endif (NOT SOFTFP_AVAILABLE)
  57. cmake_pop_check_state()
  58. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp")
  59. endif ()
  60. endif (READELF MATCHES "NOTFOUND")
  61. endif (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
  62. IF("${CMAKE_SYSTEM}" MATCHES "Linux")
  63. #
  64. # Locate JNI_INCLUDE_DIRS and JNI_LIBRARIES.
  65. # Since we were invoked from Maven, we know that the JAVA_HOME environment
  66. # variable is valid. So we ignore system paths here and just use JAVA_HOME.
  67. #
  68. FILE(TO_CMAKE_PATH "$ENV{JAVA_HOME}" _JAVA_HOME)
  69. IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
  70. SET(_java_libarch "i386")
  71. ELSEIF (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64")
  72. SET(_java_libarch "amd64")
  73. ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
  74. SET(_java_libarch "arm")
  75. ELSE()
  76. SET(_java_libarch ${CMAKE_SYSTEM_PROCESSOR})
  77. ENDIF()
  78. SET(_JDK_DIRS "${_JAVA_HOME}/jre/lib/${_java_libarch}/*"
  79. "${_JAVA_HOME}/jre/lib/${_java_libarch}"
  80. "${_JAVA_HOME}/jre/lib/*"
  81. "${_JAVA_HOME}/jre/lib"
  82. "${_JAVA_HOME}/lib/*"
  83. "${_JAVA_HOME}/lib"
  84. "${_JAVA_HOME}/include/*"
  85. "${_JAVA_HOME}/include"
  86. "${_JAVA_HOME}"
  87. )
  88. FIND_PATH(JAVA_INCLUDE_PATH
  89. NAMES jni.h
  90. PATHS ${_JDK_DIRS}
  91. NO_DEFAULT_PATH)
  92. #In IBM java, it's jniport.h instead of jni_md.h
  93. FIND_PATH(JAVA_INCLUDE_PATH2
  94. NAMES jni_md.h jniport.h
  95. PATHS ${_JDK_DIRS}
  96. NO_DEFAULT_PATH)
  97. SET(JNI_INCLUDE_DIRS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
  98. FIND_LIBRARY(JAVA_JVM_LIBRARY
  99. NAMES jvm JavaVM
  100. PATHS ${_JDK_DIRS}
  101. NO_DEFAULT_PATH)
  102. SET(JNI_LIBRARIES ${JAVA_JVM_LIBRARY})
  103. MESSAGE("JAVA_HOME=${JAVA_HOME}, JAVA_JVM_LIBRARY=${JAVA_JVM_LIBRARY}")
  104. MESSAGE("JAVA_INCLUDE_PATH=${JAVA_INCLUDE_PATH}, JAVA_INCLUDE_PATH2=${JAVA_INCLUDE_PATH2}")
  105. IF(JAVA_JVM_LIBRARY AND JAVA_INCLUDE_PATH AND JAVA_INCLUDE_PATH2)
  106. MESSAGE("Located all JNI components successfully.")
  107. ELSE()
  108. MESSAGE(FATAL_ERROR "Failed to find a viable JVM installation under JAVA_HOME.")
  109. ENDIF()
  110. ELSE()
  111. find_package(JNI REQUIRED)
  112. ENDIF()