87 lines
2.6 KiB
Ruby
Raw Permalink Normal View History

2021-09-11 01:00:23 +01:00
# typed: strict
# frozen_string_literal: true
module Language
2020-08-17 18:58:40 +02:00
# Helper functions for Java formulae.
#
# @api public
module Java
2021-09-11 01:00:23 +01:00
sig { params(version: T.nilable(String)).returns(T.nilable(Formula)) }
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?
2025-02-16 22:20:37 -08:00
major = T.must(f.any_installed_version).major
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
2024-10-17 12:03:10 -04:00
# Returns the directory of the newest matching OpenJDK installation or
# `nil` if none is available. When used in a {Formula}, there should be
# a dependency and corresponding `version` for reproducible output.
#
# @api public
# @param version OpenJDK version constraint which can be specific
# (e.g. `"21"`) or a lower-bounded range (e.g. `"21+"`)
2021-09-11 01:00:23 +01:00
sig { params(version: T.nilable(String)).returns(T.nilable(Pathname)) }
def self.java_home(version = nil)
2021-01-25 09:18:10 +00:00
find_openjdk_formula(version)&.opt_libexec
end
2021-09-11 01:00:23 +01:00
sig { params(version: T.nilable(String)).returns(String) }
def self.java_home_shell(version = nil)
java_home(version).to_s
end
private_class_method :java_home_shell
2024-10-17 12:03:10 -04:00
# Returns a `JAVA_HOME` environment variable to use a specific OpenJDK.
# Usually combined with either {Pathname#write_env_script} or
# {Pathname#env_script_all_files}.
#
# ### Example
#
# Use `openjdk@21` for all commands:
#
# ```ruby
# bin.env_script_all_files libexec/"bin", Language::Java.java_home_env("21")
# ```
#
# @api public
2021-09-11 01:00:23 +01:00
sig { params(version: T.nilable(String)).returns({ JAVA_HOME: String }) }
def self.java_home_env(version = nil)
{ JAVA_HOME: java_home_shell(version) }
end
2024-10-17 12:03:10 -04:00
# Returns a `JAVA_HOME` environment variable to use a default OpenJDK.
# Unlike {.java_home_env} the OpenJDK can be overridden at runtime.
#
# ### Example
#
# Use latest `openjdk` as default:
#
# ```ruby
# bin.env_script_all_files libexec/"bin", Language::Java.overridable_java_home_env
# ```
#
# @api public
2021-09-11 01:00:23 +01:00
sig { params(version: T.nilable(String)).returns({ JAVA_HOME: String }) }
def self.overridable_java_home_env(version = nil)
{ JAVA_HOME: "${JAVA_HOME:-#{java_home_shell(version)}}" }
end
end
end
2021-02-02 18:36:44 +11:00
require "extend/os/language/java"