Skip to content

Instantly share code, notes, and snippets.

@ttilley ttilley/bdw-gc.rb
Created Jun 25, 2012

Embed
What would you like to do?
updated homebrew formula for Boehm-Demers-Weiser GC supporting building from head and passing in various options to the build
require 'formula'
class Formula
def configure_path_args(choices={})
vars = {
:prefix => self.prefix,
:'exec-prefix' => self.prefix,
:bindir => self.bin,
:sbindir => self.sbin,
:libexecdir => self.libexec,
:sysconfdir => self.etc,
:localstatedir => self.var,
:libdir => self.lib,
:includedir => self.include,
:datarootdir => self.share,
:datadir => self.share,
:infodir => self.info,
:localedir => self.share+'locale',
:mandir => self.man,
:docdir => self.doc,
:htmldir => self.doc,
:dvidir => self.doc,
:pdfdir => self.doc,
:psdir => self.doc,
}.merge(choices)
vars.map {|option, value| "--#{option}=#{value}" }
end
# can be used with a block:
# configure_flag('cow') { foo.can_moo? }
# => "--enable-cow"
# the enable/disable strings can be customized:
# configure_flag('sparkles', 'with', 'without') { false }
# => "--without-sparkles"
# you can also just pass in the flag and the state string you want:
# configure_flag('cupcakes', 'fuck-yeah')
# => "--fuck-yeah-cupcakes"
def configure_flag(flag, enable='enable', disable='disable')
if block_given?
"--#{!!yield ? enable : disable}-#{flag}"
else
"--#{enable}-#{flag}"
end
end
end
class SubRepoStrategy < GitDownloadStrategy
def initialize url, name, version, specs
super
@main_url = @url
@main_clone = @clone
@subrepo_url = specs[:subrepo]
@subrepo_name = File.basename(@subrepo_url, '.git')
@subrepo_clone = @clone+@subrepo_name
end
def fetch
begin
super
@url = @subrepo_url
@clone = @subrepo_clone
super
ensure
@url = @main_url
@clone = @main_clone
end
end
def stage
begin
super
@url = @subrepo_url
@clone = @subrepo_clone
super
ensure
@url = @main_url
@clone = @main_clone
end
end
end
class BdwGc < Formula
homepage 'http://www.hpl.hp.com/personal/Hans_Boehm/gc/'
url 'http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.2.tar.gz'
md5 'd17aecedef3d73e75387fb63558fa4eb'
head 'git://github.com/ivmai/bdwgc.git',
:branch => 'master',
:subrepo => 'git://github.com/ivmai/libatomic_ops.git',
:using => SubRepoStrategy
depends_on('autoconf' => :build) if ARGV.build_head?
def options
[
["--parallel-mark", "parallelize marking and free list construction"],
["--disable-cplusplus", "disable C++ support"],
["--gc-debug", "include full support for pointer backtracing etc"],
["--gc-assertions", "collector-internal assertion checking"],
["--redirect-malloc", "redirect malloc and friends to GC routines"],
["--large-config", "optimize for large (> 100MB) heap or root set"],
["--handle-fork", "attempt to ensure a usable collector after fork()" \
" in multi-threaded programs"]
]
end
def install
darwin_release = `uname -r`.to_f.floor
ENV.append_to_cflags("-D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE")
ENV.remove_from_cflags('-D_XOPEN_SOURCE=600') if 8 >= darwin_release
ENV.Og unless ARGV.build_stable?
system "./autogen.sh" if ARGV.build_head?
args = '--disable-dependency-tracking',
'--with-threads=posix',
'--with-pic',
'--with-libatomic-ops=check'
args << configure_flag('parallel-mark') {ARGV.flag? '--parallel-mark'}
args << configure_flag('cplusplus') {!ARGV.flag? '--disable-cplusplus'}
args << configure_flag('gc-debug') {ARGV.flag? '--gc-debug'}
args << configure_flag('redirect-malloc') {ARGV.flag? '--redirect-malloc'}
args << configure_flag('handle-fork') {ARGV.flag? '--handle-fork'}
args << configure_flag('gc-assertions') {ARGV.flag? '--gc-assertions'}
system "./configure", *(self.configure_path_args + args)
system "make"
system "make check"
system "make install"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.