2020-10-10 14:16:11 +02:00
|
|
|
# typed: false
|
2019-04-19 15:38:03 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-02-26 22:36:04 +08:00
|
|
|
require "language/java"
|
|
|
|
|
2020-08-19 06:50:53 +02:00
|
|
|
# A requirement on Java.
|
|
|
|
#
|
|
|
|
# @api private
|
2015-06-15 09:56:04 +01:00
|
|
|
class JavaRequirement < Requirement
|
2020-10-20 12:03:48 +02:00
|
|
|
extend T::Sig
|
|
|
|
|
2015-02-26 22:36:04 +08:00
|
|
|
fatal true
|
|
|
|
|
2020-03-02 16:29:49 -05:00
|
|
|
attr_reader :java_home, :version
|
|
|
|
|
2018-04-18 09:55:44 +01:00
|
|
|
# A strict Java 8 requirement (1.8) should prompt the user to install
|
2019-04-19 17:52:47 +02:00
|
|
|
# an OpenJDK 1.8 distribution. Versions newer than Java 8 are not
|
2018-04-18 09:55:44 +01:00
|
|
|
# completely backwards compatible, and contain breaking changes such as
|
|
|
|
# strong encapsulation of JDK-internal APIs and a modified version scheme
|
|
|
|
# (*.0 not 1.*).
|
2019-04-19 17:52:47 +02:00
|
|
|
def suggestion
|
|
|
|
if fits_latest?
|
|
|
|
JAVA_SUGGESTION_MAP.fetch(JAVA_SUGGESTION_MAP.keys.max)
|
2018-04-18 09:55:44 +01:00
|
|
|
else
|
2019-04-19 17:52:47 +02:00
|
|
|
JAVA_SUGGESTION_MAP.fetch("1.8")
|
2018-04-18 09:55:44 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-17 15:32:44 +01:00
|
|
|
satisfy build_env: false do
|
2016-12-04 18:43:46 -08:00
|
|
|
setup_java
|
|
|
|
next false unless @java
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
next true
|
2015-02-26 22:36:04 +08:00
|
|
|
end
|
|
|
|
|
2017-12-30 18:58:30 +00:00
|
|
|
def initialize(tags = [])
|
2020-11-24 16:44:02 +00:00
|
|
|
odeprecated "depends_on :java",
|
|
|
|
'"depends_on "openjdk@11", "depends_on "openjdk@8" or "depends_on "openjdk"'
|
|
|
|
|
2019-10-13 19:26:39 +01:00
|
|
|
@version = tags.shift if tags.first&.match?(/^\d/)
|
2018-10-19 16:38:41 +01:00
|
|
|
super(tags)
|
2019-06-10 10:37:09 +08:00
|
|
|
@cask = suggestion.token
|
2015-02-26 22:36:04 +08:00
|
|
|
end
|
|
|
|
|
2020-10-20 12:03:48 +02:00
|
|
|
sig { returns(String) }
|
2015-02-26 22:36:04 +08:00
|
|
|
def message
|
|
|
|
version_string = " #{@version}" if @version
|
2020-11-01 12:26:18 -05:00
|
|
|
s = "Java#{version_string} is required for this software.\n"
|
2019-04-19 17:52:47 +02:00
|
|
|
s += suggestion
|
2015-02-26 22:36:04 +08:00
|
|
|
s
|
|
|
|
end
|
|
|
|
|
2020-10-20 12:03:48 +02:00
|
|
|
sig { returns(String) }
|
2015-02-26 22:36:04 +08:00
|
|
|
def inspect
|
2020-11-01 12:22:56 -05:00
|
|
|
"#<#{self.class.name}: version=#{@version.inspect} #{tags.inspect}>"
|
2015-02-26 22:36:04 +08:00
|
|
|
end
|
2016-09-18 00:37:02 -04:00
|
|
|
|
|
|
|
def display_s
|
|
|
|
if @version
|
2020-03-13 21:15:06 +00:00
|
|
|
op = if exact_version?
|
|
|
|
"="
|
2016-12-04 18:43:46 -08:00
|
|
|
else
|
2020-03-13 21:15:06 +00:00
|
|
|
">="
|
2016-09-18 00:37:02 -04:00
|
|
|
end
|
2020-11-01 12:02:13 -05:00
|
|
|
"#{name.capitalize} #{op} #{version_without_plus}"
|
2016-09-18 00:37:02 -04:00
|
|
|
else
|
2020-11-01 12:02:13 -05:00
|
|
|
name.capitalize
|
2016-09-18 00:37:02 -04:00
|
|
|
end
|
|
|
|
end
|
2016-12-04 18:43:46 -08:00
|
|
|
|
|
|
|
private
|
|
|
|
|
2019-04-19 17:52:47 +02:00
|
|
|
CaskSuggestion = Struct.new(:token, :title) do
|
2020-10-20 12:03:48 +02:00
|
|
|
extend T::Sig
|
|
|
|
|
|
|
|
sig { returns(String) }
|
2019-04-19 17:52:47 +02:00
|
|
|
def to_str
|
|
|
|
title_string = " #{title}" if title
|
|
|
|
<<~EOS
|
|
|
|
Install#{title_string} with Homebrew Cask:
|
2020-11-18 08:10:21 +01:00
|
|
|
brew install --cask #{token}
|
2019-04-19 17:52:47 +02:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
JAVA_SUGGESTION_MAP = {
|
|
|
|
"1.8" => CaskSuggestion.new(
|
|
|
|
"homebrew/cask-versions/adoptopenjdk8",
|
2019-04-30 08:44:35 +01:00
|
|
|
"AdoptOpenJDK 8",
|
2019-04-19 17:52:47 +02:00
|
|
|
),
|
|
|
|
"12.0" => CaskSuggestion.new("adoptopenjdk", "AdoptOpenJDK"),
|
2018-04-18 09:55:44 +01:00
|
|
|
}.freeze
|
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
def version_without_plus
|
|
|
|
if exact_version?
|
|
|
|
@version
|
|
|
|
else
|
2017-06-01 16:06:51 +02:00
|
|
|
@version[0, @version.length - 1]
|
2016-12-04 18:43:46 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def exact_version?
|
2020-07-07 13:12:37 +01:00
|
|
|
@version && @version.to_s[-1] != "+"
|
2016-12-04 18:43:46 -08:00
|
|
|
end
|
|
|
|
|
2019-04-19 17:52:47 +02:00
|
|
|
def fits_latest?
|
|
|
|
@version.nil? ||
|
|
|
|
@version.to_s.end_with?("+") ||
|
|
|
|
@version.to_f >= JAVA_SUGGESTION_MAP.keys.max.to_f
|
|
|
|
end
|
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
def setup_java
|
|
|
|
java = preferred_java
|
|
|
|
return unless java
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
@java = java
|
|
|
|
@java_home = java.parent.parent
|
|
|
|
end
|
|
|
|
|
|
|
|
def possible_javas
|
|
|
|
javas = []
|
|
|
|
javas << Pathname.new(ENV["JAVA_HOME"])/"bin/java" if ENV["JAVA_HOME"]
|
|
|
|
jdk = begin
|
2019-07-07 10:08:56 -07:00
|
|
|
Formula["adoptopenjdk"]
|
2016-12-04 18:43:46 -08:00
|
|
|
rescue FormulaUnavailableError
|
|
|
|
nil
|
|
|
|
end
|
2020-05-18 13:50:43 +01:00
|
|
|
javas << jdk.bin/"java" if jdk&.latest_version_installed?
|
2016-12-04 18:43:46 -08:00
|
|
|
javas << which("java")
|
|
|
|
javas
|
|
|
|
end
|
|
|
|
|
|
|
|
def preferred_java
|
2018-09-02 20:14:54 +01:00
|
|
|
possible_javas.find do |java|
|
2017-09-24 19:24:46 +01:00
|
|
|
next false unless java&.executable?
|
2016-12-04 18:43:46 -08:00
|
|
|
next true unless @version
|
|
|
|
next true if satisfies_version(java)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def env_java_common
|
2017-02-15 21:47:08 -08:00
|
|
|
return unless @java_home
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
java_home = Pathname.new(@java_home)
|
|
|
|
ENV["JAVA_HOME"] = java_home
|
|
|
|
ENV.prepend_path "PATH", java_home/"bin"
|
|
|
|
end
|
|
|
|
|
|
|
|
def env_oracle_jdk
|
2017-02-15 21:47:08 -08:00
|
|
|
return unless @java_home
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
java_home = Pathname.new(@java_home)
|
2017-02-15 21:47:08 -08:00
|
|
|
return unless (java_home/"include").exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
ENV.append_to_cflags "-I#{java_home}/include"
|
|
|
|
ENV.append_to_cflags "-I#{java_home}/include/#{oracle_java_os}"
|
2017-02-15 21:47:08 -08:00
|
|
|
true
|
2016-12-04 18:43:46 -08:00
|
|
|
end
|
|
|
|
|
|
|
|
def oracle_java_os
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def satisfies_version(java)
|
2019-02-06 14:48:19 -08:00
|
|
|
java_version_s = system_command(java, args: ["-version"], print_stderr: false).stderr[/\d+(\.\d+)?/]
|
2016-12-04 18:43:46 -08:00
|
|
|
return false unless java_version_s
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-04 18:43:46 -08:00
|
|
|
java_version = Version.create(java_version_s)
|
|
|
|
needed_version = Version.create(version_without_plus)
|
|
|
|
if exact_version?
|
|
|
|
java_version == needed_version
|
|
|
|
else
|
|
|
|
java_version >= needed_version
|
|
|
|
end
|
|
|
|
end
|
2015-02-26 22:36:04 +08:00
|
|
|
end
|
2016-12-04 18:43:46 -08:00
|
|
|
|
|
|
|
require "extend/os/requirements/java_requirement"
|