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