mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-15 19:56:59 +08:00
138 lines
3.1 KiB
Ruby
138 lines
3.1 KiB
Ruby
require "language/java"
|
|
|
|
class JavaRequirement < Requirement
|
|
fatal true
|
|
download "https://www.oracle.com/technetwork/java/javase/downloads/index.html"
|
|
|
|
# A strict Java 8 requirement (1.8) should prompt the user to install
|
|
# the legacy java8 cask because 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 cask
|
|
if @version.nil? || @version.to_s.end_with?("+") ||
|
|
@version.to_f >= JAVA_CASK_MAP.keys.max.to_f
|
|
JAVA_CASK_MAP.fetch(JAVA_CASK_MAP.keys.max)
|
|
else
|
|
JAVA_CASK_MAP.fetch("1.8")
|
|
end
|
|
end
|
|
|
|
satisfy build_env: false do
|
|
setup_java
|
|
next false unless @java
|
|
next true
|
|
end
|
|
|
|
def initialize(tags = [])
|
|
@version = tags.shift if /(\d+\.)+\d/ =~ tags.first
|
|
super
|
|
end
|
|
|
|
def message
|
|
version_string = " #{@version}" if @version
|
|
|
|
s = "Java#{version_string} is required to install this formula.\n"
|
|
s += super
|
|
s
|
|
end
|
|
|
|
def inspect
|
|
"#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>"
|
|
end
|
|
|
|
def display_s
|
|
if @version
|
|
if exact_version?
|
|
op = "="
|
|
else
|
|
op = ">="
|
|
end
|
|
"#{name} #{op} #{version_without_plus}"
|
|
else
|
|
name
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
JAVA_CASK_MAP = {
|
|
"1.8" => "homebrew/cask-versions/java8",
|
|
"10.0" => "java",
|
|
}.freeze
|
|
|
|
def version_without_plus
|
|
if exact_version?
|
|
@version
|
|
else
|
|
@version[0, @version.length - 1]
|
|
end
|
|
end
|
|
|
|
def exact_version?
|
|
@version && @version.to_s.chars.last != "+"
|
|
end
|
|
|
|
def setup_java
|
|
java = preferred_java
|
|
return unless java
|
|
@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["jdk"]
|
|
rescue FormulaUnavailableError
|
|
nil
|
|
end
|
|
javas << jdk.bin/"java" if jdk&.installed?
|
|
javas << which("java")
|
|
javas
|
|
end
|
|
|
|
def preferred_java
|
|
possible_javas.detect do |java|
|
|
next false unless java&.executable?
|
|
next true unless @version
|
|
next true if satisfies_version(java)
|
|
end
|
|
end
|
|
|
|
def env_java_common
|
|
return unless @java_home
|
|
java_home = Pathname.new(@java_home)
|
|
ENV["JAVA_HOME"] = java_home
|
|
ENV.prepend_path "PATH", java_home/"bin"
|
|
end
|
|
|
|
def env_oracle_jdk
|
|
return unless @java_home
|
|
java_home = Pathname.new(@java_home)
|
|
return unless (java_home/"include").exist?
|
|
ENV.append_to_cflags "-I#{java_home}/include"
|
|
ENV.append_to_cflags "-I#{java_home}/include/#{oracle_java_os}"
|
|
true
|
|
end
|
|
|
|
def oracle_java_os
|
|
nil
|
|
end
|
|
|
|
def satisfies_version(java)
|
|
java_version_s = Utils.popen_read(java, "-version", err: :out)[/\d+.\d/]
|
|
return false unless java_version_s
|
|
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"
|