From cd93d4e38a4a850680cde1edef63448633a9f1dd Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Fri, 19 Jun 2020 11:46:31 +0100 Subject: [PATCH 1/3] language/java: add support for OpenJDK formula --- .../Homebrew/extend/os/mac/language/java.rb | 12 ++++++++-- Library/Homebrew/language/java.rb | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/extend/os/mac/language/java.rb b/Library/Homebrew/extend/os/mac/language/java.rb index b552027a9a..4661652c0b 100644 --- a/Library/Homebrew/extend/os/mac/language/java.rb +++ b/Library/Homebrew/extend/os/mac/language/java.rb @@ -4,17 +4,25 @@ module Language module Java def self.system_java_home_cmd(version = nil) version_flag = " --version #{version}" if version - "/usr/libexec/java_home#{version_flag}" + "/usr/libexec/java_home#{version_flag} --failfast 2>/dev/null" end private_class_method :system_java_home_cmd def self.java_home(version = nil) + f = find_openjdk_formula(version) + return f.opt_libexec/"openjdk.jdk/Contents/Home" if f + cmd = system_java_home_cmd(version) - Pathname.new Utils.popen_read(cmd).chomp + path = Utils.popen_read(cmd).chomp + + Pathname.new path if path.present? end # @private def self.java_home_shell(version = nil) + f = find_openjdk_formula(version) + return (f.opt_libexec/"openjdk.jdk/Contents/Home").to_s if f + "$(#{system_java_home_cmd(version)})" end end diff --git a/Library/Homebrew/language/java.rb b/Library/Homebrew/language/java.rb index 612ab32c8d..610c73a5b5 100644 --- a/Library/Homebrew/language/java.rb +++ b/Library/Homebrew/language/java.rb @@ -2,7 +2,31 @@ module Language module Java + def self.find_openjdk_formula(version = nil) + can_be_newer = version&.end_with?("+") + version = version.to_i + + openjdk = Formula["openjdk"] + [openjdk, *openjdk.versioned_formulae].find do |f| + next false unless f.any_version_installed? + + unless version.zero? + major = f.version.to_s[/\d+/].to_i + next false if major < version + next false if major > version && !can_be_newer + end + + true + end + rescue FormulaUnavailableError + nil + end + private_class_method :find_openjdk_formula + def self.java_home(version = nil) + f = find_openjdk_formula(version) + return f.opt_libexec if f + req = JavaRequirement.new [*version] raise UnsatisfiedRequirements, req.message unless req.satisfied? From c244e992afbab4e74fa5134c21c345e281b3f5aa Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Fri, 19 Jun 2020 11:54:04 +0100 Subject: [PATCH 2/3] extend/pathname: add args argument to write_env_script --- Library/Homebrew/extend/pathname.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index e0c331f4dd..e60e9357e8 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -346,13 +346,17 @@ class Pathname end # Writes an exec script that sets environment variables - def write_env_script(target, env) + def write_env_script(target, args, env = nil) + unless env + env = args + args = nil + end env_export = +"" env.each { |key, value| env_export << "#{key}=\"#{value}\" " } dirname.mkpath write <<~SH #!/bin/bash - #{env_export}exec "#{target}" "$@" + #{env_export}exec "#{target}" #{args} "$@" SH end From cd0c3fa835fda19a2929eb28cf58ecace2aad89f Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Fri, 19 Jun 2020 11:55:05 +0100 Subject: [PATCH 3/3] extend/pathname: use Java.overridable_java_home_env in write_jar_script --- Library/Homebrew/compat/language/java.rb | 3 ++- Library/Homebrew/extend/os/mac/language/java.rb | 2 +- Library/Homebrew/extend/pathname.rb | 8 ++------ Library/Homebrew/language/java.rb | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Library/Homebrew/compat/language/java.rb b/Library/Homebrew/compat/language/java.rb index 3ad89ebc74..2bcf485e2f 100644 --- a/Library/Homebrew/compat/language/java.rb +++ b/Library/Homebrew/compat/language/java.rb @@ -5,7 +5,8 @@ module Language class << self module Compat def java_home_cmd(version = nil) - odeprecated "Language::Java::java_home_cmd", "Language::Java::java_home" + odeprecated "Language::Java.java_home_cmd", + "Language::Java.java_home or Language::Java.overridable_java_home_env" # macOS provides /usr/libexec/java_home, but Linux does not. return system_java_home_cmd(version) if OS.mac? diff --git a/Library/Homebrew/extend/os/mac/language/java.rb b/Library/Homebrew/extend/os/mac/language/java.rb index 4661652c0b..a92b386ece 100644 --- a/Library/Homebrew/extend/os/mac/language/java.rb +++ b/Library/Homebrew/extend/os/mac/language/java.rb @@ -18,12 +18,12 @@ module Language Pathname.new path if path.present? end - # @private def self.java_home_shell(version = nil) f = find_openjdk_formula(version) return (f.opt_libexec/"openjdk.jdk/Contents/Home").to_s if f "$(#{system_java_home_cmd(version)})" end + private_class_method :java_home_shell end end diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index e60e9357e8..33a937b5d7 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -374,12 +374,8 @@ class Pathname # Writes an exec script that invokes a Java jar def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil) - mkpath - java_home = ("JAVA_HOME=\"#{Language::Java.java_home_shell(java_version)}\" " if java_version) - join(script_name).write <<~SH - #!/bin/bash - #{java_home}exec java #{java_opts} -jar #{target_jar} "$@" - SH + (self/script_name).write_env_script "java", "#{java_opts} -jar \"#{target_jar}\"", + Language::Java.overridable_java_home_env(java_version) end def install_metafiles(from = Pathname.pwd) diff --git a/Library/Homebrew/language/java.rb b/Library/Homebrew/language/java.rb index 610c73a5b5..77bddccf5f 100644 --- a/Library/Homebrew/language/java.rb +++ b/Library/Homebrew/language/java.rb @@ -33,10 +33,10 @@ module Language req.java_home end - # @private def self.java_home_shell(version = nil) java_home(version).to_s end + private_class_method :java_home_shell def self.java_home_env(version = nil) { JAVA_HOME: java_home_shell(version) }