brew/Library/Homebrew/requirements/java_requirement.rb
Mike McQuaid 80d75bc0d8
Homebrew/.rubocop: tweak rules.
Adjust the rules based on the current codebase. Remove various enable,
disables and default values that are unnecessary. Add more comments
explaining why. Make minor changes needed to enable a few more rules.
2018-09-02 20:15:09 +01:00

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.find 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"