1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindJava
--------
Finds the Java installation and determines its runtime tools and development
components.
.. versionadded:: 3.10
Support for Java 9+ version parsing.
Components
^^^^^^^^^^
This module supports the following components:
``Runtime``
Finds the Java Runtime Environment used to execute Java byte-compiled
applications.
``Development``
Finds development tools (``java``, ``javac``, ``javah``, ``jar``, and
``javadoc``). Specifying this component also implies the ``Runtime``
component.
``IdlJ``
.. versionadded:: 3.4
Finds the Interface Description Language (IDL) to Java compiler.
``JarSigner``
.. versionadded:: 3.4
Finds the signer and verifier tool for Java Archive (JAR) files.
Components can optionally be specified using the standard syntax with:
.. code-block:: cmake
find_package(Java [COMPONENTS <components>...])
If no ``COMPONENTS`` are specified, the module searches for the ``Runtime``
component by default.
Result Variables
^^^^^^^^^^^^^^^^
This module defines the following variables:
``Java_FOUND``
Boolean indicating whether Java with all specified components is found.
``Java_<component>_FOUND``
Boolean indicating whether the ``<component>`` is found.
``Java_VERSION``
Version of Java found. This is set to:
``<major>[.<minor>[.<patch>[.<tweak>]]]``.
``Java_VERSION_MAJOR``
The major version of Java found.
``Java_VERSION_MINOR``
The minor version of Java found.
``Java_VERSION_PATCH``
The patch version of Java found.
``Java_VERSION_TWEAK``
The tweak version of Java found (part after the underscore character ``_``).
``Java_VERSION_STRING``
Version of Java found, e.g., ``1.6.0_12``.
.. note::
``Java_VERSION`` and ``Java_VERSION_STRING`` are not guaranteed to be
identical. For example, some Java versions may return:
``Java_VERSION_STRING = 1.8.0_17`` and ``Java_VERSION = 1.8.0.17``.
Another example is the Java OEM, with ``Java_VERSION_STRING = 1.8.0-oem``
and ``Java_VERSION = 1.8.0``.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``Java_JAVA_EXECUTABLE``
The full path to the Java runtime.
``Java_JAVAC_EXECUTABLE``
The full path to the Java compiler.
``Java_JAVAH_EXECUTABLE``
The full path to the Java header generator.
``Java_JAVADOC_EXECUTABLE``
The full path to the Java documentation generator.
``Java_IDLJ_EXECUTABLE``
.. versionadded:: 3.4
The full path to the Java idl compiler.
``Java_JAR_EXECUTABLE``
The full path to the Java archiver.
``Java_JARSIGNER_EXECUTABLE``
.. versionadded:: 3.4
The full path to the Java jar signer.
Hints
^^^^^
This module accepts the following variables:
``JAVA_HOME``
The caller can set this variable to specify the installation directory of Java
explicitly.
Examples
^^^^^^^^
Finding Java:
.. code-block:: cmake
find_package(Java)
Finding Java with at least the specified minimum version:
.. code-block:: cmake
find_package(Java 1.8)
Finding Java and making it required (if Java is not found, processing stops with
an error message):
.. code-block:: cmake
find_package(Java 1.8 REQUIRED)
Specifying the needed Java components to find:
.. code-block:: cmake
find_package(Java COMPONENTS Development JarSigner)
See Also
^^^^^^^^
* The :module:`FindJNI` module to find Java Native Interface (JNI).
* The :module:`UseJava` module to use Java in CMake.
#]=======================================================================]
include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
# The HINTS option should only be used for values computed from the system.
set(_JAVA_HINTS)
if(_JAVA_HOME)
list(APPEND _JAVA_HINTS ${_JAVA_HOME}/bin)
endif()
if (WIN32)
macro (_JAVA_GET_INSTALLED_VERSIONS _KIND)
cmake_host_system_information(RESULT _JAVA_VERSIONS
QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/JavaSoft/${_KIND}"
SUBKEYS)
if (_JAVA_VERSIONS)
string (REGEX MATCHALL "[0-9._]+" _JAVA_VERSIONS "${_JAVA_VERSIONS}")
string (REGEX REPLACE "([0-9._]+)" "\\1" _JAVA_VERSIONS "${_JAVA_VERSIONS}")
if (_JAVA_VERSIONS)
# sort versions. Most recent first
list (SORT _JAVA_VERSIONS COMPARE NATURAL ORDER DESCENDING)
foreach (_JAVA_VERSION IN LISTS _JAVA_VERSIONS)
string(REPLACE "_" "." _JAVA_CMAKE_VERSION "${_JAVA_VERSION}")
if (Java_FIND_VERSION_EXACT
AND NOT _JAVA_CMAKE_VERSION MATCHES "^${Java_FIND_VERSION}")
continue()
endif()
list(APPEND _JAVA_HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\${_KIND}\\${_JAVA_VERSION};JavaHome]/bin")
endforeach()
endif()
endif()
endmacro()
# for version 9 and upper
_JAVA_GET_INSTALLED_VERSIONS("JDK")
_JAVA_GET_INSTALLED_VERSIONS("JRE")
# for versions older than 9
_JAVA_GET_INSTALLED_VERSIONS("Java Development Kit")
_JAVA_GET_INSTALLED_VERSIONS("Java Runtime Environment")
endif()
# Hard-coded guesses should still go in PATHS. This ensures that the user
# environment can always override hard guesses.
set(_JAVA_PATHS
/usr/lib/java/bin
/usr/share/java/bin
/usr/local/java/bin
/usr/local/java/share/bin
/usr/java/j2sdk1.4.2_04
/usr/lib/j2sdk1.4-sun/bin
/usr/java/j2sdk1.4.2_09/bin
/usr/lib/j2sdk1.5-sun/bin
/opt/sun-jdk-1.5.0.04/bin
/usr/local/jdk-1.7.0/bin
/usr/local/jdk-1.6.0/bin
)
find_program(Java_JAVA_EXECUTABLE
NAMES java
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
if(Java_JAVA_EXECUTABLE)
execute_process(COMMAND "${Java_JAVA_EXECUTABLE}" -version
RESULT_VARIABLE _java_res
OUTPUT_VARIABLE _java_var
ERROR_VARIABLE _java_var # sun-java output to stderr
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if(_java_res)
if(NOT Java_FIND_QUIETLY)
message(STATUS "Java version check failed: "
"${Java_JAVA_EXECUTABLE} -version returned an error: \"${_java_var}\"")
endif()
if(_java_var MATCHES "Unable to locate a Java Runtime|No Java runtime present, requesting install")
# macOS distributes a java stub that provides an error message
set(Java_JAVA_EXECUTABLE "Java_JAVA_EXECUTABLE-NOTFOUND" CACHE PATH
"Path to the Java executable" FORCE)
endif()
else()
# Extract version components (up to 4 levels) from "java -version" output.
set(_java_version_regex [[(([0-9]+)(\.([0-9]+)(\.([0-9]+)(_([0-9]+))?)?)?.*)]])
if(_java_var MATCHES "java version \"${_java_version_regex}\"")
# Sun, GCJ, older OpenJDK
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
if (CMAKE_MATCH_4)
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
else()
set(Java_VERSION_MINOR 0)
endif()
if (CMAKE_MATCH_6)
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
else()
set(Java_VERSION_PATCH 0)
endif()
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
elseif(_java_var MATCHES "openjdk version \"${_java_version_regex}\"")
# OpenJDK
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
if (CMAKE_MATCH_4)
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
else()
set(Java_VERSION_MINOR 0)
endif()
if (CMAKE_MATCH_6)
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
else()
set(Java_VERSION_PATCH 0)
endif()
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
elseif(_java_var MATCHES "openjdk version \"([0-9]+)-[A-Za-z]+\"")
# OpenJDK 9 early access builds or locally built
set(Java_VERSION_STRING "1.${CMAKE_MATCH_1}.0")
set(Java_VERSION_MAJOR "1")
set(Java_VERSION_MINOR "${CMAKE_MATCH_1}")
set(Java_VERSION_PATCH "0")
set(Java_VERSION_TWEAK "")
elseif(_java_var MATCHES "java full version \"kaffe-${_java_version_regex}\"")
# Kaffe style
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
else()
if(NOT Java_FIND_QUIETLY)
string(REPLACE "\n" "\n " ver_msg "\n${_java_var}")
message(WARNING "Java version not recognized:${ver_msg}\nPlease report.")
endif()
set(Java_VERSION_STRING "")
set(Java_VERSION_MAJOR "")
set(Java_VERSION_MINOR "")
set(Java_VERSION_PATCH "")
set(Java_VERSION_TWEAK "")
endif()
unset(_java_version_regex)
unset(_java_var)
set(Java_VERSION "${Java_VERSION_MAJOR}")
if(NOT "x${Java_VERSION}" STREQUAL "x")
foreach(_java_c IN ITEMS "MINOR" "PATCH" "TWEAK")
if(NOT "x${Java_VERSION_${_java_c}}" STREQUAL "x")
string(APPEND Java_VERSION ".${Java_VERSION_${_java_c}}")
else()
break()
endif()
endforeach()
unset(_java_c)
endif()
endif()
unset(_java_res)
endif()
find_program(Java_JAR_EXECUTABLE
NAMES jar
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVAC_EXECUTABLE
NAMES javac
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVAH_EXECUTABLE
NAMES javah
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVADOC_EXECUTABLE
NAMES javadoc
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_IDLJ_EXECUTABLE
NAMES idlj
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JARSIGNER_EXECUTABLE
NAMES jarsigner
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
include(FindPackageHandleStandardArgs)
if(Java_FIND_COMPONENTS)
set(_JAVA_REQUIRED_VARS)
foreach(component IN LISTS Java_FIND_COMPONENTS)
# User just want to execute some Java byte-compiled
If(component STREQUAL "Runtime")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE)
if(Java_JAVA_EXECUTABLE)
set(Java_Runtime_FOUND TRUE)
endif()
elseif(component STREQUAL "Development")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAR_EXECUTABLE Java_JAVADOC_EXECUTABLE)
if(Java_VERSION VERSION_LESS "10")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVAH_EXECUTABLE)
if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
AND Java_JAVAH_EXECUTABLE AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
set(Java_Development_FOUND TRUE)
endif()
else()
if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
set(Java_Development_FOUND TRUE)
endif()
endif()
elseif(component STREQUAL "IdlJ")
list(APPEND _JAVA_REQUIRED_VARS Java_IDLJ_EXECUTABLE)
if(Java_IDLJ_EXECUTABLE)
set(Java_IdlJ_FOUND TRUE)
endif()
elseif(component STREQUAL "JarSigner")
list(APPEND _JAVA_REQUIRED_VARS Java_JARSIGNER_EXECUTABLE)
if(Java_JARSIGNER_EXECUTABLE)
set(Java_JarSigner_FOUND TRUE)
endif()
else()
message(FATAL_ERROR "Comp: ${component} is not handled")
endif()
endforeach()
list (REMOVE_DUPLICATES _JAVA_REQUIRED_VARS)
find_package_handle_standard_args(Java
REQUIRED_VARS ${_JAVA_REQUIRED_VARS} HANDLE_COMPONENTS
VERSION_VAR Java_VERSION
)
if(Java_FOUND)
foreach(component IN LISTS Java_FIND_COMPONENTS)
set(Java_${component}_FOUND TRUE)
endforeach()
endif()
unset(_JAVA_REQUIRED_VARS)
else()
# Check for Development
if(Java_VERSION VERSION_LESS "10")
find_package_handle_standard_args(Java
REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
VERSION_VAR Java_VERSION
)
else()
find_package_handle_standard_args(Java
REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAVADOC_EXECUTABLE
VERSION_VAR Java_VERSION
)
endif()
endif()
mark_as_advanced(
Java_JAVA_EXECUTABLE
Java_JAR_EXECUTABLE
Java_JAVAC_EXECUTABLE
Java_JAVAH_EXECUTABLE
Java_JAVADOC_EXECUTABLE
Java_IDLJ_EXECUTABLE
Java_JARSIGNER_EXECUTABLE
)
# LEGACY
set(JAVA_RUNTIME ${Java_JAVA_EXECUTABLE})
set(JAVA_ARCHIVE ${Java_JAR_EXECUTABLE})
set(JAVA_COMPILE ${Java_JAVAC_EXECUTABLE})
|