From 5a214de68d52eef0bbf99f740dc22c721dd02233 Mon Sep 17 00:00:00 2001 From: "Bob W. Hogg" Date: Sun, 4 Dec 2016 18:43:46 -0800 Subject: [PATCH 1/2] java_requirement: port to Linux and refactor Split the core requirement class into generic, Linux-specific, and macOS-specific parts. Additionally, the Linux version is now able to detect Java versions (the previous Linuxbrew implementation was only able to detect if Java was present at all.) --- .../os/linux/requirements/java_requirement.rb | 19 ++++ .../os/mac/requirements/java_requirement.rb | 40 +++++++ .../os/requirements/java_requirement.rb | 7 ++ .../Homebrew/requirements/java_requirement.rb | 104 +++++++++++++----- .../Homebrew/test/java_requirement_test.rb | 50 +++++++++ .../test/os/mac/java_requirement_test.rb | 31 ++++++ 6 files changed, 226 insertions(+), 25 deletions(-) create mode 100644 Library/Homebrew/extend/os/linux/requirements/java_requirement.rb create mode 100644 Library/Homebrew/extend/os/mac/requirements/java_requirement.rb create mode 100644 Library/Homebrew/extend/os/requirements/java_requirement.rb create mode 100644 Library/Homebrew/test/java_requirement_test.rb create mode 100644 Library/Homebrew/test/os/mac/java_requirement_test.rb diff --git a/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb new file mode 100644 index 0000000000..c8cbabb0d9 --- /dev/null +++ b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb @@ -0,0 +1,19 @@ +require "language/java" + +class JavaRequirement < Requirement + default_formula "jdk" + + env do + next unless @java_home + env_java_common + if (Pathname.new(@java_home)/"include").exist? # Oracle JVM + env_oracle_jdk + end + end + + private + + def oracle_java_os + :linux + end +end diff --git a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb new file mode 100644 index 0000000000..9c60aff952 --- /dev/null +++ b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb @@ -0,0 +1,40 @@ +class JavaRequirement + cask "java" + + env do + env_java_common + java_home = Pathname.new(@java_home) + if (java_home/"include").exist? # Oracle JVM + env_oracle_jdk + else # Apple JVM + env_apple + end + end + + private + + def possible_javas + javas = [] + javas << Pathname.new(ENV["JAVA_HOME"])/"bin/java" if ENV["JAVA_HOME"] + javas << java_home_cmd + javas << which("java") + javas + end + + def java_home_cmd + return nil unless File.executable?("/usr/libexec/java_home") + args = %w[--failfast] + args << "--version" << @version.to_s if @version + java_home = Utils.popen_read("/usr/libexec/java_home", *args).chomp + return nil unless $?.success? + Pathname.new(java_home)/"bin/java" + end + + def env_apple + ENV.append_to_cflags "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" + end + + def oracle_java_os + :darwin + end +end diff --git a/Library/Homebrew/extend/os/requirements/java_requirement.rb b/Library/Homebrew/extend/os/requirements/java_requirement.rb new file mode 100644 index 0000000000..b512ada476 --- /dev/null +++ b/Library/Homebrew/extend/os/requirements/java_requirement.rb @@ -0,0 +1,7 @@ +require "requirements/java_requirement" + +if OS.mac? + require "extend/os/mac/requirements/java_requirement" +elsif OS.linux? + require "extend/os/linux/requirements/java_requirement" +end diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index 33fc012299..fa9b6439e2 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -2,28 +2,12 @@ require "language/java" class JavaRequirement < Requirement fatal true - cask "java" download "http://www.oracle.com/technetwork/java/javase/downloads/index.html" satisfy build_env: false do - next false unless File.executable? "/usr/libexec/java_home" - - args = %w[--failfast] - args << "--version" << @version.to_s if @version - @java_home = Utils.popen_read("/usr/libexec/java_home", *args).chomp - $?.success? - end - - env do - java_home = Pathname.new(@java_home) - ENV["JAVA_HOME"] = java_home - ENV.prepend_path "PATH", java_home/"bin" - if (java_home/"include").exist? # Oracle JVM - ENV.append_to_cflags "-I#{java_home}/include" - ENV.append_to_cflags "-I#{java_home}/include/darwin" - else # Apple JVM - ENV.append_to_cflags "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" - end + setup_java + next false unless @java + next true end def initialize(tags) @@ -45,16 +29,86 @@ class JavaRequirement < Requirement def display_s if @version - if @version[-1] == "+" - op = ">=" - version = @version[0, @version.length-1] - else + if exact_version? op = "=" - version = @version + else + op = ">=" end - "#{name} #{op} #{version}" + "#{name} #{op} #{version_without_plus}" else name end end + + private + + 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 && jdk.installed? + javas << which("java") + javas + end + + def preferred_java + possible_javas.detect do |java| + next false unless java && java.executable? + next true unless @version + next true if satisfies_version(java) + end + end + + def env_java_common + java_home = Pathname.new(@java_home) + ENV["JAVA_HOME"] = java_home + ENV.prepend_path "PATH", java_home/"bin" + end + + def env_oracle_jdk + java_home = Pathname.new(@java_home) + ENV.append_to_cflags "-I#{java_home}/include" + ENV.append_to_cflags "-I#{java_home}/include/#{oracle_java_os}" + end + + def oracle_java_os + nil + end + + def satisfies_version(java) + java_version_s = Utils.popen_read("#{java} -version 2>&1")[/1.\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" diff --git a/Library/Homebrew/test/java_requirement_test.rb b/Library/Homebrew/test/java_requirement_test.rb new file mode 100644 index 0000000000..d0b51f92cf --- /dev/null +++ b/Library/Homebrew/test/java_requirement_test.rb @@ -0,0 +1,50 @@ +require "testing_env" +require "requirements/java_requirement" + +class JavaRequirementTests < Homebrew::TestCase + def setup + super + ENV["JAVA_HOME"] = nil + end + + def test_message + a = JavaRequirement.new([]) + assert_match(/Java is required to install this formula./, a.message) + end + + def test_inspect + a = JavaRequirement.new(%w[1.7+]) + assert_equal a.inspect, '#' + end + + def test_display_s + x = JavaRequirement.new([]) + assert_equal x.display_s, "java" + y = JavaRequirement.new(%w[1.8]) + assert_equal y.display_s, "java = 1.8" + z = JavaRequirement.new(%w[1.8+]) + assert_equal z.display_s, "java >= 1.8" + end + + def test_satisfied? + a = JavaRequirement.new(%w[1.8]) + File.stubs(:executable?).returns(false) + refute_predicate a, :satisfied? + + b = JavaRequirement.new([]) + b.stubs(:preferred_java).returns(Pathname.new("/usr/bin/java")) + assert_predicate b, :satisfied? + + c = JavaRequirement.new(%w[1.7+]) + c.stubs(:possible_javas).returns([Pathname.new("/usr/bin/java")]) + Utils.stubs(:popen_read).returns('java version "1.6.0_5"') + refute_predicate c, :satisfied? + Utils.stubs(:popen_read).returns('java version "1.8.0_5"') + assert_predicate c, :satisfied? + + d = JavaRequirement.new(%w[1.7]) + d.stubs(:possible_javas).returns([Pathname.new("/usr/bin/java")]) + Utils.stubs(:popen_read).returns('java version "1.8.0_5"') + refute_predicate d, :satisfied? + end +end diff --git a/Library/Homebrew/test/os/mac/java_requirement_test.rb b/Library/Homebrew/test/os/mac/java_requirement_test.rb new file mode 100644 index 0000000000..83c1af95ca --- /dev/null +++ b/Library/Homebrew/test/os/mac/java_requirement_test.rb @@ -0,0 +1,31 @@ +require "testing_env" +require "requirements/java_requirement" +require "fileutils" + +class OSMacJavaRequirementTests < Homebrew::TestCase + def setup + super + @java_req = JavaRequirement.new(%w[1.8]) + @tmp_java_home = mktmpdir + @tmp_pathname = Pathname.new(@tmp_java_home) + FileUtils.mkdir @tmp_pathname/"bin" + FileUtils.touch @tmp_pathname/"bin/java" + @java_req.stubs(:preferred_java).returns(@tmp_pathname/"bin/java") + @java_req.satisfied? + end + + def test_java_env_apple + ENV.expects(:prepend_path) + ENV.expects(:append_to_cflags) + @java_req.modify_build_environment + assert_equal ENV["JAVA_HOME"], @tmp_java_home + end + + def test_java_env_oracle + FileUtils.mkdir @tmp_pathname/"include" + ENV.expects(:prepend_path) + ENV.expects(:append_to_cflags).twice + @java_req.modify_build_environment + assert_equal ENV["JAVA_HOME"], @tmp_java_home + end +end From c49b97dd9c4d65a68494a467d542a42528ea9b38 Mon Sep 17 00:00:00 2001 From: "Bob W. Hogg" Date: Wed, 15 Feb 2017 21:47:08 -0800 Subject: [PATCH 2/2] Code review cleanups --- .../extend/os/linux/requirements/java_requirement.rb | 5 +---- .../extend/os/mac/requirements/java_requirement.rb | 7 +------ Library/Homebrew/requirements/java_requirement.rb | 4 ++++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb index c8cbabb0d9..7816f6b6f6 100644 --- a/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb +++ b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb @@ -4,11 +4,8 @@ class JavaRequirement < Requirement default_formula "jdk" env do - next unless @java_home env_java_common - if (Pathname.new(@java_home)/"include").exist? # Oracle JVM - env_oracle_jdk - end + env_oracle_jdk end private diff --git a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb index 9c60aff952..451e0001b5 100644 --- a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb +++ b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb @@ -3,12 +3,7 @@ class JavaRequirement env do env_java_common - java_home = Pathname.new(@java_home) - if (java_home/"include").exist? # Oracle JVM - env_oracle_jdk - else # Apple JVM - env_apple - end + env_oracle_jdk || env_apple end private diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index fa9b6439e2..010b7dbc9e 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -83,15 +83,19 @@ class JavaRequirement < Requirement 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