Imported Upstream version 3.11.2
[platform/upstream/cmake.git] / Modules / FindJava.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 # FindJava
6 # --------
7 #
8 # Find Java
9 #
10 # This module finds if Java is installed and determines where the
11 # include files and libraries are.  The caller may set variable JAVA_HOME
12 # to specify a Java installation prefix explicitly.
13 #
14 # See also the :module:`FindJNI` module to find Java development tools.
15 #
16 # Specify one or more of the following components as you call this find module. See example below.
17 #
18 # ::
19 #
20 #   Runtime     = User just want to execute some Java byte-compiled
21 #   Development = Development tools (java, javac, javah and javadoc), includes Runtime component
22 #   IdlJ        = idl compiler for Java
23 #   JarSigner   = signer tool for jar
24 #
25 #
26 # This module sets the following result variables:
27 #
28 # ::
29 #
30 #   Java_JAVA_EXECUTABLE      = the full path to the Java runtime
31 #   Java_JAVAC_EXECUTABLE     = the full path to the Java compiler
32 #   Java_JAVAH_EXECUTABLE     = the full path to the Java header generator
33 #   Java_JAVADOC_EXECUTABLE   = the full path to the Java documentation generator
34 #   Java_IDLJ_EXECUTABLE      = the full path to the Java idl compiler
35 #   Java_JAR_EXECUTABLE       = the full path to the Java archiver
36 #   Java_JARSIGNER_EXECUTABLE = the full path to the Java jar signer
37 #   Java_VERSION_STRING       = Version of java found, eg. 1.6.0_12
38 #   Java_VERSION_MAJOR        = The major version of the package found.
39 #   Java_VERSION_MINOR        = The minor version of the package found.
40 #   Java_VERSION_PATCH        = The patch version of the package found.
41 #   Java_VERSION_TWEAK        = The tweak version of the package found (after '_')
42 #   Java_VERSION              = This is set to: $major[.$minor[.$patch[.$tweak]]]
43 #
44 #
45 #
46 # The minimum required version of Java can be specified using the
47 # standard CMake syntax, e.g.  find_package(Java 1.5)
48 #
49 # NOTE: ${Java_VERSION} and ${Java_VERSION_STRING} are not guaranteed to
50 # be identical.  For example some java version may return:
51 # Java_VERSION_STRING = 1.5.0_17 and Java_VERSION = 1.5.0.17
52 #
53 # another example is the Java OEM, with: Java_VERSION_STRING = 1.6.0-oem
54 # and Java_VERSION = 1.6.0
55 #
56 # For these components the following variables are set:
57 #
58 # ::
59 #
60 #   Java_FOUND                    - TRUE if all components are found.
61 #   Java_<component>_FOUND        - TRUE if <component> is found.
62 #
63 #
64 #
65 # Example Usages:
66 #
67 # ::
68 #
69 #   find_package(Java)
70 #   find_package(Java COMPONENTS Runtime)
71 #   find_package(Java COMPONENTS Development)
72
73 include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
74
75 # The HINTS option should only be used for values computed from the system.
76 set(_JAVA_HINTS)
77 if(_JAVA_HOME)
78   list(APPEND _JAVA_HINTS ${_JAVA_HOME}/bin)
79 endif()
80 if (WIN32)
81   macro (_JAVA_GET_INSTALLED_VERSIONS _KIND)
82     execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\${_KIND} /f "." /k
83       RESULT_VARIABLE _JAVA_RESULT
84       OUTPUT_VARIABLE _JAVA_VERSIONS
85       ERROR_QUIET)
86     if (NOT  _JAVA_RESULT)
87       string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\${_KIND}\\\\[0-9.]+" _JAVA_VERSIONS "${_JAVA_VERSIONS}")
88       if (_JAVA_VERSIONS)
89         # sort versions. Most recent first
90         ## handle version 9 apart from other versions to get correct ordering
91         set (_JAVA_V9 ${_JAVA_VERSIONS})
92         list (FILTER _JAVA_VERSIONS EXCLUDE REGEX "${_KIND}\\\\9")
93         list (SORT _JAVA_VERSIONS)
94         list (REVERSE _JAVA_VERSIONS)
95         list (FILTER _JAVA_V9 INCLUDE REGEX "${_KIND}\\\\9")
96         list (SORT _JAVA_V9)
97         list (REVERSE _JAVA_V9)
98         list (APPEND _JAVA_VERSIONS ${_JAVA_V9})
99         foreach (_JAVA_HINT IN LISTS _JAVA_VERSIONS)
100           list(APPEND _JAVA_HINTS "[${_JAVA_HINT};JavaHome]/bin")
101         endforeach()
102       endif()
103     endif()
104   endmacro()
105
106   # search for installed versions for version 9 and upper
107   _JAVA_GET_INSTALLED_VERSIONS("JDK")
108   _JAVA_GET_INSTALLED_VERSIONS("JRE")
109
110   list(APPEND _JAVA_HINTS
111   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/bin"
112   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/bin"
113   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/bin"
114   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/bin"
115   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/bin"
116   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/bin"
117   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/bin"
118   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.9;JavaHome]/bin"
119   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.8;JavaHome]/bin"
120   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.7;JavaHome]/bin"
121   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.6;JavaHome]/bin"
122   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.5;JavaHome]/bin"
123   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.4;JavaHome]/bin"
124   "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.3;JavaHome]/bin"
125   )
126 endif()
127
128 # Hard-coded guesses should still go in PATHS. This ensures that the user
129 # environment can always override hard guesses.
130 set(_JAVA_PATHS
131   /usr/lib/java/bin
132   /usr/share/java/bin
133   /usr/local/java/bin
134   /usr/local/java/share/bin
135   /usr/java/j2sdk1.4.2_04
136   /usr/lib/j2sdk1.4-sun/bin
137   /usr/java/j2sdk1.4.2_09/bin
138   /usr/lib/j2sdk1.5-sun/bin
139   /opt/sun-jdk-1.5.0.04/bin
140   /usr/local/jdk-1.7.0/bin
141   /usr/local/jdk-1.6.0/bin
142   )
143 find_program(Java_JAVA_EXECUTABLE
144   NAMES java
145   HINTS ${_JAVA_HINTS}
146   PATHS ${_JAVA_PATHS}
147 )
148
149 if(Java_JAVA_EXECUTABLE)
150     execute_process(COMMAND ${Java_JAVA_EXECUTABLE} -version
151       RESULT_VARIABLE res
152       OUTPUT_VARIABLE var
153       ERROR_VARIABLE var # sun-java output to stderr
154       OUTPUT_STRIP_TRAILING_WHITESPACE
155       ERROR_STRIP_TRAILING_WHITESPACE)
156     if( res )
157       if(var MATCHES "No Java runtime present, requesting install")
158         set_property(CACHE Java_JAVA_EXECUTABLE
159           PROPERTY VALUE "Java_JAVA_EXECUTABLE-NOTFOUND")
160       elseif(${Java_FIND_REQUIRED})
161         message( FATAL_ERROR "Error executing java -version" )
162       else()
163         message( STATUS "Warning, could not run java -version")
164       endif()
165     else()
166       # Extract version components (up to 4 levels) from "java -version" output.
167       set(_java_version_regex [[(([0-9]+)(\.([0-9]+)(\.([0-9]+)(_([0-9]+))?)?)?.*)]])
168       if(var MATCHES "java version \"${_java_version_regex}\"")
169         # Sun, GCJ, older OpenJDK
170         set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
171         set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
172         if (CMAKE_MATCH_4)
173         set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
174         else()
175           set(Java_VERSION_MINOR 0)
176         endif()
177         if (CMAKE_MATCH_6)
178         set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
179         else()
180           set(Java_VERSION_PATCH 0)
181         endif()
182         set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
183       elseif(var MATCHES "openjdk version \"${_java_version_regex}\"")
184         # OpenJDK
185         set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
186         set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
187         if (CMAKE_MATCH_4)
188         set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
189         else()
190           set(Java_VERSION_MINOR 0)
191         endif()
192         if (CMAKE_MATCH_6)
193         set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
194         else()
195           set(Java_VERSION_PATCH 0)
196         endif()
197         set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
198       elseif(var MATCHES "openjdk version \"([0-9]+)-[A-Za-z]+\"")
199         # OpenJDK 9 early access builds or locally built
200         set(Java_VERSION_STRING "1.${CMAKE_MATCH_1}.0")
201         set(Java_VERSION_MAJOR "1")
202         set(Java_VERSION_MINOR "${CMAKE_MATCH_1}")
203         set(Java_VERSION_PATCH "0")
204         set(Java_VERSION_TWEAK "")
205       elseif(var MATCHES "java full version \"kaffe-${_java_version_regex}\"")
206         # Kaffe style
207         set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
208         set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
209         set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
210         set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
211         set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
212       else()
213         if(NOT Java_FIND_QUIETLY)
214           string(REPLACE "\n" "\n  " ver_msg "\n${var}")
215           message(WARNING "Java version not recognized:${ver_msg}\nPlease report.")
216         endif()
217         set(Java_VERSION_STRING "")
218         set(Java_VERSION_MAJOR "")
219         set(Java_VERSION_MINOR "")
220         set(Java_VERSION_PATCH "")
221         set(Java_VERSION_TWEAK "")
222       endif()
223       set(Java_VERSION "${Java_VERSION_MAJOR}")
224       if(NOT "x${Java_VERSION}" STREQUAL "x")
225         foreach(c MINOR PATCH TWEAK)
226           if(NOT "x${Java_VERSION_${c}}" STREQUAL "x")
227             string(APPEND Java_VERSION ".${Java_VERSION_${c}}")
228           else()
229             break()
230           endif()
231         endforeach()
232       endif()
233     endif()
234
235 endif()
236
237
238 find_program(Java_JAR_EXECUTABLE
239   NAMES jar
240   HINTS ${_JAVA_HINTS}
241   PATHS ${_JAVA_PATHS}
242 )
243
244 find_program(Java_JAVAC_EXECUTABLE
245   NAMES javac
246   HINTS ${_JAVA_HINTS}
247   PATHS ${_JAVA_PATHS}
248 )
249
250 find_program(Java_JAVAH_EXECUTABLE
251   NAMES javah
252   HINTS ${_JAVA_HINTS}
253   PATHS ${_JAVA_PATHS}
254 )
255
256 find_program(Java_JAVADOC_EXECUTABLE
257   NAMES javadoc
258   HINTS ${_JAVA_HINTS}
259   PATHS ${_JAVA_PATHS}
260 )
261
262 find_program(Java_IDLJ_EXECUTABLE
263   NAMES idlj
264   HINTS ${_JAVA_HINTS}
265   PATHS ${_JAVA_PATHS}
266 )
267
268 find_program(Java_JARSIGNER_EXECUTABLE
269   NAMES jarsigner
270   HINTS ${_JAVA_HINTS}
271   PATHS ${_JAVA_PATHS}
272 )
273
274 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
275 if(Java_FIND_COMPONENTS)
276   set(_JAVA_REQUIRED_VARS)
277   foreach(component ${Java_FIND_COMPONENTS})
278     # User just want to execute some Java byte-compiled
279     If(component STREQUAL "Runtime")
280       list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE)
281       if(Java_JAVA_EXECUTABLE)
282         set(Java_Runtime_FOUND TRUE)
283       endif()
284     elseif(component STREQUAL "Development")
285       list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAVAC_EXECUTABLE
286                                       Java_JAVADOC_EXECUTABLE)
287       if(Java_VERSION VERSION_LESS "10")
288         list(APPEND _JAVA_REQUIRED_VARS Java_JAVAH_EXECUTABLE)
289         if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
290             AND Java_JAVAH_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
291           set(Java_Development_FOUND TRUE)
292         endif()
293       else()
294         if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
295             AND Java_JAVADOC_EXECUTABLE)
296           set(Java_Development_FOUND TRUE)
297         endif()
298       endif()
299     elseif(component STREQUAL "IdlJ")
300       list(APPEND _JAVA_REQUIRED_VARS Java_IDLJ_EXECUTABLE)
301       if(Java_IDLJ_EXECUTABLE)
302         set(Java_IdlJ_FOUND TRUE)
303       endif()
304     elseif(component STREQUAL "JarSigner")
305       list(APPEND _JAVA_REQUIRED_VARS Java_JARSIGNER_EXECUTABLE)
306       if(Java_JARSIGNER_EXECUTABLE)
307         set(Java_JarSigner_FOUND TRUE)
308       endif()
309     else()
310       message(FATAL_ERROR "Comp: ${component} is not handled")
311     endif()
312   endforeach()
313   list (REMOVE_DUPLICATES _JAVA_REQUIRED_VARS)
314   find_package_handle_standard_args(Java
315     REQUIRED_VARS ${_JAVA_REQUIRED_VARS} HANDLE_COMPONENTS
316     VERSION_VAR Java_VERSION
317     )
318   if(Java_FOUND)
319     foreach(component ${Java_FIND_COMPONENTS})
320       set(Java_${component}_FOUND TRUE)
321     endforeach()
322   endif()
323 else()
324   # Check for Development
325   if(Java_VERSION VERSION_LESS "10")
326     find_package_handle_standard_args(Java
327       REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
328                     Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
329       VERSION_VAR Java_VERSION_STRING
330       )
331   else()
332     find_package_handle_standard_args(Java
333       REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
334                     Java_JAVADOC_EXECUTABLE
335       VERSION_VAR Java_VERSION_STRING
336       )
337   endif()
338 endif()
339
340
341 mark_as_advanced(
342   Java_JAVA_EXECUTABLE
343   Java_JAR_EXECUTABLE
344   Java_JAVAC_EXECUTABLE
345   Java_JAVAH_EXECUTABLE
346   Java_JAVADOC_EXECUTABLE
347   Java_IDLJ_EXECUTABLE
348   Java_JARSIGNER_EXECUTABLE
349   )
350
351 # LEGACY
352 set(JAVA_RUNTIME ${Java_JAVA_EXECUTABLE})
353 set(JAVA_ARCHIVE ${Java_JAR_EXECUTABLE})
354 set(JAVA_COMPILE ${Java_JAVAC_EXECUTABLE})