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
|
|
|
|
|
|
|
|
["#{prefix_bin} is not in your PATH",
|
2013-07-15 19:28:10 -07:00
|
|
|
"You can amend this by altering your ~/.bashrc file"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_manpages
|
|
|
|
# Check for man pages that aren't in share/man
|
|
|
|
return unless (f.prefix+'man').directory?
|
|
|
|
|
|
|
|
['A top-level "man" directory was found.',
|
|
|
|
<<-EOS.undent
|
|
|
|
Homebrew requires that man pages live under share.
|
2013-07-17 11:21:58 -05:00
|
|
|
This can often be fixed by passing "--mandir=\#{man}" to configure.
|
2013-07-15 19:28:10 -07:00
|
|
|
EOS
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_infopages
|
|
|
|
# Check for info pages that aren't in share/info
|
|
|
|
return unless (f.prefix+'info').directory?
|
|
|
|
|
|
|
|
['A top-level "info" directory was found.',
|
|
|
|
<<-EOS.undent
|
|
|
|
Homebrew suggests that info pages live under share.
|
2013-07-17 11:21:58 -05:00
|
|
|
This can often be fixed by passing "--infodir=\#{info}" to configure.
|
2013-07-15 19:28:10 -07:00
|
|
|
EOS
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_jars
|
|
|
|
return unless f.lib.directory?
|
2014-05-21 10:54:24 -05:00
|
|
|
jars = f.lib.children.select { |g| g.extname == ".jar" }
|
2013-07-15 19:28:10 -07:00
|
|
|
return if jars.empty?
|
|
|
|
|
2013-07-16 20:50:34 -07:00
|
|
|
["JARs were installed to \"#{f.lib}\".",
|
2013-07-15 19:28:10 -07:00
|
|
|
<<-EOS.undent
|
|
|
|
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".
|
2013-08-05 13:31:35 -07:00
|
|
|
See "activemq", "jruby", etc. for examples.
|
|
|
|
The offending files are:
|
2013-10-19 21:25:31 -05:00
|
|
|
#{jars * "\n "}
|
2013-07-15 19:28:10 -07:00
|
|
|
EOS
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_non_libraries
|
|
|
|
return unless f.lib.directory?
|
|
|
|
|
|
|
|
valid_extensions = %w(.a .dylib .framework .jnilib .la .o .so
|
|
|
|
.jar .prl .pm .sh)
|
|
|
|
non_libraries = f.lib.children.select do |g|
|
|
|
|
next if g.directory?
|
|
|
|
not valid_extensions.include? g.extname
|
|
|
|
end
|
|
|
|
return if non_libraries.empty?
|
|
|
|
|
2013-07-16 20:50:34 -07:00
|
|
|
["Non-libraries were installed to \"#{f.lib}\".",
|
2013-07-15 19:28:10 -07:00
|
|
|
<<-EOS.undent
|
2013-10-19 21:30:57 -05:00
|
|
|
Installing non-libraries to "lib" is discouraged.
|
2013-07-15 19:28:10 -07:00
|
|
|
The offending files are:
|
2013-10-19 21:25:31 -05:00
|
|
|
#{non_libraries * "\n "}
|
2013-07-15 19:28:10 -07:00
|
|
|
EOS
|
|
|
|
]
|
|
|
|
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?
|
|
|
|
|
|
|
|
["Non-executables were installed to \"#{bin}\".",
|
|
|
|
<<-EOS.undent
|
|
|
|
The offending files are:
|
2013-10-19 21:25:31 -05:00
|
|
|
#{non_exes * "\n "}
|
2013-07-15 19:28:10 -07:00
|
|
|
EOS
|
|
|
|
]
|
|
|
|
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?
|
|
|
|
|
|
|
|
["Generic binaries were installed to \"#{bin}\".",
|
|
|
|
<<-EOS.undent
|
|
|
|
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.
|
|
|
|
|
|
|
|
The offending files are:
|
|
|
|
#{generics * "\n "}
|
|
|
|
EOS
|
|
|
|
]
|
|
|
|
end
|
2014-10-01 23:32:53 -05:00
|
|
|
|
|
|
|
def check_shadowed_headers
|
|
|
|
return if f.keg_only? || !f.include.directory?
|
|
|
|
|
|
|
|
files = relative_glob(f.include, "**/*.h")
|
|
|
|
files &= relative_glob("#{MacOS.sdk_path}/usr/include", "**/*.h")
|
|
|
|
files.map! { |p| File.join(f.include, p) }
|
|
|
|
|
|
|
|
return if files.empty?
|
|
|
|
|
|
|
|
["Header files that shadow system header files were installed to \"#{f.include}\".",
|
|
|
|
"The offending files are: \n #{files * "\n "}"]
|
|
|
|
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?
|
|
|
|
|
|
|
|
["easy-install.pth files were found in #{pth_found.join(", ")}.",
|
|
|
|
<<-EOS.undent
|
|
|
|
These .pth files are likely to cause link conflicts. Please
|
|
|
|
invoke setup.py with options --single-version-externally-managed
|
|
|
|
--record=install.txt.
|
|
|
|
EOS
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
2014-10-01 23:32:53 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def relative_glob(dir, pattern)
|
|
|
|
Dir.chdir(dir) { Dir[pattern] }
|
|
|
|
end
|
2013-07-15 19:28:10 -07:00
|
|
|
end
|