Imported Upstream version 3.11.2
[platform/upstream/cmake.git] / Modules / FindJNI.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 #.rst:
5 # FindJNI
6 # -------
7 #
8 # Find JNI java libraries.
9 #
10 # This module finds if Java is installed and determines where the
11 # include files and libraries are.  It also determines what the name of
12 # the library is.  The caller may set variable JAVA_HOME to specify a
13 # Java installation prefix explicitly.
14 #
15 # This module sets the following result variables:
16 #
17 # ::
18 #
19 #   JNI_INCLUDE_DIRS      = the include dirs to use
20 #   JNI_LIBRARIES         = the libraries to use
21 #   JNI_FOUND             = TRUE if JNI headers and libraries were found.
22 #   JAVA_AWT_LIBRARY      = the path to the jawt library
23 #   JAVA_JVM_LIBRARY      = the path to the jvm library
24 #   JAVA_INCLUDE_PATH     = the include path to jni.h
25 #   JAVA_INCLUDE_PATH2    = the include path to jni_md.h
26 #   JAVA_AWT_INCLUDE_PATH = the include path to jawt.h
27
28 # Expand {libarch} occurrences to java_libarch subdirectory(-ies) and set ${_var}
29 macro(java_append_library_directories _var)
30     # Determine java arch-specific library subdir
31     # Mostly based on openjdk/jdk/make/common/shared/Platform.gmk as of openjdk
32     # 1.6.0_18 + icedtea patches. However, it would be much better to base the
33     # guess on the first part of the GNU config.guess platform triplet.
34     if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
35       if(CMAKE_LIBRARY_ARCHITECTURE STREQUAL "x86_64-linux-gnux32")
36         set(_java_libarch "x32" "amd64" "i386")
37       else()
38         set(_java_libarch "amd64" "i386")
39       endif()
40     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
41         set(_java_libarch "i386")
42     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha")
43         set(_java_libarch "alpha")
44     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
45         # Subdir is "arm" for both big-endian (arm) and little-endian (armel).
46         set(_java_libarch "arm" "aarch32")
47     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
48         # mips* machines are bi-endian mostly so processor does not tell
49         # endianness of the underlying system.
50         set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}"
51             "mips" "mipsel" "mipseb" "mipsr6" "mipsr6el"
52             "mips64" "mips64el" "mips64r6" "mips64r6el"
53             "mipsn32" "mipsn32el" "mipsn32r6" "mipsn32r6el")
54     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
55         set(_java_libarch "ppc64" "ppc64le")
56     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
57         set(_java_libarch "ppc64" "ppc")
58     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
59         set(_java_libarch "ppc" "ppc64")
60     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
61         # Both flavours can run on the same processor
62         set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9")
63     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)")
64         set(_java_libarch "parisc" "parisc64")
65     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390")
66         # s390 binaries can run on s390x machines
67         set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x")
68     elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh")
69         set(_java_libarch "sh")
70     else()
71         set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
72     endif()
73
74     # Append default list architectures if CMAKE_SYSTEM_PROCESSOR was empty or
75     # system is non-Linux (where the code above has not been well tested)
76     if(NOT _java_libarch OR NOT (CMAKE_SYSTEM_NAME MATCHES "Linux"))
77         list(APPEND _java_libarch "i386" "amd64" "ppc")
78     endif()
79
80     # Sometimes ${CMAKE_SYSTEM_PROCESSOR} is added to the list to prefer
81     # current value to a hardcoded list. Remove possible duplicates.
82     list(REMOVE_DUPLICATES _java_libarch)
83
84     foreach(_path ${ARGN})
85         if(_path MATCHES "{libarch}")
86             foreach(_libarch ${_java_libarch})
87                 string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
88                 if(EXISTS ${_newpath})
89                     list(APPEND ${_var} "${_newpath}")
90                 endif()
91             endforeach()
92         else()
93             if(EXISTS ${_path})
94                 list(APPEND ${_var} "${_path}")
95             endif()
96         endif()
97     endforeach()
98 endmacro()
99
100 include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
101
102 # Save CMAKE_FIND_FRAMEWORK
103 if(DEFINED CMAKE_FIND_FRAMEWORK)
104   set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
105 else()
106   unset(_JNI_CMAKE_FIND_FRAMEWORK)
107 endif()
108
109 if(_JAVA_HOME_EXPLICIT)
110   set(CMAKE_FIND_FRAMEWORK NEVER)
111 endif()
112
113 set(JAVA_AWT_LIBRARY_DIRECTORIES)
114 if(_JAVA_HOME)
115   JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
116     ${_JAVA_HOME}/jre/lib/{libarch}
117     ${_JAVA_HOME}/jre/lib
118     ${_JAVA_HOME}/lib/{libarch}
119     ${_JAVA_HOME}/lib
120     ${_JAVA_HOME}
121     )
122 endif()
123
124 if (WIN32)
125   set (_JNI_HINTS)
126   execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\JDK /f "." /k
127     RESULT_VARIABLE _JNI_RESULT
128     OUTPUT_VARIABLE _JNI_VERSIONS
129     ERROR_QUIET)
130   if (NOT  _JNI_RESULT)
131     string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\JDK\\\\[0-9.]+" _JNI_VERSIONS "${_JNI_VERSIONS}")
132     if (_JNI_VERSIONS)
133       # sort versions. Most recent first
134       ## handle version 9 apart from other versions to get correct ordering
135       set (_JNI_V9 ${_JNI_VERSIONS})
136       list (FILTER _JNI_VERSIONS EXCLUDE REGEX "JDK\\\\9")
137       list (SORT _JNI_VERSIONS)
138       list (REVERSE _JNI_VERSIONS)
139       list (FILTER _JNI_V9 INCLUDE REGEX "JDK\\\\9")
140       list (SORT _JNI_V9)
141       list (REVERSE _JNI_V9)
142       list (APPEND _JNI_VERSIONS ${_JNI_V9})
143       foreach (_JNI_HINT IN LISTS _JNI_VERSIONS)
144         list(APPEND _JNI_HINTS "[${_JNI_HINT};JavaHome]")
145       endforeach()
146     endif()
147   endif()
148
149   foreach (_JNI_HINT IN LISTS _JNI_HINTS)
150     list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${_JNI_HINT}/lib")
151   endforeach()
152
153   get_filename_component(java_install_version
154     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME)
155
156   list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES
157     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/lib"
158     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/lib"
159     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/lib"
160     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/lib"
161     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/lib"
162     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib"
163     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
164     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib"
165     )
166 endif()
167
168 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
169   /usr/lib/jvm/java/lib
170   /usr/lib/java/jre/lib/{libarch}
171   /usr/lib/jvm/jre/lib/{libarch}
172   /usr/local/lib/java/jre/lib/{libarch}
173   /usr/local/share/java/jre/lib/{libarch}
174   /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
175   /usr/lib/j2sdk1.5-sun/jre/lib/{libarch}
176   /opt/sun-jdk-1.5.0.04/jre/lib/{libarch}
177   /usr/lib/jvm/java-6-sun/jre/lib/{libarch}
178   /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
179   /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch}       # can this one be removed according to #8821 ? Alex
180   /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
181   /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch}        # fedora
182   # Debian specific paths for default JVM
183   /usr/lib/jvm/default-java/jre/lib/{libarch}
184   /usr/lib/jvm/default-java/jre/lib
185   /usr/lib/jvm/default-java/lib
186   # Arch Linux specific paths for default JVM
187   /usr/lib/jvm/default/jre/lib/{libarch}
188   /usr/lib/jvm/default/lib/{libarch}
189   # Ubuntu specific paths for default JVM
190   /usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
191   /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
192   /usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
193   # OpenBSD specific paths for default JVM
194   /usr/local/jdk-1.7.0/jre/lib/{libarch}
195   /usr/local/jre-1.7.0/lib/{libarch}
196   /usr/local/jdk-1.6.0/jre/lib/{libarch}
197   /usr/local/jre-1.6.0/lib/{libarch}
198   # SuSE specific paths for default JVM
199   /usr/lib64/jvm/java/jre/lib/{libarch}
200   /usr/lib64/jvm/jre/lib/{libarch}
201   )
202
203 set(JAVA_JVM_LIBRARY_DIRECTORIES)
204 foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
205   list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
206     "${dir}"
207     "${dir}/client"
208     "${dir}/server"
209     # IBM SDK, Java Technology Edition, specific paths
210     "${dir}/j9vm"
211     "${dir}/default"
212     )
213 endforeach()
214
215 set(JAVA_AWT_INCLUDE_DIRECTORIES)
216 if(_JAVA_HOME)
217   list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
218 endif()
219 if (WIN32)
220   foreach (_JNI_HINT IN LISTS _JNI_HINTS)
221     list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${_JNI_HINT}/include")
222   endforeach()
223   list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
224     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/include"
225     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/include"
226     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/include"
227     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/include"
228     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/include"
229     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
230     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
231     "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
232     )
233 endif()
234
235 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
236   /usr/lib/java/include
237   /usr/local/lib/java/include
238   /usr/lib/jvm/java/include
239   /usr/lib/jvm/java-6-sun/include
240   /usr/lib/jvm/java-1.5.0-sun/include
241   /usr/lib/jvm/java-6-sun-1.6.0.00/include       # can this one be removed according to #8821 ? Alex
242   /usr/lib/jvm/java-6-openjdk/include
243   /usr/lib/jvm/java-8-openjdk-{libarch}/include  # ubuntu 15.10
244   /usr/lib/jvm/java-7-openjdk-{libarch}/include  # ubuntu 15.10
245   /usr/lib/jvm/java-6-openjdk-{libarch}/include  # ubuntu 15.10
246   /usr/local/share/java/include
247   /usr/lib/j2sdk1.4-sun/include
248   /usr/lib/j2sdk1.5-sun/include
249   /opt/sun-jdk-1.5.0.04/include
250   # Debian specific path for default JVM
251   /usr/lib/jvm/default-java/include
252   # Arch specific path for default JVM
253   /usr/lib/jvm/default/include
254   # OpenBSD specific path for default JVM
255   /usr/local/jdk-1.7.0/include
256   /usr/local/jdk-1.6.0/include
257   # SuSE specific paths for default JVM
258   /usr/lib64/jvm/java/include
259   )
260
261 foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}")
262   get_filename_component(jpath "${JAVA_PROG}" PATH)
263   foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include)
264     if(EXISTS ${jpath}/${JAVA_INC_PATH})
265       list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}")
266     endif()
267   endforeach()
268   foreach(JAVA_LIB_PATH
269     ../lib ../jre/lib ../jre/lib/i386
270     ../java/lib ../java/jre/lib ../java/jre/lib/i386
271     ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
272     if(EXISTS ${jpath}/${JAVA_LIB_PATH})
273       list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}")
274     endif()
275   endforeach()
276 endforeach()
277
278 if(APPLE)
279   if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
280     set(_JNI_SEARCHES FRAMEWORK)
281   elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER")
282     set(_JNI_SEARCHES NORMAL)
283   elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST")
284     set(_JNI_SEARCHES NORMAL FRAMEWORK)
285   else()
286     set(_JNI_SEARCHES FRAMEWORK NORMAL)
287   endif()
288   set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
289   set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
290 else()
291   set(_JNI_SEARCHES NORMAL)
292 endif()
293
294 set(_JNI_NORMAL_JVM
295   NAMES jvm
296   PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
297   )
298
299 set(_JNI_NORMAL_JAWT
300   NAMES jawt
301   PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
302   )
303
304 foreach(search ${_JNI_SEARCHES})
305   find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
306   find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
307   if(JAVA_JVM_LIBRARY)
308     break()
309   endif()
310 endforeach()
311 unset(_JNI_SEARCHES)
312 unset(_JNI_FRAMEWORK_JVM)
313 unset(_JNI_FRAMEWORK_JAWT)
314 unset(_JNI_NORMAL_JVM)
315 unset(_JNI_NORMAL_JAWT)
316
317 # Find headers matching the library.
318 if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);")
319   set(CMAKE_FIND_FRAMEWORK ONLY)
320 else()
321   set(CMAKE_FIND_FRAMEWORK NEVER)
322 endif()
323
324 # add in the include path
325 find_path(JAVA_INCLUDE_PATH jni.h
326   ${JAVA_AWT_INCLUDE_DIRECTORIES}
327 )
328
329 find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
330   PATHS
331   ${JAVA_INCLUDE_PATH}
332   ${JAVA_INCLUDE_PATH}/darwin
333   ${JAVA_INCLUDE_PATH}/win32
334   ${JAVA_INCLUDE_PATH}/linux
335   ${JAVA_INCLUDE_PATH}/freebsd
336   ${JAVA_INCLUDE_PATH}/openbsd
337   ${JAVA_INCLUDE_PATH}/solaris
338   ${JAVA_INCLUDE_PATH}/hp-ux
339   ${JAVA_INCLUDE_PATH}/alpha
340   ${JAVA_INCLUDE_PATH}/aix
341 )
342
343 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
344   ${JAVA_INCLUDE_PATH}
345 )
346
347 # Restore CMAKE_FIND_FRAMEWORK
348 if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK)
349   set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK})
350   unset(_JNI_CMAKE_FIND_FRAMEWORK)
351 else()
352   unset(CMAKE_FIND_FRAMEWORK)
353 endif()
354
355 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
356 FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI  DEFAULT_MSG  JAVA_AWT_LIBRARY
357                                                     JAVA_JVM_LIBRARY
358                                                     JAVA_INCLUDE_PATH
359                                                     JAVA_INCLUDE_PATH2
360                                                     JAVA_AWT_INCLUDE_PATH)
361
362 mark_as_advanced(
363   JAVA_AWT_LIBRARY
364   JAVA_JVM_LIBRARY
365   JAVA_AWT_INCLUDE_PATH
366   JAVA_INCLUDE_PATH
367   JAVA_INCLUDE_PATH2
368 )
369
370 set(JNI_LIBRARIES
371   ${JAVA_AWT_LIBRARY}
372   ${JAVA_JVM_LIBRARY}
373 )
374
375 set(JNI_INCLUDE_DIRS
376   ${JAVA_INCLUDE_PATH}
377   ${JAVA_INCLUDE_PATH2}
378   ${JAVA_AWT_INCLUDE_PATH}
379 )