1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
8 # Find JNI java libraries.
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.
15 # This module sets the following result variables:
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
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")
38 set(_java_libarch "amd64" "i386")
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")
71 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
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")
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)
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}")
94 list(APPEND ${_var} "${_path}")
100 include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
102 # Save CMAKE_FIND_FRAMEWORK
103 if(DEFINED CMAKE_FIND_FRAMEWORK)
104 set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
106 unset(_JNI_CMAKE_FIND_FRAMEWORK)
109 if(_JAVA_HOME_EXPLICIT)
110 set(CMAKE_FIND_FRAMEWORK NEVER)
113 set(JAVA_AWT_LIBRARY_DIRECTORIES)
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}
123 get_filename_component(java_install_version
124 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME)
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"
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}
166 set(JAVA_JVM_LIBRARY_DIRECTORIES)
167 foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
168 list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
172 # IBM SDK, Java Technology Edition, specific paths
178 set(JAVA_AWT_INCLUDE_DIRECTORIES)
180 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
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"
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
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}")
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}")
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)
239 set(_JNI_SEARCHES FRAMEWORK NORMAL)
241 set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
242 set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
244 set(_JNI_SEARCHES NORMAL)
249 PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
254 PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
257 foreach(search ${_JNI_SEARCHES})
258 find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
259 find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
265 unset(_JNI_FRAMEWORK_JVM)
266 unset(_JNI_FRAMEWORK_JAWT)
267 unset(_JNI_NORMAL_JVM)
268 unset(_JNI_NORMAL_JAWT)
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)
274 set(CMAKE_FIND_FRAMEWORK NEVER)
277 # add in the include path
278 find_path(JAVA_INCLUDE_PATH jni.h
279 ${JAVA_AWT_INCLUDE_DIRECTORIES}
282 find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
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
296 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
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)
305 unset(CMAKE_FIND_FRAMEWORK)
308 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
309 FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI DEFAULT_MSG JAVA_AWT_LIBRARY
313 JAVA_AWT_INCLUDE_PATH)
318 JAVA_AWT_INCLUDE_PATH
330 ${JAVA_INCLUDE_PATH2}
331 ${JAVA_AWT_INCLUDE_PATH}