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