Skip to content

Instantly share code, notes, and snippets.

@gitkaste
Forked from mxcl/install_homebrew.markdown
Created November 13, 2010 09:04
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save gitkaste/675200 to your computer and use it in GitHub Desktop.
fixing an aclocal issue
#!/usr/bin/ruby
#
# This script installs to /usr/local only. To install elsewhere you can just
# untar http://github.com/mxcl/homebrew/tarball/master anywhere you like.
#
#
# 30th March 2010:
# Added a check to make sure user is in the staff group. This was a problem
# for me, and I think it was due to me migrating my account over several
# versions of OS X. I cannot verify that for sure, and it was tested on
# 10.6.2 using the Directory Service command line utility and my laptop.
#
# My assumptions are:
# - you are running OS X 10.6.x
# - your machine is not managed as part of a group using networked
# Directory Services
# - you have not recently killed any baby seals or kittens
#
# 14th March 2010:
# Adapted CodeButler's fork: http://gist.github.com/331512
#
module Tty extend self
def blue; bold 34; end
def white; bold 39; end
def red; underline 31; end
def reset; escape 0; end
def bold n; escape "1;#{n}" end
def underline n; escape "4;#{n}" end
def escape n; "\033[#{n}m" if STDOUT.tty? end
end
class Array
def shell_s
cp = dup
first = cp.shift
cp.map{ |arg| arg.gsub " ", "\\ " }.unshift(first) * " "
end
end
def ohai *args
puts "#{Tty.blue}==>#{Tty.white} #{args.shell_s}#{Tty.reset}"
end
def warn warning
puts "#{Tty.red}Warning#{Tty.reset}: #{warning.chomp}"
end
def system *args
abort "Failed during: #{args.shell_s}" unless Kernel.system *args
end
def sudo *args
args = if args.length > 1
args.unshift "/usr/bin/sudo"
else
"/usr/bin/sudo #{args}"
end
ohai *args
system *args
end
def getc # NOTE only tested on OS X
system "/bin/stty raw -echo"
if RUBY_VERSION >= '1.8.7'
STDIN.getbyte
else
STDIN.getc
end
ensure
system "/bin/stty -raw echo"
end
####################################################################### script
abort "/usr/local/.git already exists!" if File.directory? "/usr/local/.git"
abort "Don't run this as root!" if Process.uid == 0
abort <<-EOABORT unless `groups`.split.include? "staff"
This script requires the user #{ENV['USER']} to be in the staff group. If this
sucks for you then you can install Homebrew in your home directory or however
you please; please refer to the website. If you still want to use this script
the following command should work:
dscl /Local/Default -append /Groups/staff GroupMembership $USER
EOABORT
ohai "This script will install:"
puts "/usr/local/bin/brew"
puts "/usr/local/Library/Formula/..."
puts "/usr/local/Library/Homebrew/..."
chmods = %w( . bin etc include lib lib/pkgconfig Library sbin share var share/locale share/man
share/man/man1 share/man/man2 share/man/man3 share/man/man4
share/man/man5 share/man/man6 share/man/man7 share/man/man8
share/info share/doc share/aclocal ).
map{ |d| "/usr/local/#{d}" }.
select{ |d| File.directory? d and not File.writable? d }
chgrps = chmods.reject{ |d| File.stat(d).grpowned? }
unless chmods.empty?
ohai "The following directories will be made group writable:"
puts *chmods
end
unless chgrps.empty?
ohai "The following directories will have their group set to #{Tty.underline 39}staff#{Tty.reset}:"
puts *chgrps
end
if STDIN.tty?
puts
puts "Press enter to continue"
abort unless getc == 13
end
if File.directory? "/usr/local"
sudo "/bin/chmod", "g+w", *chmods unless chmods.empty?
# all admin users are in staff
sudo "/usr/bin/chgrp", "staff", *chgrps unless chgrps.empty?
else
sudo "/bin/mkdir /usr/local"
sudo "/bin/chmod g+w /usr/local"
# the group is set to wheel by default for some reason
sudo "/usr/bin/chgrp staff /usr/local"
end
Dir.chdir "/usr/local" do
ohai "Downloading and Installing Homebrew..."
# -m to stop tar erroring out if it can't modify the mtime for root owned directories
# pipefail to cause the exit status from curl to propogate if it fails
system "/bin/bash -o pipefail -c '/usr/bin/curl -sSfL https://github.com/mxcl/homebrew/tarball/master | /usr/bin/tar xz -m --strip 1'"
end
sudo "/bin/bash -c 'echo /usr/local/share/aclocal >> /usr/share/aclocal/dirlist'"
ohai "Installation successful!"
warn "/usr/local/bin is not in your PATH." unless ENV['PATH'].split(':').include? '/usr/local/bin'
warn "Now install Xcode: http://developer.apple.com/technologies/xcode.html" unless Kernel.system "/usr/bin/which -s gcc"
@gitkaste
Copy link
Author

aclocal is not installable via homebrew because apple already ships it for us. On compilation of aclocal, the default search path is fixed. You can check it via aclocal --print-ac-dir (Gives /usr/share/aclocal). This is a problem for us because we set the prefix to /usr/local in our formulae, which affects --datarootdir=${PREFIX}/share and thus the placement of aclocals files $(DATAROOTDIR)/aclocal.

Effectively this means m4 files installed with libraries (quite a few actually) are lost to the build system. As http://www.gnu.org/software/hello/manual/automake/Macro-Search-Path.html explains there are ways to fix this. The right way for us to do it is to make our local aclocal dir known to the system aclocal via putting a line into the dirlist file in the system aclocal's dir. This is what this patch does.

@gitkaste
Copy link
Author

This document (https://github.com/mxcl/homebrew/wiki/installation) will need to be changed in the sections installing anywhere else, uninstalling and alternate installation style.

@mxcl
Copy link

mxcl commented Nov 14, 2010

I don't understand.

@gitkaste
Copy link
Author

aclocal only looks into the directory $(PREFIX)/share/aclocal which for the system aclocal means /usr/share/aclocal. Every package we install that has m4 files copies them to /usr/local/share/aclocal. That means we either need to copy/symlink them to the other dir or do it the right way and make our dir known by putting the line /usr/local/share/aclocal into a file /usr/share/aclocal/dirlist.

What is the part you are unclear about?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment