diff options
Diffstat (limited to 'modules/cabal.py')
| -rw-r--r-- | modules/cabal.py | 196 |
1 files changed, 51 insertions, 145 deletions
diff --git a/modules/cabal.py b/modules/cabal.py index 842aaf7..4b118d6 100644 --- a/modules/cabal.py +++ b/modules/cabal.py @@ -29,18 +29,18 @@ from urllib import urlopen, urlretrieve from base.base import log from base.exceptions import ExecutionException from base.dirfactory import DirFactory -from base.module import Module from base.util import pwd, one, log_file from base.vars import orig_src_dir, haskell_compiler +from modules.buildsystem import BuildSystem from modules.sourceball import SourceBall -class Cabal(Module): +class Cabal(BuildSystem): '''A wrapper around common cabal operations This provides a useful api for other modules around the cabal build system ''' - def __init__(self, name, root='~/haskell'): + def __init__(self, name): '''creates a new cabal module this api is deprecated, because it should be more autodetecting @@ -48,52 +48,30 @@ class Cabal(Module): name is a Package (Directory) that uses cabal for its build system ''' self.name = name - self.root = expanduser(root) - with pwd(self.root): - self.package = DirFactory(name) - self.original = orig_src_dir + self.pkg_src = DirFactory(name) self.compiler = haskell_compiler - def copy_in(self, tarball): - '''copies a tarball into the package - - tarball is a path to some tarball - ''' - tarball = abspath(tarball) - with pwd(self.root): - self.package.add_sourceball(tarball) - - def darcs_get(self, url, tgt): - '''creates a darcs variant of a cabal package using darcs source - - url is a url to some darcs repo - tgt is the local name of the darcs repo - ''' - self.package.checkout(tgt, url) - - def find_setup(self, orig=''): + def find_setup(self): '''returns the name of the Setup.?hs script for cabal. ''' setup_re = compile("Setup\.l?hs") - with pwd(self.package.dir): + with self.pkg_src.src_dir(): return one(listdir(getcwd()), setup_re.search) - def compile_setup(self, orig=''): + def compile_setup(self, *args): '''compiles the setup script for faster execution ''' - log.debug('dir is ' + self.package.dir) - with pwd(self.package.dir): - with log_file('ghc.log') as ghc_out: - log.debug('ghc.log file is ' + str(ghc_out)) - log.debug('source_dir is ' + self.package.source_dir(orig)) - with pwd(self.package.source_dir(orig)): - setup_f = self.find_setup(orig) - p = Popen([self.compiler, '--make', setup_f], - stdout = ghc_out, stderr = ghc_out) - log.info('Building %s, please wait...' % setup_f) - p.communicate() - - def configure(self, target='home', orig=''): + with self.pkg_src.src(*args): + with pwd(self.pkg_src.pkg_src_dir): + with log_file('ghc.log') as ghc_out: + with self.pkg_src.src_dir(): + setup_f = self.find_setup() + p = Popen([self.compiler, '--make', setup_f], + stdout = ghc_out, stderr = ghc_out) + log.info('Building %s, please wait...' % setup_f) + p.communicate() + + def configure(self, target='home', *args): '''runs the configure stage of cabal target is either 'home' or 'root' and will configure the package to @@ -103,124 +81,52 @@ class Cabal(Module): Some help is needed making this more flexible ''' user = True if target == 'home' else False - self.compile_setup(orig) - with pwd(self.package.dir): - with log_file('cabal.log') as cabal_out: - log.debug('source_dir is ' + self.package.source_dir(orig)) - with pwd(self.package.source_dir(orig)): - args = [abspath('Setup'), 'configure'] + \ - (['--user', '--prefix=' + expanduser('~')] if user else []) - p = Popen(args, stdout=cabal_out, stderr=cabal_out) - log.info('Configuring %s, please wait...' % self.name) - p.wait() - - def build(self, orig=''): + with self.pkg_src.src(*args): + self.compile_setup() + with pwd(self.pkg_src.pkg_src_dir): + with log_file('cabal.log') as cabal_out: + with self.pkg_src.src_dir(): + cmd = [abspath('Setup'), 'configure'] \ + + (['--user', '--prefix=' + expanduser('~')] if user else []) + p = Popen(cmd, stdout=cabal_out, stderr=cabal_out) + log.info('Configuring %s, please wait...' % self.name) + p.wait() + + def build(self, *args): '''runs the build stage of cabal This is not safe to run on an unconfigured source dir, because this module does not track the state of cabal systems. The user must do this on their own. ''' - self.compile_setup(orig) - with pwd(self.package.dir): - with log_file('cabal.log') as cabal_out: - with pwd(self.package.source_dir(orig)): - args = [abspath('Setup'), 'build'] - p = Popen(args, stdout=cabal_out, stderr=cabal_out) - log.info('Building %s, please wait...' % self.name) - p.wait() - - def install(self, orig=''): + with self.pkg_src.src(*args): + self.compile_setup() + with pwd(self.pkg_src.pkg_src_dir): + with log_file('cabal.log') as cabal_out: + with self.pkg_src.src_dir(): + cmd = [abspath('Setup'), 'build'] + p = Popen(cmd, stdout=cabal_out, stderr=cabal_out) + log.info('Building %s, please wait...' % self.name) + p.wait() + + def install(self, *args): '''runs the install stage of cabal This is not safe to run on an unconfigured source dir, because this module does not track the state of cabal systems. The user must do this on their own. ''' - self.compile_setup(orig) - with pwd(self.package.dir): - with log_file('cabal.log') as cabal_out: - with pwd(self.package.source_dir(orig)): - args = [abspath('Setup'), 'install'] - p = Popen(args, stdout=cabal_out, stderr=cabal_out) - log.info('Building %s, please wait...' % self.name) - p.wait() + with self.pkg_src.src(*args): + self.compile_setup() + with pwd(self.pkg_src.pkg_src_dir): + with log_file('cabal.log') as cabal_out: + with pwd(self.pkg_src.src_dir()): + cmd = [abspath('Setup'), 'install'] + p = Popen(cmd, stdout=cabal_out, stderr=cabal_out) + log.info('Building %s, please wait...' % self.name) + p.wait() - def install_tag(self, tag): - '''assuming a package that supports tagging, install a specific tag - - tag is the name of the tag in the DVCS - ''' - with pwd(self.package.dir): - with self.package.tag(tag): - self.install() - - def install_source(self, target='home', orig=''): - '''perform configure, build, and install steps in one - ''' - self.configure(target, orig) - self.build(orig) - self.install(orig) - - def install_sourceball(self, tarball, target='home'): - '''given a tarball, copy it in and install it - ''' - self.copy_in(tarball) - self.install_source(target, '') - - def get_from_hackage(self, pkg, ver): - '''get a specific package from hackage - - pkg is the name of the package desired - ver is the version wanted - ''' - sb_file = self.hackage_url(pkg, ver) - self.copy_in(sb_file) - - def get_latest(self, pkg): - '''get the latest version of a package from hackage - - pkg is the package desired - ''' - ver = self.latest_version(pkg) - self.get_from_hackage(pkg, ver) - - def install_from_hackage(self, pkg, ver, target='home'): - '''get and install a specific package from hackage - - pkg is the desired package - ver is the version wanted - target is the location to install to, either 'home' or 'root' - ''' - self.get_from_hackage(pkg, ver) - self.install_source(target, '') - - def install_latest(self, pkg, target='home'): - '''get and install the latest version of a package from hackage''' - self.get_latest(pkg) - self.install_source(target, '') - - def latest_version(self, pkg): - '''download information from hackage to find out the latest version of a package - ''' - hackage_title = compile(r'<title.*?>HackageDB: (.*)-(.*)</title.*?>', DOTALL) - site = 'http://hackage.haskell.org/cgi-bin/hackage-scripts/package/' + pkg - u = urlopen(site) - page = u.read() - match = hackage_title.search(page) - groups = match.groups() - print groups - if pkg == groups[0]: - return groups[1] - else: - raise ExecutionException("package does not match package name, can't determine version, sorry") - - def hackage_url(self, pkg, ver): - '''returns the url for tarball for a hackage package''' - return 'http://hackage.haskell.org/packages/archive/' + \ - pkg + '/' + ver + '/' + pkg + '-' + ver + '.tar.gz' - def close(self): - self.package.close() + self.pkg_src.close() __all__ = ['Cabal'] |
