brew/Library/Homebrew/requirements/java_requirement.rb

179 lines
3.9 KiB
Ruby
Raw Normal View History

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