| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | module FormulaCellarChecks | 
					
						
							|  |  |  |   def check_PATH bin | 
					
						
							|  |  |  |     # warn the user if stuff was installed outside of their PATH | 
					
						
							|  |  |  |     return unless bin.directory? | 
					
						
							|  |  |  |     return unless bin.children.length > 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-17 09:34:43 -07:00
										 |  |  |     prefix_bin = (HOMEBREW_PREFIX/bin.basename) | 
					
						
							|  |  |  |     return unless prefix_bin.directory? | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-17 09:34:43 -07:00
										 |  |  |     prefix_bin = prefix_bin.realpath | 
					
						
							|  |  |  |     return if ORIGINAL_PATHS.include? prefix_bin | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       #{prefix_bin} is not in your PATH | 
					
						
							|  |  |  |       You can amend this by altering your ~/.bashrc file
 | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_manpages | 
					
						
							|  |  |  |     # Check for man pages that aren't in share/man | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return unless (formula.prefix+'man').directory? | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       A top-level "man" directory was found | 
					
						
							|  |  |  |       Homebrew requires that man pages live under share. | 
					
						
							|  |  |  |       This can often be fixed by passing "--mandir=\#{man}" to configure. | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_infopages | 
					
						
							|  |  |  |     # Check for info pages that aren't in share/info | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return unless (formula.prefix+'info').directory? | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       A top-level "info" directory was found | 
					
						
							|  |  |  |       Homebrew suggests that info pages live under share. | 
					
						
							|  |  |  |       This can often be fixed by passing "--infodir=\#{info}" to configure. | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_jars | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return unless formula.lib.directory? | 
					
						
							|  |  |  |     jars = formula.lib.children.select { |g| g.extname == ".jar" } | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |     return if jars.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |       JARs were installed to "#{formula.lib}" | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |       Installing JARs to "lib" can cause conflicts between packages. | 
					
						
							|  |  |  |       For Java software, it is typically better for the formula to | 
					
						
							|  |  |  |       install to "libexec" and then symlink or wrap binaries into "bin". | 
					
						
							|  |  |  |       See "activemq", "jruby", etc. for examples. | 
					
						
							|  |  |  |       The offending files are: | 
					
						
							|  |  |  |         #{jars * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_non_libraries | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return unless formula.lib.directory? | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     valid_extensions = %w(.a .dylib .framework .jnilib .la .o .so
 | 
					
						
							|  |  |  |                           .jar .prl .pm .sh) | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     non_libraries = formula.lib.children.select do |g| | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |       next if g.directory? | 
					
						
							|  |  |  |       not valid_extensions.include? g.extname | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return if non_libraries.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |       Non-libraries were installed to "#{formula.lib}" | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |       Installing non-libraries to "lib" is discouraged. | 
					
						
							|  |  |  |       The offending files are: | 
					
						
							|  |  |  |         #{non_libraries * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_non_executables bin | 
					
						
							|  |  |  |     return unless bin.directory? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     non_exes = bin.children.select { |g| g.directory? or not g.executable? } | 
					
						
							|  |  |  |     return if non_exes.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       Non-executables were installed to "#{bin}" | 
					
						
							|  |  |  |       The offending files are: | 
					
						
							|  |  |  |         #{non_exes * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-11-10 12:51:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def check_generic_executables bin | 
					
						
							|  |  |  |     return unless bin.directory? | 
					
						
							| 
									
										
										
										
											2014-05-21 09:03:51 -07:00
										 |  |  |     generic_names = %w[run service start stop] | 
					
						
							| 
									
										
										
										
											2014-05-21 10:54:24 -05:00
										 |  |  |     generics = bin.children.select { |g| generic_names.include? g.basename.to_s } | 
					
						
							| 
									
										
										
										
											2013-11-10 12:51:24 -08:00
										 |  |  |     return if generics.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       Generic binaries were installed to "#{bin}" | 
					
						
							|  |  |  |       Binaries with generic names are likely to conflict with other software, | 
					
						
							|  |  |  |       and suggest that this software should be installed to "libexec" and then | 
					
						
							|  |  |  |       symlinked as needed. | 
					
						
							| 
									
										
										
										
											2013-11-10 12:51:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |       The offending files are: | 
					
						
							|  |  |  |         #{generics * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2013-11-10 12:51:24 -08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def check_shadowed_headers | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return if formula.name == "libtool" || formula.name == "subversion" | 
					
						
							|  |  |  |     return if formula.keg_only? || !formula.include.directory? | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     files  = relative_glob(formula.include, "**/*.h") | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  |     files &= relative_glob("#{MacOS.sdk_path}/usr/include", "**/*.h") | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     files.map! { |p| File.join(formula.include, p) } | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if files.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |       Header files that shadow system header files were installed to "#{formula.include}" | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |       The offending files are: | 
					
						
							|  |  |  |         #{files * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-01 18:40:04 -07:00
										 |  |  |   def check_easy_install_pth lib | 
					
						
							|  |  |  |     pth_found = Dir["#{lib}/python{2.7,3.4}/site-packages/easy-install.pth"].map { |f| File.dirname(f) } | 
					
						
							|  |  |  |     return if pth_found.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:00 -05:00
										 |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       easy-install.pth files were found | 
					
						
							|  |  |  |       These .pth files are likely to cause link conflicts. Please invoke | 
					
						
							|  |  |  |       setup.py with options | 
					
						
							|  |  |  |         --single-version-externally-managed --record=install.txt | 
					
						
							|  |  |  |       The offending files are | 
					
						
							|  |  |  |         #{pth_found * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2014-10-01 18:40:04 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-20 19:46:29 -07:00
										 |  |  |   def check_openssl_links | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     return unless formula.prefix.directory? | 
					
						
							|  |  |  |     keg = Keg.new(formula.prefix) | 
					
						
							| 
									
										
										
										
											2014-10-19 23:58:29 -07:00
										 |  |  |     system_openssl = keg.mach_o_files.select do |obj| | 
					
						
							|  |  |  |       dlls = obj.dynamically_linked_libraries | 
					
						
							|  |  |  |       dlls.any? { |dll| /\/usr\/lib\/lib(crypto|ssl).(\d\.)*dylib/.match dll } | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return if system_openssl.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <<-EOS.undent
 | 
					
						
							|  |  |  |       object files were linked against system openssl | 
					
						
							|  |  |  |       These object files were linked against the deprecated system OpenSSL. | 
					
						
							|  |  |  |       Adding `depends_on "openssl"` to the formula may help. | 
					
						
							|  |  |  |         #{system_openssl  * "\n        "} | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:01 -05:00
										 |  |  |   def audit_installed | 
					
						
							|  |  |  |     audit_check_output(check_manpages) | 
					
						
							|  |  |  |     audit_check_output(check_infopages) | 
					
						
							|  |  |  |     audit_check_output(check_jars) | 
					
						
							|  |  |  |     audit_check_output(check_non_libraries) | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     audit_check_output(check_non_executables(formula.bin)) | 
					
						
							|  |  |  |     audit_check_output(check_generic_executables(formula.bin)) | 
					
						
							|  |  |  |     audit_check_output(check_non_executables(formula.sbin)) | 
					
						
							|  |  |  |     audit_check_output(check_generic_executables(formula.sbin)) | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:01 -05:00
										 |  |  |     audit_check_output(check_shadowed_headers) | 
					
						
							| 
									
										
										
										
											2014-10-29 22:38:49 -05:00
										 |  |  |     audit_check_output(check_easy_install_pth(formula.lib)) | 
					
						
							| 
									
										
										
										
											2014-10-20 19:46:29 -07:00
										 |  |  |     audit_check_output(check_openssl_links) | 
					
						
							| 
									
										
										
										
											2014-10-13 23:13:01 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def relative_glob(dir, pattern) | 
					
						
							| 
									
										
										
										
											2014-10-17 12:01:27 -05:00
										 |  |  |     File.directory?(dir) ? Dir.chdir(dir) { Dir[pattern] } : [] | 
					
						
							| 
									
										
										
										
											2014-10-01 23:32:53 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-07-15 19:28:10 -07:00
										 |  |  | end |