| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 21:57:52 -05:00
										 |  |  | require "compilers" | 
					
						
							| 
									
										
										
										
											2016-07-29 20:31:32 -06:00
										 |  |  | require "development_tools" | 
					
						
							| 
									
										
										
										
											2013-11-27 17:29:06 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  | # Homebrew extends Ruby's `ENV` to make our code more readable. | 
					
						
							|  |  |  | # Implemented in {SharedEnvExtension} and either {Superenv} or | 
					
						
							|  |  |  | # {Stdenv} (depending on the build mode). | 
					
						
							|  |  |  | # @see Superenv | 
					
						
							|  |  |  | # @see Stdenv | 
					
						
							| 
									
										
										
										
											2018-10-03 21:03:22 +00:00
										 |  |  | # @see https://www.rubydoc.info/stdlib/Env Ruby's ENV API | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  | module SharedEnvExtension | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 21:57:52 -05:00
										 |  |  |   include CompilerConstants | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-11 17:53:00 +01:00
										 |  |  |   CC_FLAG_VARS = %w[CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS].freeze | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private_constant :CC_FLAG_VARS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-11 17:53:00 +01:00
										 |  |  |   FC_FLAG_VARS = %w[FCFLAGS FFLAGS].freeze | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private_constant :FC_FLAG_VARS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-26 14:10:24 -05:00
										 |  |  |   SANITIZED_VARS = %w[
 | 
					
						
							| 
									
										
										
										
											2017-01-16 20:35:56 +00:00
										 |  |  |     CDPATH CLICOLOR_FORCE | 
					
						
							| 
									
										
										
										
											2014-05-26 14:10:24 -05:00
										 |  |  |     CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH | 
					
						
							|  |  |  |     CC CXX OBJC OBJCXX CPP MAKE LD LDSHARED | 
					
						
							|  |  |  |     CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS | 
					
						
							|  |  |  |     MACOSX_DEPLOYMENT_TARGET SDKROOT DEVELOPER_DIR | 
					
						
							|  |  |  |     CMAKE_PREFIX_PATH CMAKE_INCLUDE_PATH CMAKE_FRAMEWORK_PATH | 
					
						
							| 
									
										
										
										
											2016-02-19 23:38:32 +00:00
										 |  |  |     GOBIN GOPATH GOROOT PERL_MB_OPT PERL_MM_OPT | 
					
						
							| 
									
										
										
										
											2018-08-14 11:45:40 -07:00
										 |  |  |     LIBRARY_PATH LD_LIBRARY_PATH LD_PRELOAD LD_RUN_PATH | 
					
						
							| 
									
										
										
										
											2016-09-11 17:53:00 +01:00
										 |  |  |   ].freeze | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private_constant :SANITIZED_VARS | 
					
						
							| 
									
										
										
										
											2014-05-26 14:10:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-17 22:45:55 -08:00
										 |  |  |   sig { | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |     params( | 
					
						
							| 
									
										
										
										
											2021-02-26 05:10:32 +00:00
										 |  |  |       formula:         T.nilable(Formula), | 
					
						
							|  |  |  |       cc:              T.nilable(String), | 
					
						
							|  |  |  |       build_bottle:    T.nilable(T::Boolean), | 
					
						
							|  |  |  |       bottle_arch:     T.nilable(String), | 
					
						
							|  |  |  |       testing_formula: T::Boolean, | 
					
						
							| 
									
										
										
										
											2022-07-26 17:18:01 +01:00
										 |  |  |       debug_symbols:   T.nilable(T::Boolean), | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |     ).void | 
					
						
							| 
									
										
										
										
											2021-01-17 22:45:55 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-07-30 11:10:26 +01:00
										 |  |  |   def setup_build_environment(formula: nil, cc: nil, build_bottle: false, bottle_arch: nil, testing_formula: false, | 
					
						
							|  |  |  |                               debug_symbols: false) | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  |     @formula = formula | 
					
						
							| 
									
										
										
										
											2020-07-28 02:04:50 +02:00
										 |  |  |     @cc = cc | 
					
						
							|  |  |  |     @build_bottle = build_bottle | 
					
						
							|  |  |  |     @bottle_arch = bottle_arch | 
					
						
							| 
									
										
										
										
											2022-07-26 17:18:01 +01:00
										 |  |  |     @debug_symbols = debug_symbols | 
					
						
							| 
									
										
										
										
											2014-09-18 16:43:56 -05:00
										 |  |  |     reset | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private :setup_build_environment | 
					
						
							| 
									
										
										
										
											2021-04-29 17:46:47 +01:00
										 |  |  |   alias generic_shared_setup_build_environment setup_build_environment | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { void } | 
					
						
							| 
									
										
										
										
											2014-05-26 14:10:24 -05:00
										 |  |  |   def reset | 
					
						
							|  |  |  |     SANITIZED_VARS.each { |k| delete(k) } | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private :reset | 
					
						
							| 
									
										
										
										
											2014-05-26 14:10:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   def remove_cc_etc | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     keys = %w[CC CXX OBJC OBJCXX LD CPP CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS] | 
					
						
							| 
									
										
										
										
											2021-12-23 14:49:05 -05:00
										 |  |  |     keys.to_h { |key| [key, delete(key)] } | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(newflags: String).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def append_to_cflags(newflags) | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     append(CC_FLAG_VARS, newflags) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(val: T.any(Regexp, String)).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def remove_from_cflags(val) | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     remove CC_FLAG_VARS, val | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(value: String).void } | 
					
						
							| 
									
										
										
										
											2018-07-12 12:14:44 -05:00
										 |  |  |   def append_to_cccfg(value) | 
					
						
							| 
									
										
										
										
											2018-07-12 19:59:06 +01:00
										 |  |  |     append("HOMEBREW_CCCFG", value, "") | 
					
						
							| 
									
										
										
										
											2018-07-12 12:14:44 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(keys: T.any(String, T::Array[String]), value: T.untyped, separator: String).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def append(keys, value, separator = " ") | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     value = value.to_s | 
					
						
							|  |  |  |     Array(keys).each do |key| | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |       old_value = self[key] | 
					
						
							| 
									
										
										
										
											2020-12-01 17:04:59 +00:00
										 |  |  |       self[key] = if old_value.blank? | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |         value | 
					
						
							| 
									
										
										
										
											2014-07-18 11:43:37 -05:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |         old_value + separator + value | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(keys: T.any(String, T::Array[String]), value: T.untyped, separator: String).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def prepend(keys, value, separator = " ") | 
					
						
							| 
									
										
										
										
											2013-08-26 15:02:51 -05:00
										 |  |  |     value = value.to_s | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     Array(keys).each do |key| | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |       old_value = self[key] | 
					
						
							| 
									
										
										
										
											2020-12-01 17:04:59 +00:00
										 |  |  |       self[key] = if old_value.blank? | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         value | 
					
						
							| 
									
										
										
										
											2014-07-18 11:43:37 -05:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |         value + separator + old_value | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-08-19 17:21:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-06 14:17:57 +11:00
										 |  |  |   sig { params(key: String, path: T.any(String, Pathname)).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def append_path(key, path) | 
					
						
							| 
									
										
										
										
											2017-04-27 10:44:44 +02:00
										 |  |  |     self[key] = PATH.new(self[key]).append(path) | 
					
						
							| 
									
										
										
										
											2013-08-19 17:21:13 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # Prepends a directory to `PATH`. | 
					
						
							|  |  |  |   # Is the formula struggling to find the pkgconfig file? Point it to it. | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # This is done automatically for keg-only formulae. | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # <pre>ENV.prepend_path "PKG_CONFIG_PATH", "#{Formula["glib"].opt_lib}/pkgconfig"</pre> | 
					
						
							| 
									
										
										
										
											2017-03-10 07:28:55 -08:00
										 |  |  |   # Prepending a system path such as /usr/bin is a no-op so that requirements | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # don't accidentally override superenv shims or formulae's `bin` directories. | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # <pre>ENV.prepend_path "PATH", which("emacs").dirname</pre> | 
					
						
							| 
									
										
										
										
											2020-12-06 14:17:57 +11:00
										 |  |  |   sig { params(key: String, path: T.any(String, Pathname)).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def prepend_path(key, path) | 
					
						
							| 
									
										
										
										
											2017-03-10 07:28:55 -08:00
										 |  |  |     return if %w[/usr/bin /bin /usr/sbin /sbin].include? path.to_s | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 10:44:44 +02:00
										 |  |  |     self[key] = PATH.new(self[key]).prepend(path) | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-08-19 17:21:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(key: String, path: T.any(String, Pathname)).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def prepend_create_path(key, path) | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |     path = Pathname(path) | 
					
						
							| 
									
										
										
										
											2014-01-04 12:49:01 +00:00
										 |  |  |     path.mkpath | 
					
						
							|  |  |  |     prepend_path key, path | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(keys: T.any(String, T::Array[String]), value: T.untyped).void } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def remove(keys, value) | 
					
						
							| 
									
										
										
										
											2016-11-13 23:37:40 +01:00
										 |  |  |     return if value.nil? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     Array(keys).each do |key| | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |       old_value = self[key] | 
					
						
							|  |  |  |       next if old_value.nil? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |       new_value = old_value.sub(value, "") | 
					
						
							|  |  |  |       if new_value.empty? | 
					
						
							|  |  |  |         delete(key) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         self[key] = new_value | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-11-13 23:37:40 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cc | 
					
						
							|  |  |  |     self["CC"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cxx | 
					
						
							|  |  |  |     self["CXX"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cflags | 
					
						
							|  |  |  |     self["CFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cxxflags | 
					
						
							|  |  |  |     self["CXXFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cppflags | 
					
						
							|  |  |  |     self["CPPFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def ldflags | 
					
						
							|  |  |  |     self["LDFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def fc | 
					
						
							|  |  |  |     self["FC"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def fflags | 
					
						
							|  |  |  |     self["FFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def fcflags | 
					
						
							|  |  |  |     self["FCFLAGS"] | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # Outputs the current compiler. | 
					
						
							| 
									
										
										
										
											2018-07-05 20:15:57 +01:00
										 |  |  |   # <pre># Do something only for the system clang | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # if ENV.compiler == :clang | 
					
						
							|  |  |  |   #   # modify CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS in one go: | 
					
						
							|  |  |  |   #   ENV.append_to_cflags "-I ./missing/includes" | 
					
						
							|  |  |  |   # end</pre> | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.any(Symbol, String)) } | 
					
						
							| 
									
										
										
										
											2013-08-24 14:03:16 -07:00
										 |  |  |   def compiler | 
					
						
							| 
									
										
										
										
											2020-07-28 02:04:50 +02:00
										 |  |  |     @compiler ||= if (cc = @cc) | 
					
						
							| 
									
										
										
										
											2020-09-18 22:31:23 +02:00
										 |  |  |       warn_about_non_apple_gcc(cc) if cc.match?(GNU_GCC_REGEXP) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  |       fetch_compiler(cc, "--cc") | 
					
						
							|  |  |  |     elsif (cc = homebrew_cc) | 
					
						
							| 
									
										
										
										
											2020-09-18 22:31:23 +02:00
										 |  |  |       warn_about_non_apple_gcc(cc) if cc.match?(GNU_GCC_REGEXP) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  |       compiler = fetch_compiler(cc, "HOMEBREW_CC") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if @formula | 
					
						
							|  |  |  |         compilers = [compiler] + CompilerSelector.compilers | 
					
						
							|  |  |  |         compiler = CompilerSelector.select_for(@formula, compilers) | 
					
						
							| 
									
										
										
										
											2013-08-22 22:29:49 -07:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       compiler | 
					
						
							|  |  |  |     elsif @formula | 
					
						
							|  |  |  |       CompilerSelector.select_for(@formula) | 
					
						
							| 
									
										
										
										
											2013-08-24 14:03:16 -07:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-04-25 18:01:03 +01:00
										 |  |  |       DevelopmentTools.default_compiler | 
					
						
							| 
									
										
										
										
											2013-08-24 14:03:16 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.any(String, Pathname)) } | 
					
						
							| 
									
										
										
										
											2014-06-18 16:12:32 -04:00
										 |  |  |   def determine_cc | 
					
						
							|  |  |  |     COMPILER_SYMBOL_MAP.invert.fetch(compiler, compiler) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   private :determine_cc | 
					
						
							| 
									
										
										
										
											2014-06-18 16:12:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-22 18:43:01 -05:00
										 |  |  |   COMPILERS.each do |compiler| | 
					
						
							|  |  |  |     define_method(compiler) do | 
					
						
							|  |  |  |       @compiler = compiler | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       send(:cc=, send(:determine_cc)) | 
					
						
							|  |  |  |       send(:cxx=, send(:determine_cxx)) | 
					
						
							| 
									
										
										
										
											2014-06-18 16:12:32 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { void } | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   def fortran | 
					
						
							| 
									
										
										
										
											2015-12-18 17:04:58 +01:00
										 |  |  |     # Ignore repeated calls to this function as it will misleadingly warn about | 
					
						
							|  |  |  |     # building with an alternative Fortran compiler without optimization flags, | 
					
						
							|  |  |  |     # despite it often being the Homebrew-provided one set up in the first call. | 
					
						
							|  |  |  |     return if @fortran_setup_done | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-18 17:04:58 +01:00
										 |  |  |     @fortran_setup_done = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 19:07:10 -05:00
										 |  |  |     flags = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 19:00:19 -05:00
										 |  |  |     if fc | 
					
						
							| 
									
										
										
										
											2020-07-06 15:30:57 -04:00
										 |  |  |       ohai "Building with an alternative Fortran compiler", "This is unsupported." | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       self["F77"] ||= fc | 
					
						
							| 
									
										
										
										
											2014-02-02 12:57:46 -06:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if (gfortran = which("gfortran", (HOMEBREW_PREFIX/"bin").to_s)) | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |         ohai "Using Homebrew-provided Fortran compiler" | 
					
						
							| 
									
										
										
										
											2017-04-27 10:44:44 +02:00
										 |  |  |       elsif (gfortran = which("gfortran", PATH.new(ORIGINAL_PATHS))) | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |         ohai "Using a Fortran compiler found at #{gfortran}" | 
					
						
							| 
									
										
										
										
											2014-02-02 12:57:46 -06:00
										 |  |  |       end | 
					
						
							|  |  |  |       if gfortran | 
					
						
							|  |  |  |         puts "This may be changed by setting the FC environment variable." | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         self["FC"] = self["F77"] = gfortran | 
					
						
							| 
									
										
										
										
											2014-02-02 12:57:46 -06:00
										 |  |  |         flags = FC_FLAG_VARS | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-08-30 19:07:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     flags.each { |key| self[key] = cflags } | 
					
						
							|  |  |  |     set_cpu_flags(flags) | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-06-04 10:18:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-06 21:27:15 +00:00
										 |  |  |   # @private | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(Symbol) } | 
					
						
							| 
									
										
										
										
											2019-01-06 21:27:15 +00:00
										 |  |  |   def effective_arch | 
					
						
							| 
									
										
										
										
											2020-07-28 02:04:50 +02:00
										 |  |  |     if @build_bottle && @bottle_arch | 
					
						
							|  |  |  |       @bottle_arch.to_sym | 
					
						
							| 
									
										
										
										
											2019-01-06 21:27:15 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |       Hardware.oldest_cpu | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # @private | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(name: String).returns(Formula) } | 
					
						
							| 
									
										
										
										
											2015-06-21 21:18:23 -04:00
										 |  |  |   def gcc_version_formula(name) | 
					
						
							|  |  |  |     version = name[GNU_GCC_REGEXP, 1] | 
					
						
							| 
									
										
										
										
											2017-02-03 10:47:44 -08:00
										 |  |  |     gcc_version_name = "gcc@#{version}" | 
					
						
							| 
									
										
										
										
											2014-04-29 08:51:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-22 21:00:40 -04:00
										 |  |  |     gcc = Formulary.factory("gcc") | 
					
						
							| 
									
										
										
										
											2015-09-12 11:47:14 -07:00
										 |  |  |     if gcc.version_suffix == version | 
					
						
							| 
									
										
										
										
											2015-06-22 21:00:40 -04:00
										 |  |  |       gcc | 
					
						
							| 
									
										
										
										
											2014-04-30 12:38:22 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2015-06-21 21:18:24 -04:00
										 |  |  |       Formulary.factory(gcc_version_name) | 
					
						
							| 
									
										
										
										
											2014-04-29 08:51:56 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-04-19 09:11:52 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 10:56:24 +01:00
										 |  |  |   # @private | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(name: String).void } | 
					
						
							| 
									
										
										
										
											2015-06-21 21:18:23 -04:00
										 |  |  |   def warn_about_non_apple_gcc(name) | 
					
						
							| 
									
										
										
										
											2013-06-04 10:18:14 -05:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2015-06-21 21:18:23 -04:00
										 |  |  |       gcc_formula = gcc_version_formula(name) | 
					
						
							| 
									
										
										
										
											2015-06-22 21:08:27 -04:00
										 |  |  |     rescue FormulaUnavailableError => e | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |       raise <<~EOS | 
					
						
							|  |  |  |         Homebrew GCC requested, but formula #{e.name} not found! | 
					
						
							| 
									
										
										
										
											2015-06-21 21:18:23 -04:00
										 |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     return if gcc_formula.opt_prefix.exist? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |     raise <<~EOS | 
					
						
							|  |  |  |       The requested Homebrew GCC was not installed. You must: | 
					
						
							|  |  |  |         brew install #{gcc_formula.full_name} | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-06-04 10:18:14 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-05-14 00:00:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { void } | 
					
						
							| 
									
										
										
										
											2014-05-14 00:00:59 -05:00
										 |  |  |   def permit_arch_flags; end | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 20:15:57 +01:00
										 |  |  |   # @private | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(cc: T.any(Symbol, String)).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2018-07-05 20:15:57 +01:00
										 |  |  |   def compiler_any_clang?(cc = compiler) | 
					
						
							|  |  |  |     %w[clang llvm_clang].include?(cc.to_s) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(_flags: T::Array[String], _map: T::Hash[Symbol, String]).void } | 
					
						
							|  |  |  |   def set_cpu_flags(_flags, _map = {}); end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { params(val: T.any(String, Pathname)).returns(String) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cc=(val) | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  |     self["CC"] = self["OBJC"] = val.to_s | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(val: T.any(String, Pathname)).returns(String) } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def cxx=(val) | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  |     self["CXX"] = self["OBJCXX"] = val.to_s | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2014-05-18 14:34:31 -05:00
										 |  |  |   def homebrew_cc | 
					
						
							|  |  |  |     self["HOMEBREW_CC"] | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { params(value: String, source: String).returns(Symbol) } | 
					
						
							| 
									
										
										
										
											2014-09-18 15:50:54 -05:00
										 |  |  |   def fetch_compiler(value, source) | 
					
						
							|  |  |  |     COMPILER_SYMBOL_MAP.fetch(value) do |other| | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when GNU_GCC_REGEXP | 
					
						
							|  |  |  |         other | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         raise "Invalid value for #{source}: #{other}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-12-09 10:37:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |   sig { void } | 
					
						
							| 
									
										
										
										
											2015-12-09 10:37:49 -05:00
										 |  |  |   def check_for_compiler_universal_support | 
					
						
							| 
									
										
										
										
											2020-11-20 14:20:38 +01:00
										 |  |  |     raise "Non-Apple GCC can't build universal binaries" if homebrew_cc&.match?(GNU_GCC_REGEXP) | 
					
						
							| 
									
										
										
										
											2015-12-09 10:37:49 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-08-19 12:32:59 -05:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2016-08-16 13:47:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/extend/ENV/shared" |