aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob W. Hogg2016-12-04 18:43:46 -0800
committerBob W. Hogg2017-02-15 21:35:26 -0800
commit5a214de68d52eef0bbf99f740dc22c721dd02233 (patch)
tree6f52771110b75e6c4dbb1bf61cc65b8bf6dfc032
parent5a2a0638028ee49991e404c1bd6397c10659474b (diff)
downloadbrew-5a214de68d52eef0bbf99f740dc22c721dd02233.tar.bz2
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.)
-rw-r--r--Library/Homebrew/extend/os/linux/requirements/java_requirement.rb19
-rw-r--r--Library/Homebrew/extend/os/mac/requirements/java_requirement.rb40
-rw-r--r--Library/Homebrew/extend/os/requirements/java_requirement.rb7
-rw-r--r--Library/Homebrew/requirements/java_requirement.rb104
-rw-r--r--Library/Homebrew/test/java_requirement_test.rb50
-rw-r--r--Library/Homebrew/test/os/mac/java_requirement_test.rb31
6 files changed, 226 insertions, 25 deletions
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 000000000..c8cbabb0d
--- /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 000000000..9c60aff95
--- /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 000000000..b512ada47
--- /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 33fc01229..fa9b6439e 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 000000000..d0b51f92c
--- /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, '#<JavaRequirement: "java" [] version="1.7+">'
+ 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 000000000..83c1af95c
--- /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