e31c19e106062750e4151c1d2b79e7eec9887bb6
[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 get_filename_component(java_install_version
124   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME)
125
126 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES
127   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib"
128   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
129   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib"
130   )
131 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
132   /usr/lib/jvm/java/lib
133   /usr/lib/java/jre/lib/{libarch}
134   /usr/lib/jvm/jre/lib/{libarch}
135   /usr/local/lib/java/jre/lib/{libarch}
136   /usr/local/share/java/jre/lib/{libarch}
137   /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
138   /usr/lib/j2sdk1.5-sun/jre/lib/{libarch}
139   /opt/sun-jdk-1.5.0.04/jre/lib/{libarch}
140   /usr/lib/jvm/java-6-sun/jre/lib/{libarch}
141   /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
142   /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch}       # can this one be removed according to #8821 ? Alex
143   /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
144   /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch}        # fedora
145   # Debian specific paths for default JVM
146   /usr/lib/jvm/default-java/jre/lib/{libarch}
147   /usr/lib/jvm/default-java/jre/lib
148   /usr/lib/jvm/default-java/lib
149   # Arch Linux specific paths for default JVM
150   /usr/lib/jvm/default/jre/lib/{libarch}
151   /usr/lib/jvm/default/lib/{libarch}
152   # Ubuntu specific paths for default JVM
153   /usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
154   /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
155   /usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch}     # Ubuntu 15.10
156   # OpenBSD specific paths for default JVM
157   /usr/local/jdk-1.7.0/jre/lib/{libarch}
158   /usr/local/jre-1.7.0/lib/{libarch}
159   /usr/local/jdk-1.6.0/jre/lib/{libarch}
160   /usr/local/jre-1.6.0/lib/{libarch}
161   # SuSE specific paths for default JVM
162   /usr/lib64/jvm/java/jre/lib/{libarch}
163   /usr/lib64/jvm/jre/lib/{libarch}
164   )
165
166 set(JAVA_JVM_LIBRARY_DIRECTORIES)
167 foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
168   list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
169     "${dir}"
170     "${dir}/client"
171     "${dir}/server"
172     # IBM SDK, Java Technology Edition, specific paths
173     "${dir}/j9vm"
174     "${dir}/default"
175     )
176 endforeach()
177
178 set(JAVA_AWT_INCLUDE_DIRECTORIES)
179 if(_JAVA_HOME)
180   list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
181 endif()
182 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
183   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
184   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
185   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
186 )
187
188 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
189   /usr/lib/java/include
190   /usr/local/lib/java/include
191   /usr/lib/jvm/java/include
192   /usr/lib/jvm/java-6-sun/include
193   /usr/lib/jvm/java-1.5.0-sun/include
194   /usr/lib/jvm/java-6-sun-1.6.0.00/include       # can this one be removed according to #8821 ? Alex
195   /usr/lib/jvm/java-6-openjdk/include
196   /usr/lib/jvm/java-8-openjdk-{libarch}/include  # ubuntu 15.10
197   /usr/lib/jvm/java-7-openjdk-{libarch}/include  # ubuntu 15.10
198   /usr/lib/jvm/java-6-openjdk-{libarch}/include  # ubuntu 15.10
199   /usr/local/share/java/include
200   /usr/lib/j2sdk1.4-sun/include
201   /usr/lib/j2sdk1.5-sun/include
202   /opt/sun-jdk-1.5.0.04/include
203   # Debian specific path for default JVM
204   /usr/lib/jvm/default-java/include
205   # Arch specific path for default JVM
206   /usr/lib/jvm/default/include
207   # OpenBSD specific path for default JVM
208   /usr/local/jdk-1.7.0/include
209   /usr/local/jdk-1.6.0/include
210   # SuSE specific paths for default JVM
211   /usr/lib64/jvm/java/include
212   )
213
214 foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}")
215   get_filename_component(jpath "${JAVA_PROG}" PATH)
216   foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include)
217     if(EXISTS ${jpath}/${JAVA_INC_PATH})
218       list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}")
219     endif()
220   endforeach()
221   foreach(JAVA_LIB_PATH
222     ../lib ../jre/lib ../jre/lib/i386
223     ../java/lib ../java/jre/lib ../java/jre/lib/i386
224     ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
225     if(EXISTS ${jpath}/${JAVA_LIB_PATH})
226       list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}")
227     endif()
228   endforeach()
229 endforeach()
230
231 if(APPLE)
232   if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
233     set(_JNI_SEARCHES FRAMEWORK)
234   elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER")
235     set(_JNI_SEARCHES NORMAL)
236   elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST")
237     set(_JNI_SEARCHES NORMAL FRAMEWORK)
238   else()
239     set(_JNI_SEARCHES FRAMEWORK NORMAL)
240   endif()
241   set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
242   set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
243 else()
244   set(_JNI_SEARCHES NORMAL)
245 endif()
246
247 set(_JNI_NORMAL_JVM
248   NAMES jvm
249   PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
250   )
251
252 set(_JNI_NORMAL_JAWT
253   NAMES jawt
254   PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
255   )
256
257 foreach(search ${_JNI_SEARCHES})
258   find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
259   find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
260   if(JAVA_JVM_LIBRARY)
261     break()
262   endif()
263 endforeach()
264 unset(_JNI_SEARCHES)
265 unset(_JNI_FRAMEWORK_JVM)
266 unset(_JNI_FRAMEWORK_JAWT)
267 unset(_JNI_NORMAL_JVM)
268 unset(_JNI_NORMAL_JAWT)
269
270 # Find headers matching the library.
271 if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);")
272   set(CMAKE_FIND_FRAMEWORK ONLY)
273 else()
274   set(CMAKE_FIND_FRAMEWORK NEVER)
275 endif()
276
277 # add in the include path
278 find_path(JAVA_INCLUDE_PATH jni.h
279   ${JAVA_AWT_INCLUDE_DIRECTORIES}
280 )
281
282 find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
283   PATHS
284   ${JAVA_INCLUDE_PATH}
285   ${JAVA_INCLUDE_PATH}/darwin
286   ${JAVA_INCLUDE_PATH}/win32
287   ${JAVA_INCLUDE_PATH}/linux
288   ${JAVA_INCLUDE_PATH}/freebsd
289   ${JAVA_INCLUDE_PATH}/openbsd
290   ${JAVA_INCLUDE_PATH}/solaris
291   ${JAVA_INCLUDE_PATH}/hp-ux
292   ${JAVA_INCLUDE_PATH}/alpha
293   ${JAVA_INCLUDE_PATH}/aix
294 )
295
296 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
297   ${JAVA_INCLUDE_PATH}
298 )
299
300 # Restore CMAKE_FIND_FRAMEWORK
301 if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK)
302   set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK})
303   unset(_JNI_CMAKE_FIND_FRAMEWORK)
304 else()
305   unset(CMAKE_FIND_FRAMEWORK)
306 endif()
307
308 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
309 FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI  DEFAULT_MSG  JAVA_AWT_LIBRARY
310                                                     JAVA_JVM_LIBRARY
311                                                     JAVA_INCLUDE_PATH
312                                                     JAVA_INCLUDE_PATH2
313                                                     JAVA_AWT_INCLUDE_PATH)
314
315 mark_as_advanced(
316   JAVA_AWT_LIBRARY
317   JAVA_JVM_LIBRARY
318   JAVA_AWT_INCLUDE_PATH
319   JAVA_INCLUDE_PATH
320   JAVA_INCLUDE_PATH2
321 )
322
323 set(JNI_LIBRARIES
324   ${JAVA_AWT_LIBRARY}
325   ${JAVA_JVM_LIBRARY}
326 )
327
328 set(JNI_INCLUDE_DIRS
329   ${JAVA_INCLUDE_PATH}
330   ${JAVA_INCLUDE_PATH2}
331   ${JAVA_AWT_INCLUDE_PATH}
332 )
333