diff options
| author | Adam Vandenberg | 2012-06-27 12:09:57 -0700 | 
|---|---|---|
| committer | Adam Vandenberg | 2012-06-27 12:09:57 -0700 | 
| commit | 0c1fa22a9f8bf69a0eaf53ccaf558bc14426303a (patch) | |
| tree | b0c7e61c3383d40b2c3bfa08840fc840d8a4daa5 /Library/Homebrew | |
| parent | aa228d502a81f7c324deae23b18a81181c059ebf (diff) | |
| download | homebrew-0c1fa22a9f8bf69a0eaf53ccaf558bc14426303a.tar.bz2 | |
Extract MacOS module to separate file
Diffstat (limited to 'Library/Homebrew')
| -rw-r--r-- | Library/Homebrew/macos.rb | 408 | ||||
| -rw-r--r-- | Library/Homebrew/utils.rb | 410 | 
2 files changed, 409 insertions, 409 deletions
diff --git a/Library/Homebrew/macos.rb b/Library/Homebrew/macos.rb new file mode 100644 index 000000000..d0b1670d9 --- /dev/null +++ b/Library/Homebrew/macos.rb @@ -0,0 +1,408 @@ +module MacOS extend self +  def version +    MACOS_VERSION +  end + +  def cat +    if mountain_lion? +      :mountainlion +    elsif lion? +      :lion +    elsif snow_leopard? +      :snowleopard +    elsif leopard? +      :leopard +    else +      nil +    end +  end + +  def clt_installed? +    # If the command line tools are installed, most unix standard +    # tools, libs and headers are in /usr. +    # Returns true, also for older Xcode/OSX versions that had everything in /usr +    # Beginning with Xcode 4.3, the dev tools are no longer installed +    # in /usr and SDKs no longer in /Developer by default. +    # But Apple provides an optional "Command Line Tools for Xcode" package. +    not clt_version.empty? or dev_tools_path == Pathname.new("/usr/bin") +  end + +  def clt_version +    # Version string (a pretty damn long one) of the CLT package. +    # Note, that different ways to install the CLTs lead to different +    # version numbers. +    @clt_version ||= begin +      # CLT installed via stand-alone website download +      clt_pkginfo_stand_alone = `pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLILeo 2>/dev/null`.strip +      # CLT installed via preferences from within Xcode +      clt_pkginfo_from_xcode = `pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLI 2>/dev/null`.strip +      if not clt_pkginfo_stand_alone.empty? +        clt_pkginfo_stand_alone =~ /version: (.*)$/ +        $1 +      elsif not clt_pkginfo_from_xcode.empty? +        clt_pkginfo_from_xcode =~ /version: (.*)$/ +        $1 +      else +        # We return "" instead of nil because we want clt_installed? to be true on older Macs. +        # So clt_version.empty? does not mean there are no unix tools in /usr, it just means +        # that the "Command Line Tools for Xcode" package is not installed +        "" # No CLT or recipe available to pkgutil. +      end +    end +  end + +  # Locate the "current Xcode folder" via xcode-select. See: +  # man xcode-select +  def xcode_folder +    @xcode_folder ||= `xcode-select -print-path 2>/dev/null`.strip +  end + +  # Xcode 4.3 tools hang if "/" is set +  def xctools_fucked? +    xcode_folder == "/" +  end + +  def locate tool +    # Don't call tools (cc, make, strip, etc.) directly! +    # Give the name of the binary you look for as a string to this method +    # in order to get the full path back as a Pathname. +    tool = tool.to_s + +    @locate_cache ||= {} +    return @locate_cache[tool] if @locate_cache.has_key? tool + +    if File.executable? "/usr/bin/#{tool}" +      path = Pathname.new "/usr/bin/#{tool}" +    else +      # Xcrun was provided first with Xcode 4.3 and allows us to proxy +      # tool usage thus avoiding various bugs. +      p = `/usr/bin/xcrun -find #{tool} 2>/dev/null`.chomp unless MacOS.xctools_fucked? +      if !p.nil? and !p.empty? and File.executable? p +        path = Pathname.new p +      else +        # This is for the use-case where xcode-select is not set up correctly +        # with Xcode 4.3+. The tools in Xcode 4.3+ are split over two locations, +        # usually xcrun would figure that out for us, but it won't work if +        # xcode-select is not configured properly. +        p = "#{MacOS.dev_tools_path}/#{tool}" +        if File.executable? p +          path = Pathname.new p +        else +          # Otherwise lets look in the second location. +          p = "#{MacOS.xctoolchain_path}/usr/bin/#{tool}" +          if File.executable? p +            path = Pathname.new p +          else +            # We digged so deep but all is lost now. +            path = nil +          end +        end +      end +    end +    @locate_cache[tool] = path +    return path +  end + +  def dev_tools_path +    @dev_tools_path ||= if File.exist? "/usr/bin/cc" and File.exist? "/usr/bin/make" +      # probably a safe enough assumption (the unix way) +      Pathname.new "/usr/bin" +    elsif not xctools_fucked? and system "/usr/bin/xcrun -find make 1>/dev/null 2>&1" +      # Wherever "make" is there are the dev tools. +      Pathname.new(`/usr/bin/xcrun -find make`.chomp).dirname +    elsif File.exist? "#{xcode_prefix}/usr/bin/make" +      # cc stopped existing with Xcode 4.3, there are c89 and c99 options though +      Pathname.new "#{xcode_prefix}/usr/bin" +    else +      # Since we are pretty unrelenting in finding Xcode no matter where +      # it hides, we can now throw in the towel. +      opoo "You really should consult the `brew doctor`!" +      "" +    end +  end + +  def xctoolchain_path +    # Beginning with Xcode 4.3, clang and some other tools are located in a xctoolchain dir. +    @xctoolchain_path ||= begin +      path = Pathname.new("#{MacOS.xcode_prefix}/Toolchains/XcodeDefault.xctoolchain") +      if path.exist? +        path +      else +        # ok, there are no Toolchains in xcode_prefix +        # and that's ok as long as everything is in dev_tools_path="/usr/bin" (i.e. clt_installed?) +        nil +      end +    end +  end + +  def sdk_path(v=MacOS.version) +    # The path of the MacOSX SDK. +    if !MacOS.xctools_fucked? and File.executable? "#{xcode_folder}/usr/bin/make" +      path = `#{locate('xcodebuild')} -version -sdk macosx#{v} Path 2>/dev/null`.strip +    elsif File.directory? '/Developer/SDKs/MacOS#{v}.sdk' +      # the old default (or wild wild west style) +      path = "/Developer/SDKs/MacOS#{v}.sdk" +    elsif File.directory? "#{xcode_prefix}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{v}.sdk" +      # xcode_prefix is pretty smart, so lets look inside to find the sdk +      path = "#{xcode_prefix}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{v}.sdk" +    end +    if path.nil? or path.empty? or not File.directory? path +      nil +    else +      Pathname.new path +    end +  end + +  def default_cc +    cc = locate 'cc' +    Pathname.new(cc).realpath.basename.to_s rescue nil +  end + +  def default_compiler +    case default_cc +      when /^gcc/ then :gcc +      when /^llvm/ then :llvm +      when "clang" then :clang +      else +        # guess :( +        if xcode_version >= "4.3" +          :clang +        elsif xcode_version >= "4.2" +          :llvm +        else +          :gcc +        end +    end +  end + +  def gcc_42_build_version +    @gcc_42_build_version ||= if File.exist? "#{dev_tools_path}/gcc-4.2" \ +      and not Pathname.new("#{dev_tools_path}/gcc-4.2").realpath.basename.to_s =~ /^llvm/ +      `#{dev_tools_path}/gcc-4.2 --version` =~ /build (\d{4,})/ +      $1.to_i +    end +  end + +  def gcc_40_build_version +    @gcc_40_build_version ||= if File.exist? "#{dev_tools_path}/gcc-4.0" +      `#{dev_tools_path}/gcc-4.0 --version` =~ /build (\d{4,})/ +      $1.to_i +    end +  end + +  def xcode_prefix +    @xcode_prefix ||= begin +      path = Pathname.new xcode_folder +      if $?.success? and path.absolute? and File.executable? "#{path}/usr/bin/make" +        path +      elsif File.executable? '/Developer/usr/bin/make' +        # we do this to support cowboys who insist on installing +        # only a subset of Xcode +        Pathname.new '/Developer' +      elsif File.executable? '/Applications/Xcode.app/Contents/Developer/usr/bin/make' +        # fallback for broken Xcode 4.3 installs +        Pathname.new '/Applications/Xcode.app/Contents/Developer' +      else +        # Ask Spotlight where Xcode is. If the user didn't install the +        # helper tools and installed Xcode in a non-conventional place, this +        # is our only option. See: http://superuser.com/questions/390757 +        path = `mdfind "kMDItemCFBundleIdentifier == 'com.apple.dt.Xcode'"`.strip +        if path.empty? +          # Xcode 3 had a different identifier +          path = `mdfind "kMDItemCFBundleIdentifier == 'com.apple.Xcode'"`.strip +        end +        path = "#{path}/Contents/Developer" +        if !path.empty? and File.executable? "#{path}/usr/bin/make" +          Pathname.new path +        else +          nil +        end +      end +    end +  end + +  def xcode_installed? +    # Telling us whether the Xcode.app is installed or not. +    @xcode_installed ||= begin +      if File.directory? '/Applications/Xcode.app' +        true +      elsif File.directory? '/Developer/Applications/Xcode.app' # old style +        true +      elsif not `mdfind "kMDItemCFBundleIdentifier == 'com.apple.dt.Xcode'"`.strip.empty? +        # Xcode 4 +        true +      elsif not `mdfind "kMDItemCFBundleIdentifier == 'com.apple.Xcode'"`.strip.empty? +        # Xcode 3 +        true +      else +        false +      end +    end +  end + + def xcode_version +    # may return a version string +    # that is guessed based on the compiler, so do not +    # use it in order to check if Xcode is installed. +    @xcode_version ||= begin +      return "0" unless MACOS + +      # this shortcut makes xcode_version work for people who don't realise you +      # need to install the CLI tools +      xcode43build = "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild" +      if File.file? xcode43build +        `#{xcode43build} -version 2>/dev/null` =~ /Xcode (\d(\.\d)*)/ +        return $1 if $1 +      end + +      # Xcode 4.3 xc* tools hang indefinately if xcode-select path is set thus +      raise if xctools_fucked? + +      raise unless which "xcodebuild" +      `xcodebuild -version 2>/dev/null` =~ /Xcode (\d(\.\d)*)/ +      raise if $1.nil? or not $?.success? +      $1 +    rescue +      # For people who's xcode-select is unset, or who have installed +      # xcode-gcc-installer or whatever other combinations we can try and +      # supprt. See https://github.com/mxcl/homebrew/wiki/Xcode +      case llvm_build_version.to_i +      when 1..2063 then "3.1.0" +      when 2064..2065 then "3.1.4" +      when 2366..2325 +        # we have no data for this range so we are guessing +        "3.2.0" +      when 2326 +        # also applies to "3.2.3" +        "3.2.4" +      when 2327..2333 then "3.2.5" +      when 2335 +        # this build number applies to 3.2.6, 4.0 and 4.1 +        # https://github.com/mxcl/homebrew/wiki/Xcode +        "4.0" +      else +        case (clang_version.to_f * 10).to_i +        when 0 +          "dunno" +        when 1..14 +          "3.2.2" +        when 15 +          "3.2.4" +        when 16 +          "3.2.5" +        when 17..20 +          "4.0" +        when 21 +          "4.1" +        when 22..30 +          "4.2" +        when 31 +          "4.3" +        else +          "4.3" +        end +      end +    end +  end + +  def llvm_build_version +    # for Xcode 3 on OS X 10.5 this will not exist +    # NOTE may not be true anymore but we can't test +    @llvm_build_version ||= if locate("llvm-gcc") +      `#{locate("llvm-gcc")} --version` =~ /LLVM build (\d{4,})/ +      $1.to_i +    end +  end + +  def clang_version +    @clang_version ||= if locate("clang") +      `#{locate("clang")} --version` =~ /clang version (\d\.\d)/ +      $1 +    end +  end + +  def clang_build_version +    @clang_build_version ||= if locate("clang") +      `#{locate("clang")} --version` =~ %r[tags/Apple/clang-(\d{2,})] +      $1.to_i +    end +  end + +  def x11_installed? +    # Even if only Xcode (without CLT) is installed, this dylib is there. +    Pathname.new('/usr/X11/lib/libpng.dylib').exist? +  end + +  def macports_or_fink_installed? +    # See these issues for some history: +    # http://github.com/mxcl/homebrew/issues/#issue/13 +    # http://github.com/mxcl/homebrew/issues/#issue/41 +    # http://github.com/mxcl/homebrew/issues/#issue/48 +    return false unless MACOS + +    %w[port fink].each do |ponk| +      path = which(ponk) +      return ponk unless path.nil? +    end + +    # we do the above check because macports can be relocated and fink may be +    # able to be relocated in the future. This following check is because if +    # fink and macports are not in the PATH but are still installed it can +    # *still* break the build -- because some build scripts hardcode these paths: +    %w[/sw/bin/fink /opt/local/bin/port].each do |ponk| +      return ponk if File.exist? ponk +    end + +    # finally, sometimes people make their MacPorts or Fink read-only so they +    # can quickly test Homebrew out, but still in theory obey the README's +    # advise to rename the root directory. This doesn't work, many build scripts +    # error out when they try to read from these now unreadable directories. +    %w[/sw /opt/local].each do |path| +      path = Pathname.new(path) +      return path if path.exist? and not path.readable? +    end + +    false +  end + +  def leopard? +    10.5 == MACOS_VERSION +  end + +  def snow_leopard? +    10.6 <= MACOS_VERSION # Actually Snow Leopard or newer +  end + +  def lion? +    10.7 <= MACOS_VERSION # Actually Lion or newer +  end + +  def mountain_lion? +    10.8 <= MACOS_VERSION # Actually Mountain Lion or newer +  end + +  def prefer_64_bit? +    Hardware.is_64_bit? and not leopard? +  end + +  StandardCompilers = { +    "3.1.4" => {:gcc_40_build_version=>5493, :gcc_42_build_version=>5577}, +    "3.2.6" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"1.7", :clang_build_version=>77}, +    "4.0" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, +    "4.0.1" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, +    "4.0.2" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, +    "4.2" => {:llvm_build_version=>2336, :clang_version=>"3.0", :clang_build_version=>211}, +    "4.3" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, +    "4.3.1" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, +    "4.3.2" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, +    "4.3.3" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318} +  } + +  def compilers_standard? +    xcode = MacOS.xcode_version +    # Assume compilers are okay if Xcode version not in hash +    return true unless StandardCompilers.keys.include? xcode + +    StandardCompilers[xcode].all? {|k,v| MacOS.send(k) == v} +  end +end diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 0667b74ca..2af1072c4 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -1,5 +1,6 @@  require 'pathname'  require 'exceptions' +require 'macos'  class Tty    class <<self @@ -235,415 +236,6 @@ def nostdout    end  end -module MacOS extend self -  def version -    MACOS_VERSION -  end - -  def cat -    if mountain_lion? -      :mountainlion -    elsif lion? -      :lion -    elsif snow_leopard? -      :snowleopard -    elsif leopard? -      :leopard -    else -      nil -    end -  end - -  def clt_installed? -    # If the command line tools are installed, most unix standard -    # tools, libs and headers are in /usr. -    # Returns true, also for older Xcode/OSX versions that had everything in /usr -    # Beginning with Xcode 4.3, the dev tools are no longer installed -    # in /usr and SDKs no longer in /Developer by default. -    # But Apple provides an optional "Command Line Tools for Xcode" package. -    not clt_version.empty? or dev_tools_path == Pathname.new("/usr/bin") -  end - -  def clt_version -    # Version string (a pretty damn long one) of the CLT package. -    # Note, that different ways to install the CLTs lead to different -    # version numbers. -    @clt_version ||= begin -      # CLT installed via stand-alone website download -      clt_pkginfo_stand_alone = `pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLILeo 2>/dev/null`.strip -      # CLT installed via preferences from within Xcode -      clt_pkginfo_from_xcode = `pkgutil --pkg-info com.apple.pkg.DeveloperToolsCLI 2>/dev/null`.strip -      if not clt_pkginfo_stand_alone.empty? -        clt_pkginfo_stand_alone =~ /version: (.*)$/ -        $1 -      elsif not clt_pkginfo_from_xcode.empty? -        clt_pkginfo_from_xcode =~ /version: (.*)$/ -        $1 -      else -        # We return "" instead of nil because we want clt_installed? to be true on older Macs. -        # So clt_version.empty? does not mean there are no unix tools in /usr, it just means -        # that the "Command Line Tools for Xcode" package is not installed -        "" # No CLT or recipe available to pkgutil. -      end -    end -  end - -  # Locate the "current Xcode folder" via xcode-select. See: -  # man xcode-select -  def xcode_folder -    @xcode_folder ||= `xcode-select -print-path 2>/dev/null`.strip -  end - -  # Xcode 4.3 tools hang if "/" is set -  def xctools_fucked? -    xcode_folder == "/" -  end - -  def locate tool -    # Don't call tools (cc, make, strip, etc.) directly! -    # Give the name of the binary you look for as a string to this method -    # in order to get the full path back as a Pathname. -    tool = tool.to_s - -    @locate_cache ||= {} -    return @locate_cache[tool] if @locate_cache.has_key? tool - -    if File.executable? "/usr/bin/#{tool}" -      path = Pathname.new "/usr/bin/#{tool}" -    else -      # Xcrun was provided first with Xcode 4.3 and allows us to proxy -      # tool usage thus avoiding various bugs. -      p = `/usr/bin/xcrun -find #{tool} 2>/dev/null`.chomp unless MacOS.xctools_fucked? -      if !p.nil? and !p.empty? and File.executable? p -        path = Pathname.new p -      else -        # This is for the use-case where xcode-select is not set up correctly -        # with Xcode 4.3+. The tools in Xcode 4.3+ are split over two locations, -        # usually xcrun would figure that out for us, but it won't work if -        # xcode-select is not configured properly. -        p = "#{MacOS.dev_tools_path}/#{tool}" -        if File.executable? p -          path = Pathname.new p -        else -          # Otherwise lets look in the second location. -          p = "#{MacOS.xctoolchain_path}/usr/bin/#{tool}" -          if File.executable? p -            path = Pathname.new p -          else -            # We digged so deep but all is lost now. -            path = nil -          end -        end -      end -    end -    @locate_cache[tool] = path -    return path -  end - -  def dev_tools_path -    @dev_tools_path ||= if File.exist? "/usr/bin/cc" and File.exist? "/usr/bin/make" -      # probably a safe enough assumption (the unix way) -      Pathname.new "/usr/bin" -    elsif not xctools_fucked? and system "/usr/bin/xcrun -find make 1>/dev/null 2>&1" -      # Wherever "make" is there are the dev tools. -      Pathname.new(`/usr/bin/xcrun -find make`.chomp).dirname -    elsif File.exist? "#{xcode_prefix}/usr/bin/make" -      # cc stopped existing with Xcode 4.3, there are c89 and c99 options though -      Pathname.new "#{xcode_prefix}/usr/bin" -    else -      # Since we are pretty unrelenting in finding Xcode no matter where -      # it hides, we can now throw in the towel. -      opoo "You really should consult the `brew doctor`!" -      "" -    end -  end - -  def xctoolchain_path -    # Beginning with Xcode 4.3, clang and some other tools are located in a xctoolchain dir. -    @xctoolchain_path ||= begin -      path = Pathname.new("#{MacOS.xcode_prefix}/Toolchains/XcodeDefault.xctoolchain") -      if path.exist? -        path -      else -        # ok, there are no Toolchains in xcode_prefix -        # and that's ok as long as everything is in dev_tools_path="/usr/bin" (i.e. clt_installed?) -        nil -      end -    end -  end - -  def sdk_path(v=MacOS.version) -    # The path of the MacOSX SDK. -    if !MacOS.xctools_fucked? and File.executable? "#{xcode_folder}/usr/bin/make" -      path = `#{locate('xcodebuild')} -version -sdk macosx#{v} Path 2>/dev/null`.strip -    elsif File.directory? '/Developer/SDKs/MacOS#{v}.sdk' -      # the old default (or wild wild west style) -      path = "/Developer/SDKs/MacOS#{v}.sdk" -    elsif File.directory? "#{xcode_prefix}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{v}.sdk" -      # xcode_prefix is pretty smart, so lets look inside to find the sdk -      path = "#{xcode_prefix}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX#{v}.sdk" -    end -    if path.nil? or path.empty? or not File.directory? path -      nil -    else -      Pathname.new path -    end -  end - -  def default_cc -    cc = locate 'cc' -    Pathname.new(cc).realpath.basename.to_s rescue nil -  end - -  def default_compiler -    case default_cc -      when /^gcc/ then :gcc -      when /^llvm/ then :llvm -      when "clang" then :clang -      else -        # guess :( -        if xcode_version >= "4.3" -          :clang -        elsif xcode_version >= "4.2" -          :llvm -        else -          :gcc -        end -    end -  end - -  def gcc_42_build_version -    @gcc_42_build_version ||= if File.exist? "#{dev_tools_path}/gcc-4.2" \ -      and not Pathname.new("#{dev_tools_path}/gcc-4.2").realpath.basename.to_s =~ /^llvm/ -      `#{dev_tools_path}/gcc-4.2 --version` =~ /build (\d{4,})/ -      $1.to_i -    end -  end - -  def gcc_40_build_version -    @gcc_40_build_version ||= if File.exist? "#{dev_tools_path}/gcc-4.0" -      `#{dev_tools_path}/gcc-4.0 --version` =~ /build (\d{4,})/ -      $1.to_i -    end -  end - -  def xcode_prefix -    @xcode_prefix ||= begin -      path = Pathname.new xcode_folder -      if $?.success? and path.absolute? and File.executable? "#{path}/usr/bin/make" -        path -      elsif File.executable? '/Developer/usr/bin/make' -        # we do this to support cowboys who insist on installing -        # only a subset of Xcode -        Pathname.new '/Developer' -      elsif File.executable? '/Applications/Xcode.app/Contents/Developer/usr/bin/make' -        # fallback for broken Xcode 4.3 installs -        Pathname.new '/Applications/Xcode.app/Contents/Developer' -      else -        # Ask Spotlight where Xcode is. If the user didn't install the -        # helper tools and installed Xcode in a non-conventional place, this -        # is our only option. See: http://superuser.com/questions/390757 -        path = `mdfind "kMDItemCFBundleIdentifier == 'com.apple.dt.Xcode'"`.strip -        if path.empty? -          # Xcode 3 had a different identifier -          path = `mdfind "kMDItemCFBundleIdentifier == 'com.apple.Xcode'"`.strip -        end -        path = "#{path}/Contents/Developer" -        if !path.empty? and File.executable? "#{path}/usr/bin/make" -          Pathname.new path -        else -          nil -        end -      end -    end -  end - -  def xcode_installed? -    # Telling us whether the Xcode.app is installed or not. -    @xcode_installed ||= begin -      if File.directory? '/Applications/Xcode.app' -        true -      elsif File.directory? '/Developer/Applications/Xcode.app' # old style -        true -      elsif not `mdfind "kMDItemCFBundleIdentifier == 'com.apple.dt.Xcode'"`.strip.empty? -        # Xcode 4 -        true -      elsif not `mdfind "kMDItemCFBundleIdentifier == 'com.apple.Xcode'"`.strip.empty? -        # Xcode 3 -        true -      else -        false -      end -    end -  end - - def xcode_version -    # may return a version string -    # that is guessed based on the compiler, so do not -    # use it in order to check if Xcode is installed. -    @xcode_version ||= begin -      return "0" unless MACOS - -      # this shortcut makes xcode_version work for people who don't realise you -      # need to install the CLI tools -      xcode43build = "/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild" -      if File.file? xcode43build -        `#{xcode43build} -version 2>/dev/null` =~ /Xcode (\d(\.\d)*)/ -        return $1 if $1 -      end - -      # Xcode 4.3 xc* tools hang indefinately if xcode-select path is set thus -      raise if xctools_fucked? - -      raise unless which "xcodebuild" -      `xcodebuild -version 2>/dev/null` =~ /Xcode (\d(\.\d)*)/ -      raise if $1.nil? or not $?.success? -      $1 -    rescue -      # For people who's xcode-select is unset, or who have installed -      # xcode-gcc-installer or whatever other combinations we can try and -      # supprt. See https://github.com/mxcl/homebrew/wiki/Xcode -      case llvm_build_version.to_i -      when 1..2063 then "3.1.0" -      when 2064..2065 then "3.1.4" -      when 2366..2325 -        # we have no data for this range so we are guessing -        "3.2.0" -      when 2326 -        # also applies to "3.2.3" -        "3.2.4" -      when 2327..2333 then "3.2.5" -      when 2335 -        # this build number applies to 3.2.6, 4.0 and 4.1 -        # https://github.com/mxcl/homebrew/wiki/Xcode -        "4.0" -      else -        case (clang_version.to_f * 10).to_i -        when 0 -          "dunno" -        when 1..14 -          "3.2.2" -        when 15 -          "3.2.4" -        when 16 -          "3.2.5" -        when 17..20 -          "4.0" -        when 21 -          "4.1" -        when 22..30 -          "4.2" -        when 31 -          "4.3" -        else -          "4.3" -        end -      end -    end -  end - -  def llvm_build_version -    # for Xcode 3 on OS X 10.5 this will not exist -    # NOTE may not be true anymore but we can't test -    @llvm_build_version ||= if locate("llvm-gcc") -      `#{locate("llvm-gcc")} --version` =~ /LLVM build (\d{4,})/ -      $1.to_i -    end -  end - -  def clang_version -    @clang_version ||= if locate("clang") -      `#{locate("clang")} --version` =~ /clang version (\d\.\d)/ -      $1 -    end -  end - -  def clang_build_version -    @clang_build_version ||= if locate("clang") -      `#{locate("clang")} --version` =~ %r[tags/Apple/clang-(\d{2,})] -      $1.to_i -    end -  end - -  def x11_installed? -    # Even if only Xcode (without CLT) is installed, this dylib is there. -    Pathname.new('/usr/X11/lib/libpng.dylib').exist? -  end - -  def macports_or_fink_installed? -    # See these issues for some history: -    # http://github.com/mxcl/homebrew/issues/#issue/13 -    # http://github.com/mxcl/homebrew/issues/#issue/41 -    # http://github.com/mxcl/homebrew/issues/#issue/48 -    return false unless MACOS - -    %w[port fink].each do |ponk| -      path = which(ponk) -      return ponk unless path.nil? -    end - -    # we do the above check because macports can be relocated and fink may be -    # able to be relocated in the future. This following check is because if -    # fink and macports are not in the PATH but are still installed it can -    # *still* break the build -- because some build scripts hardcode these paths: -    %w[/sw/bin/fink /opt/local/bin/port].each do |ponk| -      return ponk if File.exist? ponk -    end - -    # finally, sometimes people make their MacPorts or Fink read-only so they -    # can quickly test Homebrew out, but still in theory obey the README's -    # advise to rename the root directory. This doesn't work, many build scripts -    # error out when they try to read from these now unreadable directories. -    %w[/sw /opt/local].each do |path| -      path = Pathname.new(path) -      return path if path.exist? and not path.readable? -    end - -    false -  end - -  def leopard? -    10.5 == MACOS_VERSION -  end - -  def snow_leopard? -    10.6 <= MACOS_VERSION # Actually Snow Leopard or newer -  end - -  def lion? -    10.7 <= MACOS_VERSION # Actually Lion or newer -  end - -  def mountain_lion? -    10.8 <= MACOS_VERSION # Actually Mountain Lion or newer -  end - -  def prefer_64_bit? -    Hardware.is_64_bit? and not leopard? -  end - -  StandardCompilers = { -    "3.1.4" => {:gcc_40_build_version=>5493, :gcc_42_build_version=>5577}, -    "3.2.6" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"1.7", :clang_build_version=>77}, -    "4.0" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, -    "4.0.1" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, -    "4.0.2" => {:gcc_40_build_version=>5494, :gcc_42_build_version=>5666, :llvm_build_version=>2335, :clang_version=>"2.0", :clang_build_version=>137}, -    "4.2" => {:llvm_build_version=>2336, :clang_version=>"3.0", :clang_build_version=>211}, -    "4.3" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, -    "4.3.1" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, -    "4.3.2" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318}, -    "4.3.3" => {:llvm_build_version=>2336, :clang_version=>"3.1", :clang_build_version=>318} -  } - -  def compilers_standard? -    xcode = MacOS.xcode_version -    # Assume compilers are okay if Xcode version not in hash -    return true unless StandardCompilers.keys.include? xcode - -    StandardCompilers[xcode].all? {|k,v| MacOS.send(k) == v} -  end -end -  module GitHub extend self    def issues_for_formula name      # bit basic as depends on the issue at github having the exact name of the  | 
