Merge branch 'features/qt' into develop

This commit is contained in:
Todd Gamblin 2014-12-25 18:01:51 -08:00
commit b80a0e1da5
30 changed files with 583 additions and 10 deletions

View file

@ -30,6 +30,7 @@
import sys
import re
import shutil
import stat
import errno
import getpass
from contextlib import contextmanager, closing
@ -63,8 +64,11 @@ def filter_file(regex, repl, *filenames, **kwargs):
# Allow strings to use \1, \2, etc. for replacement, like sed
if not callable(repl):
unescaped = repl.replace(r'\\', '\\')
repl = lambda m: re.sub(
r'\\([0-9])', lambda x: m.group(int(x.group(1))), unescaped)
def replace_groups_with_groupid(m):
def groupid_to_group(x):
return m.group(int(x.group(1)))
return re.sub(r'\\([1-9])', groupid_to_group, unescaped)
repl = replace_groups_with_groupid
if string:
regex = re.escape(regex)
@ -142,6 +146,13 @@ def install(src, dest):
shutil.copy(src, dest)
set_install_permissions(dest)
src_mode = os.stat(src).st_mode
dest_mode = os.stat(dest).st_mode
if src_mode | stat.S_IXUSR: dest_mode |= stat.S_IXUSR
if src_mode | stat.S_IXGRP: dest_mode |= stat.S_IXGRP
if src_mode | stat.S_IXOTH: dest_mode |= stat.S_IXOTH
os.chmod(dest, dest_mode)
def expand_user(path):
"""Find instances of '%u' in a path and replace with the current user's

View file

@ -190,6 +190,7 @@ def set_module_variables_for_package(pkg):
m.makedirs = os.makedirs
m.remove = os.remove
m.removedirs = os.removedirs
m.symlink = os.symlink
m.mkdirp = mkdirp
m.install = install
@ -199,3 +200,10 @@ def set_module_variables_for_package(pkg):
# Useful directories within the prefix are encapsulated in
# a Prefix object.
m.prefix = pkg.prefix
def setup_package(pkg):
"""Execute all environment setup routines."""
set_compiler_environment_variables(pkg)
set_build_environment_variables(pkg)
set_module_variables_for_package(pkg)

View file

@ -0,0 +1,69 @@
##############################################################################
# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://scalability-llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License (as published by
# the Free Software Foundation) version 2.1 dated February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import os
from external import argparse
import llnl.util.tty as tty
import spack.cmd
import spack.build_environment as build_env
description = "Run a command with the environment for a particular spec's install."
def setup_parser(subparser):
subparser.add_argument(
'spec', nargs=argparse.REMAINDER, help="specs of package environment to emulate.")
def env(parser, args):
if not args.spec:
tty.die("spack env requires a spec.")
# Specs may have spaces in them, so if they do, require that the
# caller put a '--' between the spec and the command to be
# executed. If there is no '--', assume that the spec is the
# first argument.
sep = '--'
if sep in args.spec:
s = args.spec.index(sep)
spec = args.spec[:s]
cmd = args.spec[s+1:]
else:
spec = args.spec[0]
cmd = args.spec[1:]
specs = spack.cmd.parse_specs(spec, concretize=True)
if len(specs) > 1:
tty.die("spack env only takes one spec.")
spec = specs[0]
build_env.setup_package(spec.package)
if not cmd:
# If no command act like the "env" command and print out env vars.
for key, val in os.environ.items():
print "%s=%s" % (key, val)
else:
# Otherwise execute the command with the new environment
os.execvp(cmd[0], cmd)

View file

@ -35,6 +35,7 @@
"""
import os
import re
import time
import inspect
import subprocess
import platform as py_platform
@ -390,6 +391,10 @@ def ensure_has_dict(attr_name):
if not hasattr(self, 'list_depth'):
self.list_depth = 1
# Set up some internal variables for timing.
self._fetch_time = 0.0
self._total_time = 0.0
@property
def version(self):
@ -606,6 +611,7 @@ def do_fetch(self):
if not self.spec.concrete:
raise ValueError("Can only fetch concrete packages.")
start_time = time.time()
if spack.do_checksum and not self.version in self.versions:
tty.warn("There is no checksum on file to fetch %s safely."
% self.spec.format('$_$@'))
@ -624,6 +630,7 @@ def do_fetch(self):
"Will not fetch %s." % self.spec.format('$_$@'), checksum_msg)
self.stage.fetch()
self._fetch_time = time.time() - start_time
if spack.do_checksum and self.version in self.versions:
self.stage.check()
@ -655,8 +662,11 @@ def do_patch(self):
# Kick off the stage first.
self.do_stage()
# Package can add its own patch function.
has_patch_fun = hasattr(self, 'patch') and callable(self.patch)
# If there are no patches, note it.
if not self.patches:
if not self.patches and not has_patch_fun:
tty.msg("No patches needed for %s." % self.name)
return
@ -679,7 +689,7 @@ def do_patch(self):
tty.msg("Already patched %s" % self.name)
return
# Apply all the patches for specs that match this on
# Apply all the patches for specs that match this one
for spec, patch_list in self.patches.items():
if self.spec.satisfies(spec):
for patch in patch_list:
@ -697,6 +707,11 @@ def do_patch(self):
os.remove(bad_file)
touch(good_file)
if has_patch_fun:
self.patch()
tty.msg("Patched %s" % self.name)
def do_install(self, **kwargs):
"""This class should call this version of the install method.
@ -720,6 +735,7 @@ def do_install(self, **kwargs):
if not ignore_deps:
self.do_install_dependencies()
start_time = time.time()
if not fake_install:
self.do_patch()
@ -742,9 +758,7 @@ def do_install(self, **kwargs):
spack.install_layout.make_path_for_spec(self.spec)
# Set up process's build environment before running install.
build_env.set_compiler_environment_variables(self)
build_env.set_build_environment_variables(self)
build_env.set_module_variables_for_package(self)
build_env.setup_package(self)
if fake_install:
mkdirp(self.prefix.bin)
@ -765,7 +779,13 @@ def do_install(self, **kwargs):
if not keep_stage:
self.stage.destroy()
tty.msg("Successfully installed %s" % self.name)
# Stop timer.
self._total_time = time.time() - start_time
build_time = self._total_time - self._fetch_time
tty.msg("Successfully installed %s." % self.name,
"Fetch: %.2f sec. Build: %.2f sec. Total: %.2f sec."
% (self._fetch_time, build_time, self._total_time))
print_pkg(self.prefix)
# Use os._exit here to avoid raising a SystemExit exception,

View file

@ -5,6 +5,7 @@ class Imagemagick(Package):
homepage = "http://www.imagemagic.org"
url = "http://www.imagemagick.org/download/ImageMagick-6.8.9-10.tar.gz"
version('6.9.0-0', '2cf094cb86ec518fa5bc669ce2d21613')
version('6.8.9-10', 'aa050bf9785e571c956c111377bbf57c')
version('6.8.9-9', 'e63fed3e3550851328352c708f800676')

View file

@ -0,0 +1,18 @@
from spack import *
class Atk(Package):
"""ATK provides the set of accessibility interfaces that are
implemented by other toolkits and applications. Using the ATK
interfaces, accessibility tools have full access to view and
control running applications."""
homepage = "https://developer.gnome.org/atk/"
url = "http://ftp.gnome.org/pub/gnome/sources/atk/2.14/atk-2.14.0.tar.xz"
version('2.14.0', 'ecb7ca8469a5650581b1227d78051b8b')
depends_on("glib")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -1,4 +1,5 @@
from spack import *
from glob import glob
class Bzip2(Package):
"""bzip2 is a freely available, patent free high-quality data
@ -15,5 +16,19 @@ def install(self, spec, prefix):
# No configure system -- have to filter the makefile for this package.
filter_file(r'CC=gcc', 'CC=cc', 'Makefile', string=True)
make()
make('-f', 'Makefile-libbz2_so')
make('clean')
make("install", "PREFIX=%s" % prefix)
bzip2_exe = join_path(prefix.bin, 'bzip2')
install('bzip2-shared', bzip2_exe)
for libfile in glob('libbz2.so*'):
install(libfile, prefix.lib)
bunzip2 = join_path(prefix.bin, 'bunzip2')
remove(bunzip2)
symlink(bzip2_exe, bunzip2)
bzcat = join_path(prefix.bin, 'bzcat')
remove(bzcat)
symlink(bzip2_exe, bzcat)

View file

@ -0,0 +1,19 @@
from spack import *
class Cairo(Package):
"""Cairo is a 2D graphics library with support for multiple output devices."""
homepage = "http://cairographics.org"
url = "http://cairographics.org/releases/cairo-1.14.0.tar.xz"
version('1.14.0', 'fc3a5edeba703f906f2241b394f0cced')
depends_on("libpng")
depends_on("glib")
depends_on("pixman")
depends_on("fontconfig@2.10.91:") # Require newer version of fontconfig.
def install(self, spec, prefix):
configure("--prefix=%s" % prefix,
"--enable-tee")
make()
make("install")

View file

@ -0,0 +1,25 @@
from spack import *
class Dbus(Package):
"""D-Bus is a message bus system, a simple way for applications to
talk to one another. D-Bus supplies both a system daemon (for
events such new hardware device printer queue ) and a
per-user-login-session daemon (for general IPC needs among user
applications). Also, the message bus is built on top of a
general one-to-one message passing framework, which can be used
by any two applications to communicate directly (without going
through the message bus daemon)."""
homepage = "http://dbus.freedesktop.org/"
url = "http://dbus.freedesktop.org/releases/dbus/dbus-1.8.8.tar.gz"
version('1.9.0', 'ec6895a4d5c0637b01f0d0e7689e2b36')
version('1.8.8', 'b9f4a18ee3faa1e07c04aa1d83239c43')
version('1.8.6', '6a08ba555d340e9dfe2d623b83c0eea8')
version('1.8.4', '4717cb8ab5b80978fcadf2b4f2f72e1b')
version('1.8.2', 'd6f709bbec0a022a1847c7caec9d6068')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,22 @@
from spack import *
class GdkPixbuf(Package):
"""The Gdk Pixbuf is a toolkit for image loading and pixel buffer
manipulation. It is used by GTK+ 2 and GTK+ 3 to load and
manipulate images. In the past it was distributed as part of
GTK+ 2 but it was split off into a separate package in
preparation for the change to GTK+ 3."""
homepage = "https://developer.gnome.org/gdk-pixbuf/"
url = "http://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.31/gdk-pixbuf-2.31.1.tar.xz"
version('2.31.2', '6be6bbc4f356d4b79ab4226860ab8523')
depends_on("glib")
depends_on("jpeg")
depends_on("libpng")
depends_on("libtiff")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,18 @@
from spack import *
class Glib(Package):
"""The GLib package contains a low-level libraries useful for
providing data structure handling for C, portability wrappers
and interfaces for such runtime functionality as an event loop,
threads, dynamic loading and an object system."""
homepage = "https://developer.gnome.org/glib/"
url = "http://ftp.gnome.org/pub/gnome/sources/glib/2.42/glib-2.42.1.tar.xz"
version('2.42.1', '89c4119e50e767d3532158605ee9121a')
depends_on("libffi")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,22 @@
from spack import *
class Gnutls(Package):
"""GnuTLS is a secure communications library implementing the SSL,
TLS and DTLS protocols and technologies around them. It
provides a simple C language application programming interface
(API) to access the secure communications protocols as well as
APIs to parse and write X.509, PKCS #12, OpenPGP and other
required structures. It is aimed to be portable and efficient
with focus on security and interoperability."""
homepage = "http://www.gnutls.org"
url = "ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.9.tar.xz"
version('3.3.9', 'ff61b77e39d09f1140ab5a9cf52c58b6')
depends_on("nettle")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,22 @@
from spack import *
class Gtkplus(Package):
"""The GTK+ 2 package contains libraries used for creating graphical user interfaces for applications."""
homepage = "http://www.gtk.org"
version('2.24.25', '612350704dd3aacb95355a4981930c6f',
url="http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.25.tar.xz")
depends_on("atk")
depends_on("gdk-pixbuf")
depends_on("pango")
def patch(self):
# remove disable deprecated flag.
filter_file(r'CFLAGS="-DGDK_PIXBUF_DISABLE_DEPRECATED $CFLAGS"',
'', 'configure', string=True)
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,20 @@
from spack import *
class Harfbuzz(Package):
"""The Harfbuzz package contains an OpenType text shaping engine."""
homepage = "http://www.freedesktop.org/wiki/Software/HarfBuzz/"
url = "http://www.freedesktop.org/software/harfbuzz/release/harfbuzz-0.9.37.tar.bz2"
version('0.9.37', 'bfe733250e34629a188d82e3b971bc1e')
depends_on("glib")
depends_on("icu")
depends_on("freetype")
def patch(self):
change_sed_delimiter('@', ';', 'src/Makefile.in')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,25 @@
from spack import *
class Icu(Package):
"""The International Components for Unicode (ICU) package is a
mature, widely used set of C/C++ libraries providing Unicode and
Globalization support for software applications. ICU is widely
portable and gives applications the same results on all
platforms."""
# FIXME: add a proper url for your package's homepage here.
homepage = "http://www.example.com"
url = "http://download.icu-project.org/files/icu4c/54.1/icu4c-54_1-src.tgz"
version('54.1', 'e844caed8f2ca24c088505b0d6271bc0')
def url_for_version(self, version):
return "http://download.icu-project.org/files/icu4c/%s/icu4c-%s-src.tgz" % (
version, str(version).replace('.', '_'))
def install(self, spec, prefix):
with working_dir("source"):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -5,7 +5,7 @@ class Jpeg(Package):
homepage = "http://www.ijg.org"
url = "http://www.ijg.org/files/jpegsrc.v9a.tar.gz"
version('9a', 'b397211ddfd506b92cd5e02a22ac924d')
version('9a', '3353992aecaee1805ef4109aadd433e7')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)

View file

@ -0,0 +1,19 @@
from spack import *
class Lcms(Package):
"""Little cms is a color management library. Implements fast
transforms between ICC profiles. It is focused on speed, and is
portable across several platforms (MIT license)."""
homepage = "http://www.littlecms.com"
url = "http://downloads.sourceforge.net/project/lcms/lcms/2.6/lcms2-2.6.tar.gz"
version('2.6', 'f4c08d38ceade4a664ebff7228910a33')
depends_on("jpeg")
depends_on("libtiff")
depends_on("zlib")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,20 @@
from spack import *
class LibjpegTurbo(Package):
"""libjpeg-turbo is a fork of the original IJG libjpeg which uses
SIMD to accelerate baseline JPEG compression and
decompression. libjpeg is a library that implements JPEG image
encoding, decoding and transcoding."""
homepage = "http://libjpeg-turbo.virtualgl.org"
url = "http://downloads.sourceforge.net/libjpeg-turbo/libjpeg-turbo-1.3.1.tar.gz"
version('1.3.1', '2c3a68129dac443a72815ff5bb374b05')
# Can use either of these.
depends_on("yasm")
depends_on("nasm")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,23 @@
from spack import *
class Libmng(Package):
"""libmng -THE reference library for reading, displaying, writing
and examining Multiple-Image Network Graphics. MNG is the animation
extension to the popular PNG image-format."""
homepage = "http://sourceforge.net/projects/libmng/"
url = "http://downloads.sourceforge.net/project/libmng/libmng-devel/2.0.2/libmng-2.0.2.tar.gz"
version('2.0.2', '1ffefaed4aac98475ee6267422cbca55')
depends_on("jpeg")
depends_on("zlib")
depends_on("lcms")
def patch(self):
# jpeg requires stdio to beincluded before its headrs.
filter_file(r'^(\#include \<jpeglib\.h\>)', '#include<stdio.h>\n\\1', 'libmng_types.h')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -8,6 +8,8 @@ class Libtiff(Package):
version('4.0.3', '051c1068e6a0627f461948c365290410')
depends_on('jpeg')
depends_on('zlib')
depends_on('xz')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)

View file

@ -0,0 +1,16 @@
from spack import *
class Libxml2(Package):
"""Libxml2 is the XML C parser and toolkit developed for the Gnome
project (but usable outside of the Gnome platform), it is free
software available under the MIT License."""
homepage = "http://xmlsoft.org"
url = "http://xmlsoft.org/sources/libxml2-2.9.2.tar.gz"
version('2.9.2', '9e6a9aca9d155737868b3dc5fd82f788')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix,
"--without-python")
make()
make("install")

View file

@ -0,0 +1,14 @@
from spack import *
class Nasm(Package):
"""NASM (Netwide Assembler) is an 80x86 assembler designed for
portability and modularity. It includes a disassembler as well."""
homepage = "http://www.nasm.us"
url = "http://www.nasm.us/pub/nasm/releasebuilds/2.11.06/nasm-2.11.06.tar.xz"
version('2.11.06', '2b958e9f5d200641e6fc9564977aecc5')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,15 @@
from spack import *
class Nettle(Package):
"""The Nettle package contains the low-level cryptographic library
that is designed to fit easily in many contexts."""
homepage = "http://www.example.com"
url = "http://ftp.gnu.org/gnu/nettle/nettle-2.7.1.tar.gz"
version('2.7', '2caa1bd667c35db71becb93c5d89737f')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,19 @@
from spack import *
class Pango(Package):
"""Pango is a library for laying out and rendering of text, with
an emphasis on internationalization. It can be used anywhere
that text layout is needed, though most of the work on Pango so
far has been done in the context of the GTK+ widget toolkit."""
homepage = "http://www.pango.org"
url = "http://ftp.gnome.org/pub/gnome/sources/pango/1.36/pango-1.36.8.tar.xz"
version('1.36.8', '217a9a753006275215fa9fa127760ece')
depends_on("harfbuzz")
depends_on("cairo")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,15 @@
from spack import *
class Pcre(Package):
"""The PCRE package contains Perl Compatible Regular Expression
libraries. These are useful for implementing regular expression
pattern matching using the same syntax and semantics as Perl 5."""
homepage = "http://www.pcre.org"""
url = "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.bz2"
version('8.36', 'b767bc9af0c20bc9c1fe403b0d41ad97')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,18 @@
from spack import *
class Pixman(Package):
"""The Pixman package contains a library that provides low-level
pixel manipulation features such as image compositing and
trapezoid rasterization."""
homepage = "http://www.pixman.org"
url = "http://cairographics.org/releases/pixman-0.32.6.tar.gz"
version('0.32.6', '3a30859719a41bd0f5cccffbfefdd4c2')
depends_on("libpng")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix,
"--disable-gtk")
make()
make("install")

View file

@ -0,0 +1,44 @@
from spack import *
class Qt(Package):
"""Qt is a comprehensive cross-platform C++ application framework."""
homepage = "http://qt.io"
version('4.8.6', '2edbe4d6c2eff33ef91732602f3518eb',
url="http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz")
# Use system openssl for security.
#depends_on("openssl")
depends_on("glib")
depends_on("gtkplus")
depends_on("libxml2")
depends_on("zlib")
depends_on("dbus")
depends_on("libtiff")
depends_on("libpng")
depends_on("libmng")
depends_on("jpeg")
def patch(self):
# Fix qmake compilers in the default mkspec
qmake_conf = 'mkspecs/common/g++-base.conf'
filter_file(r'^QMAKE_CC *=.*$', 'QMAKE_CC = cc', qmake_conf)
filter_file(r'^QMAKE_CXX *=.*$', 'QMAKE_CXX = c++', qmake_conf)
def install(self, spec, prefix):
configure('-v',
'-confirm-license',
'-opensource',
'-prefix', prefix,
'-openssl-linked',
'-dbus-linked',
'-fast',
'-optimized-qmake',
'-no-pch',
'-no-phonon',
'-no-phonon-backend',
'-no-openvg')
make()
make("install")

View file

@ -0,0 +1,21 @@
from spack import *
class Wget(Package):
"""GNU Wget is a free software package for retrieving files using
HTTP, HTTPS and FTP, the most widely-used Internet protocols. It
is a non-interactive commandline tool, so it may easily be called
from scripts, cron jobs, terminals without X-Windows support,
etc."""
homepage = "http://www.gnu.org/software/wget/"
url = "http://ftp.gnu.org/gnu/wget/wget-1.16.tar.xz"
version('1.16', 'fe102975ab3a6c049777883f1bb9ad07')
depends_on("openssl")
def install(self, spec, prefix):
configure("--prefix=%s" % prefix,
"--with-ssl=openssl")
make()
make("install")

View file

@ -0,0 +1,16 @@
from spack import *
class Xz(Package):
"""XZ Utils is free general-purpose data compression software with
high compression ratio. XZ Utils were written for POSIX-like
systems, but also work on some not-so-POSIX systems. XZ Utils are
the successor to LZMA Utils."""
homepage = "http://tukaani.org/xz/"
url = "http://tukaani.org/xz/xz-5.2.0.tar.bz2"
version('5.2.0', '867cc8611760240ebf3440bd6e170bb9')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")

View file

@ -0,0 +1,16 @@
from spack import *
class Yasm(Package):
"""Yasm is a complete rewrite of the NASM-2.11.06 assembler. It
supports the x86 and AMD64 instruction sets, accepts NASM and
GAS assembler syntaxes and outputs binary, ELF32 and ELF64
object formats."""
homepage = "http://yasm.tortall.net"
url = "http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz"
version('1.3.0', 'fc9e586751ff789b34b1f21d572d96af')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make()
make("install")