| 
									
										
										
										
											2021-09-11 01:00:23 +01:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  | module Language | 
					
						
							| 
									
										
										
										
											2020-08-17 18:58:40 +02:00
										 |  |  |   # Helper functions for Java formulae. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |   module Java | 
					
						
							| 
									
										
										
										
											2021-09-11 01:00:23 +01:00
										 |  |  |     sig { params(version: T.nilable(String)).returns(T.nilable(Formula)) } | 
					
						
							| 
									
										
										
										
											2020-06-19 11:46:31 +01:00
										 |  |  |     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? | 
					
						
							| 
									
										
										
										
											2020-08-31 10:59:27 -07:00
										 |  |  |           major = f.any_installed_version.major | 
					
						
							| 
									
										
										
										
											2020-06-19 11:46:31 +01:00
										 |  |  |           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)) } | 
					
						
							| 
									
										
										
										
											2018-11-27 11:52:30 -08:00
										 |  |  |     def self.java_home(version = nil) | 
					
						
							| 
									
										
										
										
											2021-01-25 09:18:10 +00:00
										 |  |  |       find_openjdk_formula(version)&.opt_libexec | 
					
						
							| 
									
										
										
										
											2018-11-27 11:52:30 -08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 01:00:23 +01:00
										 |  |  |     sig { params(version: T.nilable(String)).returns(String) } | 
					
						
							| 
									
										
										
										
											2018-11-27 11:52:30 -08:00
										 |  |  |     def self.java_home_shell(version = nil) | 
					
						
							|  |  |  |       java_home(version).to_s | 
					
						
							| 
									
										
										
										
											2015-03-12 23:35:24 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-06-19 11:55:05 +01:00
										 |  |  |     private_class_method :java_home_shell | 
					
						
							| 
									
										
										
										
											2015-03-12 23:35:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 }) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def self.java_home_env(version = nil) | 
					
						
							| 
									
										
										
										
											2018-11-27 11:52:30 -08:00
										 |  |  |       { JAVA_HOME: java_home_shell(version) } | 
					
						
							| 
									
										
										
										
											2015-03-12 23:35:24 +08:00
										 |  |  |     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 }) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def self.overridable_java_home_env(version = nil) | 
					
						
							| 
									
										
										
										
											2018-11-27 11:52:30 -08:00
										 |  |  |       { JAVA_HOME: "${JAVA_HOME:-#{java_home_shell(version)}}" } | 
					
						
							| 
									
										
										
										
											2015-02-26 22:36:04 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2021-02-02 18:36:44 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/language/java" |