Merge remote-tracking branch 'upstream/develop' into pkg-numdiff

This commit is contained in:
Kelly (KT) Thompson 2016-03-30 15:35:46 -06:00
commit be2862ef4e
84 changed files with 2002 additions and 531 deletions

8
etc/spack/modules.yaml Normal file
View file

@ -0,0 +1,8 @@
# -------------------------------------------------------------------------
# This is the default spack module files generation configuration.
#
# Changes to this file will affect all users of this spack install,
# although users can override these settings in their ~/.spack/modules.yaml.
# -------------------------------------------------------------------------
modules:
enable: ['tcl', 'dotkit']

231
lib/spack/env/cc vendored
View file

@ -65,7 +65,7 @@ function die {
} }
for param in $parameters; do for param in $parameters; do
if [ -z "${!param}" ]; then if [[ -z ${!param} ]]; then
die "Spack compiler must be run from spack! Input $param was missing!" die "Spack compiler must be run from spack! Input $param was missing!"
fi fi
done done
@ -78,12 +78,17 @@ done
# 'command' is set based on the input command to $SPACK_[CC|CXX|F77|F90] # 'command' is set based on the input command to $SPACK_[CC|CXX|F77|F90]
# #
# 'mode' is set to one of: # 'mode' is set to one of:
# cpp preprocess
# cc compile # cc compile
# as assemble
# ld link # ld link
# ccld compile & link # ccld compile & link
# cpp preprocessor
# vcheck version check # vcheck version check
# #
# Depending on the mode, we may or may not add extra rpaths.
# This variable controls whether they are added.
add_rpaths=true
command=$(basename "$0") command=$(basename "$0")
case "$command" in case "$command" in
cc|c89|c99|gcc|clang|icc|pgcc|xlc) cc|c89|c99|gcc|clang|icc|pgcc|xlc)
@ -107,13 +112,26 @@ case "$command" in
;; ;;
ld) ld)
mode=ld mode=ld
# Darwin's linker has a -r argument that merges object files
# together. It doesn't work with -rpath.
if [[ $OSTYPE = darwin* ]]; then
for arg in "$@"; do
if [ "$arg" = -r ]; then
add_rpaths=false
break
fi
done
fi
;; ;;
*) *)
die "Unkown compiler: $command" die "Unkown compiler: $command"
;; ;;
esac esac
# If any of the arguments below is present then the mode is vcheck. In vcheck mode nothing is added in terms of extra search paths or libraries # If any of the arguments below is present then the mode is vcheck. In
# vcheck mode nothing is added in terms of extra search paths or
# libraries
if [ -z "$mode" ]; then if [ -z "$mode" ]; then
for arg in "$@"; do for arg in "$@"; do
if [ "$arg" = -v -o "$arg" = -V -o "$arg" = --version -o "$arg" = -dumpversion ]; then if [ "$arg" = -v -o "$arg" = -V -o "$arg" = --version -o "$arg" = -dumpversion ]; then
@ -124,13 +142,15 @@ if [ -z "$mode" ]; then
fi fi
# Finish setting up the mode. # Finish setting up the mode.
if [ -z "$mode" ]; then if [ -z "$mode" ]; then
mode=ccld mode=ccld
for arg in "$@"; do for arg in "$@"; do
if [ "$arg" = -E ]; then if [ "$arg" = -E ]; then
mode=cpp mode=cpp
break break
elif [ "$arg" = -S ]; then
mode=as
break
elif [ "$arg" = -c ]; then elif [ "$arg" = -c ]; then
mode=cc mode=cc
break break
@ -146,168 +166,56 @@ fi
# Check that at least one of the real commands was actually selected, # Check that at least one of the real commands was actually selected,
# otherwise we don't know what to execute. # otherwise we don't know what to execute.
if [ -z "$command" ]; then if [[ -z $command ]]; then
die "ERROR: Compiler '$SPACK_COMPILER_SPEC' does not support compiling $language programs." die "ERROR: Compiler '$SPACK_COMPILER_SPEC' does not support compiling $language programs."
fi fi
# Save original command for debug logging
input_command="$@"
if [ "$mode" == vcheck ] ; then if [ "$mode" == vcheck ] ; then
exec ${command} "$@" exec ${command} "$@"
fi fi
# # Save original command for debug logging
# Now do real parsing of the command line args, trying hard to keep input_command="$@"
# non-rpath linker arguments in the proper order w.r.t. other command args=("$@")
# line arguments. This is important for things like groups.
#
includes=()
libraries=()
libs=()
rpaths=()
other_args=()
while [ -n "$1" ]; do
case "$1" in
-I*)
arg="${1#-I}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
includes+=("$arg")
;;
-L*)
arg="${1#-L}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
libraries+=("$arg")
;;
-l*)
arg="${1#-l}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
libs+=("$arg")
;;
-Wl,*)
arg="${1#-Wl,}"
# TODO: Handle multiple -Wl, continuations of -Wl,-rpath
if [[ $arg == -rpath=* ]]; then
arg="${arg#-rpath=}"
for rpath in ${arg//,/ }; do
rpaths+=("$rpath")
done
elif [[ $arg == -rpath,* ]]; then
arg="${arg#-rpath,}"
for rpath in ${arg//,/ }; do
rpaths+=("$rpath")
done
elif [[ $arg == -rpath ]]; then
shift; arg="$1"
if [[ $arg != '-Wl,'* ]]; then
die "-Wl,-rpath was not followed by -Wl,*"
fi
arg="${arg#-Wl,}"
for rpath in ${arg//,/ }; do
rpaths+=("$rpath")
done
else
other_args+=("-Wl,$arg")
fi
;;
-Xlinker)
shift; arg="$1";
if [[ $arg = -rpath=* ]]; then
rpaths+=("${arg#-rpath=}")
elif [[ $arg = -rpath ]]; then
shift; arg="$1"
if [[ $arg != -Xlinker ]]; then
die "-Xlinker -rpath was not followed by -Xlinker <arg>"
fi
shift; arg="$1"
rpaths+=("$arg")
else
other_args+=("-Xlinker")
other_args+=("$arg")
fi
;;
*)
other_args+=("$1")
;;
esac
shift
done
# Dump parsed values for unit testing if asked for
if [ -n "$SPACK_TEST_COMMAND" ]; then
IFS=$'\n'
case "$SPACK_TEST_COMMAND" in
dump-includes) echo "${includes[*]}";;
dump-libraries) echo "${libraries[*]}";;
dump-libs) echo "${libs[*]}";;
dump-rpaths) echo "${rpaths[*]}";;
dump-other-args) echo "${other_args[*]}";;
dump-all)
echo "INCLUDES:"
echo "${includes[*]}"
echo
echo "LIBRARIES:"
echo "${libraries[*]}"
echo
echo "LIBS:"
echo "${libs[*]}"
echo
echo "RPATHS:"
echo "${rpaths[*]}"
echo
echo "ARGS:"
echo "${other_args[*]}"
;;
*)
echo "ERROR: Unknown test command"
exit 1 ;;
esac
exit
fi
# Read spack dependencies from the path environment variable # Read spack dependencies from the path environment variable
IFS=':' read -ra deps <<< "$SPACK_DEPENDENCIES" IFS=':' read -ra deps <<< "$SPACK_DEPENDENCIES"
for dep in "${deps[@]}"; do for dep in "${deps[@]}"; do
if [ -d "$dep/include" ]; then # Prepend include directories
includes+=("$dep/include") if [[ -d $dep/include ]]; then
if [[ $mode = cpp || $mode = cc || $mode = as || $mode = ccld ]]; then
args=("-I$dep/include" "${args[@]}")
fi
fi fi
if [ -d "$dep/lib" ]; then # Prepend lib and RPATH directories
libraries+=("$dep/lib") if [[ -d $dep/lib ]]; then
rpaths+=("$dep/lib") if [[ $mode = ccld ]]; then
$add_rpaths && args=("-Wl,-rpath,$dep/lib" "${args[@]}")
args=("-L$dep/lib" "${args[@]}")
elif [[ $mode = ld ]]; then
$add_rpaths && args=("-rpath" "$dep/lib" "${args[@]}")
args=("-L$dep/lib" "${args[@]}")
fi
fi fi
if [ -d "$dep/lib64" ]; then # Prepend lib64 and RPATH directories
libraries+=("$dep/lib64") if [[ -d $dep/lib64 ]]; then
rpaths+=("$dep/lib64") if [[ $mode = ccld ]]; then
$add_rpaths && args=("-Wl,-rpath,$dep/lib64" "${args[@]}")
args=("-L$dep/lib64" "${args[@]}")
elif [[ $mode = ld ]]; then
$add_rpaths && args=("-rpath" "$dep/lib64" "${args[@]}")
args=("-L$dep/lib64" "${args[@]}")
fi
fi fi
done done
# Include all -L's and prefix/whatever dirs in rpath # Include all -L's and prefix/whatever dirs in rpath
for dir in "${libraries[@]}"; do if [[ $mode = ccld ]]; then
[[ dir = $SPACK_INSTALL* ]] && rpaths+=("$dir") $add_rpaths && args=("-Wl,-rpath,$SPACK_PREFIX/lib" "-Wl,-rpath,$SPACK_PREFIX/lib64" "${args[@]}")
done elif [[ $mode = ld ]]; then
rpaths+=("$SPACK_PREFIX/lib") $add_rpaths && args=("-rpath" "$SPACK_PREFIX/lib" "-rpath" "$SPACK_PREFIX/lib64" "${args[@]}")
rpaths+=("$SPACK_PREFIX/lib64")
# Put the arguments together
args=()
for dir in "${includes[@]}"; do args+=("-I$dir"); done
args+=("${other_args[@]}")
for dir in "${libraries[@]}"; do args+=("-L$dir"); done
for lib in "${libs[@]}"; do args+=("-l$lib"); done
if [ "$mode" = ccld ]; then
for dir in "${rpaths[@]}"; do
args+=("-Wl,-rpath")
args+=("-Wl,$dir");
done
elif [ "$mode" = ld ]; then
for dir in "${rpaths[@]}"; do
args+=("-rpath")
args+=("$dir");
done
fi fi
# #
@ -323,34 +231,37 @@ unset DYLD_LIBRARY_PATH
# #
IFS=':' read -ra env_path <<< "$PATH" IFS=':' read -ra env_path <<< "$PATH"
IFS=':' read -ra spack_env_dirs <<< "$SPACK_ENV_PATH" IFS=':' read -ra spack_env_dirs <<< "$SPACK_ENV_PATH"
spack_env_dirs+=(".") spack_env_dirs+=("" ".")
PATH="" PATH=""
for dir in "${env_path[@]}"; do for dir in "${env_path[@]}"; do
remove="" remove=""
for rm_dir in "${spack_env_dirs[@]}"; do for rm_dir in "${spack_env_dirs[@]}"; do
if [ "$dir" = "$rm_dir" ]; then remove=True; fi if [[ $dir = $rm_dir ]]; then remove=True; fi
done done
if [ -z "$remove" ]; then if [[ -z $remove ]]; then
if [ -z "$PATH" ]; then PATH="${PATH:+$PATH:}$dir"
PATH="$dir"
else
PATH="$PATH:$dir"
fi
fi fi
done done
export PATH export PATH
full_command=("$command") full_command=("$command" "${args[@]}")
full_command+=("${args[@]}")
# In test command mode, write out full command for Spack tests.
if [[ $SPACK_TEST_COMMAND = dump-args ]]; then
echo "${full_command[@]}"
exit
elif [[ -n $SPACK_TEST_COMMAND ]]; then
die "ERROR: Unknown test command"
fi
# #
# Write the input and output commands to debug logs if it's asked for. # Write the input and output commands to debug logs if it's asked for.
# #
if [ "$SPACK_DEBUG" = "TRUE" ]; then if [[ $SPACK_DEBUG = TRUE ]]; then
input_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.in.log" input_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.in.log"
output_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.out.log" output_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.out.log"
echo "$input_command" >> $input_log echo "[$mode] $command $input_command" >> $input_log
echo "$mode ${full_command[@]}" >> $output_log echo "[$mode] ${full_command[@]}" >> $output_log
fi fi
exec "${full_command[@]}" exec "${full_command[@]}"

View file

@ -27,9 +27,10 @@
'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file', 'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink', 'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
'set_executable', 'copy_mode', 'unset_executable_mode', 'set_executable', 'copy_mode', 'unset_executable_mode',
'remove_dead_links', 'remove_linked_tree'] 'remove_dead_links', 'remove_linked_tree', 'fix_darwin_install_name']
import os import os
import glob
import sys import sys
import re import re
import shutil import shutil
@ -38,6 +39,7 @@
import getpass import getpass
from contextlib import contextmanager, closing from contextlib import contextmanager, closing
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
import subprocess
import llnl.util.tty as tty import llnl.util.tty as tty
from spack.util.compression import ALLOWED_ARCHIVE_TYPES from spack.util.compression import ALLOWED_ARCHIVE_TYPES
@ -392,3 +394,29 @@ def remove_linked_tree(path):
os.unlink(path) os.unlink(path)
else: else:
shutil.rmtree(path, True) shutil.rmtree(path, True)
def fix_darwin_install_name(path):
"""
Fix install name of dynamic libraries on Darwin to have full path.
There are two parts of this task:
(i) use install_name('-id',...) to change install name of a single lib;
(ii) use install_name('-change',...) to change the cross linking between libs.
The function assumes that all libraries are in one folder and currently won't
follow subfolders.
Args:
path: directory in which .dylib files are alocated
"""
libs = glob.glob(join_path(path,"*.dylib"))
for lib in libs:
# fix install name first:
subprocess.Popen(["install_name_tool", "-id",lib,lib], stdout=subprocess.PIPE).communicate()[0]
long_deps = subprocess.Popen(["otool", "-L",lib], stdout=subprocess.PIPE).communicate()[0].split('\n')
deps = [dep.partition(' ')[0][1::] for dep in long_deps[2:-1]]
# fix all dependencies:
for dep in deps:
for loc in libs:
if dep == os.path.basename(loc):
subprocess.Popen(["install_name_tool", "-change",dep,loc,lib], stdout=subprocess.PIPE).communicate()[0]
break

View file

@ -117,7 +117,8 @@ def caller_locals():
scope. Yes, this is some black magic, and yes it's useful scope. Yes, this is some black magic, and yes it's useful
for implementing things like depends_on and provides. for implementing things like depends_on and provides.
""" """
stack = inspect.stack() # Passing zero here skips line context for speed.
stack = inspect.stack(0)
try: try:
return stack[2][0].f_locals return stack[2][0].f_locals
finally: finally:
@ -128,7 +129,8 @@ def get_calling_module_name():
"""Make sure that the caller is a class definition, and return the """Make sure that the caller is a class definition, and return the
enclosing module's name. enclosing module's name.
""" """
stack = inspect.stack() # Passing zero here skips line context for speed.
stack = inspect.stack(0)
try: try:
# Make sure locals contain __module__ # Make sure locals contain __module__
caller_locals = stack[2][0].f_locals caller_locals = stack[2][0].f_locals

View file

@ -225,7 +225,7 @@ def set_module_variables_for_package(pkg, module):
m.spack_cc = join_path(link_dir, pkg.compiler.link_paths['cc']) m.spack_cc = join_path(link_dir, pkg.compiler.link_paths['cc'])
m.spack_cxx = join_path(link_dir, pkg.compiler.link_paths['cxx']) m.spack_cxx = join_path(link_dir, pkg.compiler.link_paths['cxx'])
m.spack_f77 = join_path(link_dir, pkg.compiler.link_paths['f77']) m.spack_f77 = join_path(link_dir, pkg.compiler.link_paths['f77'])
m.spack_f90 = join_path(link_dir, pkg.compiler.link_paths['fc']) m.spack_fc = join_path(link_dir, pkg.compiler.link_paths['fc'])
# Emulate some shell commands for convenience # Emulate some shell commands for convenience
m.pwd = os.getcwd m.pwd = os.getcwd
@ -270,32 +270,56 @@ def parent_class_modules(cls):
return result return result
def setup_module_variables_for_dag(pkg):
"""Set module-scope variables for all packages in the DAG."""
for spec in pkg.spec.traverse(order='post'):
# If a user makes their own package repo, e.g.
# spack.repos.mystuff.libelf.Libelf, and they inherit from
# an existing class like spack.repos.original.libelf.Libelf,
# then set the module variables for both classes so the
# parent class can still use them if it gets called.
spkg = spec.package
modules = parent_class_modules(spkg.__class__)
for mod in modules:
set_module_variables_for_package(spkg, mod)
set_module_variables_for_package(spkg, spkg.module)
def setup_package(pkg): def setup_package(pkg):
"""Execute all environment setup routines.""" """Execute all environment setup routines."""
spack_env = EnvironmentModifications() spack_env = EnvironmentModifications()
run_env = EnvironmentModifications() run_env = EnvironmentModifications()
# Before proceeding, ensure that specs and packages are consistent
#
# This is a confusing behavior due to how packages are
# constructed. `setup_dependent_package` may set attributes on
# specs in the DAG for use by other packages' install
# method. However, spec.package will look up a package via
# spack.repo, which defensively copies specs into packages. This
# code ensures that all packages in the DAG have pieces of the
# same spec object at build time.
#
# This is safe for the build process, b/c the build process is a
# throwaway environment, but it is kind of dirty.
#
# TODO: Think about how to avoid this fix and do something cleaner.
for s in pkg.spec.traverse(): s.package.spec = s
set_compiler_environment_variables(pkg, spack_env) set_compiler_environment_variables(pkg, spack_env)
set_build_environment_variables(pkg, spack_env) set_build_environment_variables(pkg, spack_env)
setup_module_variables_for_dag(pkg)
# If a user makes their own package repo, e.g.
# spack.repos.mystuff.libelf.Libelf, and they inherit from
# an existing class like spack.repos.original.libelf.Libelf,
# then set the module variables for both classes so the
# parent class can still use them if it gets called.
modules = parent_class_modules(pkg.__class__)
for mod in modules:
set_module_variables_for_package(pkg, mod)
# Allow dependencies to modify the module # Allow dependencies to modify the module
for dependency_spec in pkg.spec.traverse(root=False): spec = pkg.spec
for dependency_spec in spec.traverse(root=False):
dpkg = dependency_spec.package dpkg = dependency_spec.package
dpkg.setup_dependent_python_module(pkg.module, pkg.spec) dpkg.setup_dependent_package(pkg.module, spec)
# Allow dependencies to set up environment as well # Allow dependencies to set up environment as well
for dependency_spec in pkg.spec.traverse(root=False): for dependency_spec in spec.traverse(root=False):
dpkg = dependency_spec.package dpkg = dependency_spec.package
dpkg.setup_dependent_environment(spack_env, run_env, pkg.spec) dpkg.setup_dependent_environment(spack_env, run_env, spec)
# Allow the package to apply some settings. # Allow the package to apply some settings.
pkg.setup_environment(spack_env, run_env) pkg.setup_environment(spack_env, run_env)

View file

@ -52,7 +52,7 @@ def print_text_info(pkg):
print "Safe versions: " print "Safe versions: "
if not pkg.versions: if not pkg.versions:
print("None") print(" None")
else: else:
pad = padder(pkg.versions, 4) pad = padder(pkg.versions, 4)
for v in reversed(sorted(pkg.versions)): for v in reversed(sorted(pkg.versions)):
@ -62,7 +62,7 @@ def print_text_info(pkg):
print print
print "Variants:" print "Variants:"
if not pkg.variants: if not pkg.variants:
print "None" print " None"
else: else:
pad = padder(pkg.variants, 4) pad = padder(pkg.variants, 4)

View file

@ -159,6 +159,10 @@ def concretize_version(self, spec):
if any(v.satisfies(sv) for sv in spec.versions)], if any(v.satisfies(sv) for sv in spec.versions)],
cmp=cmp_versions) cmp=cmp_versions)
def prefer_key(v):
return pkg.versions.get(Version(v)).get('preferred', False)
valid_versions.sort(key=prefer_key, reverse=True)
if valid_versions: if valid_versions:
spec.versions = ver([valid_versions[0]]) spec.versions = ver([valid_versions[0]])
else: else:

View file

@ -237,7 +237,29 @@
'type' : 'object', 'type' : 'object',
'default' : {}, 'default' : {},
} }
},},},},},} },},},},},},
'modules': {
'$schema': 'http://json-schema.org/schema#',
'title': 'Spack module file configuration file schema',
'type': 'object',
'additionalProperties': False,
'patternProperties': {
r'modules:?': {
'type': 'object',
'default': {},
'additionalProperties': False,
'properties': {
'enable': {
'type': 'array',
'default': [],
'items': {
'type': 'string'
}
}
}
},
},
},
} }
"""OrderedDict of config scopes keyed by name. """OrderedDict of config scopes keyed by name.
@ -405,11 +427,11 @@ def _read_config_file(filename, schema):
validate_section(data, schema) validate_section(data, schema)
return data return data
except MarkedYAMLError, e: except MarkedYAMLError as e:
raise ConfigFileError( raise ConfigFileError(
"Error parsing yaml%s: %s" % (str(e.context_mark), e.problem)) "Error parsing yaml%s: %s" % (str(e.context_mark), e.problem))
except IOError, e: except IOError as e:
raise ConfigFileError( raise ConfigFileError(
"Error reading configuration file %s: %s" % (filename, str(e))) "Error reading configuration file %s: %s" % (filename, str(e)))

View file

@ -289,8 +289,14 @@ def reset(self):
if not self.archive_file: if not self.archive_file:
raise NoArchiveFileError("Tried to reset URLFetchStrategy before fetching", raise NoArchiveFileError("Tried to reset URLFetchStrategy before fetching",
"Failed on reset() for URL %s" % self.url) "Failed on reset() for URL %s" % self.url)
if self.stage.source_path:
shutil.rmtree(self.stage.source_path, ignore_errors=True) # Remove everythigng but the archive from the stage
for filename in os.listdir(self.stage.path):
abspath = os.path.join(self.stage.path, filename)
if abspath != self.archive_file:
shutil.rmtree(abspath, ignore_errors=True)
# Expand the archive again
self.expand() self.expand()
def __repr__(self): def __repr__(self):

View file

@ -48,6 +48,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack import spack
import spack.config
from llnl.util.filesystem import join_path, mkdirp from llnl.util.filesystem import join_path, mkdirp
from spack.environment import * from spack.environment import *
@ -56,6 +57,8 @@
# Registry of all types of modules. Entries created by EnvModule's metaclass # Registry of all types of modules. Entries created by EnvModule's metaclass
module_types = {} module_types = {}
CONFIGURATION = spack.config.get_config('modules')
def print_help(): def print_help():
"""For use by commands to tell user how to activate shell support.""" """For use by commands to tell user how to activate shell support."""
@ -115,7 +118,7 @@ class EnvModule(object):
class __metaclass__(type): class __metaclass__(type):
def __init__(cls, name, bases, dict): def __init__(cls, name, bases, dict):
type.__init__(cls, name, bases, dict) type.__init__(cls, name, bases, dict)
if cls.name != 'env_module': if cls.name != 'env_module' and cls.name in CONFIGURATION['enable']:
module_types[cls.name] = cls module_types[cls.name] = cls
def __init__(self, spec=None): def __init__(self, spec=None):
@ -158,13 +161,13 @@ def write(self):
# Let the extendee modify their extensions before asking for # Let the extendee modify their extensions before asking for
# package-specific modifications # package-specific modifications
for extendee in self.pkg.extendees: spack_env = EnvironmentModifications()
extendee_spec = self.spec[extendee] for item in self.pkg.extendees:
extendee_spec.package.modify_module( package = self.spec[item].package
self.pkg.module, extendee_spec, self.spec) package.setup_dependent_package(self.pkg.module, self.spec)
package.setup_dependent_environment(spack_env, env, self.spec)
# Package-specific environment modifications # Package-specific environment modifications
spack_env = EnvironmentModifications()
self.spec.package.setup_environment(spack_env, env) self.spec.package.setup_environment(spack_env, env)
# TODO : implement site-specific modifications and filters # TODO : implement site-specific modifications and filters
@ -275,6 +278,6 @@ def write_header(self, module_file):
# Long description # Long description
if self.long_description: if self.long_description:
module_file.write('proc ModulesHelp { } {\n') module_file.write('proc ModulesHelp { } {\n')
doc = re.sub(r'"', '\"', self.long_description) for line in textwrap.wrap(self.long_description, 72):
module_file.write("puts stderr \"%s\"\n" % doc) module_file.write("puts stderr \"%s\"\n" % line)
module_file.write('}\n\n') module_file.write('}\n\n')

View file

@ -1075,7 +1075,7 @@ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
self.setup_environment(spack_env, run_env) self.setup_environment(spack_env, run_env)
def setup_dependent_python_module(self, module, dependent_spec): def setup_dependent_package(self, module, dependent_spec):
"""Set up Python module-scope variables for dependent packages. """Set up Python module-scope variables for dependent packages.
Called before the install() method of dependents. Called before the install() method of dependents.

View file

@ -28,6 +28,8 @@
""" """
import os import os
import unittest import unittest
import tempfile
import shutil
from llnl.util.filesystem import * from llnl.util.filesystem import *
import spack import spack
@ -55,13 +57,40 @@ def setUp(self):
self.ld = Executable(join_path(spack.build_env_path, "ld")) self.ld = Executable(join_path(spack.build_env_path, "ld"))
self.cpp = Executable(join_path(spack.build_env_path, "cpp")) self.cpp = Executable(join_path(spack.build_env_path, "cpp"))
os.environ['SPACK_CC'] = "/bin/mycc" self.realcc = "/bin/mycc"
os.environ['SPACK_PREFIX'] = "/usr" self.prefix = "/spack-test-prefix"
os.environ['SPACK_CC'] = self.realcc
os.environ['SPACK_PREFIX'] = self.prefix
os.environ['SPACK_ENV_PATH']="test" os.environ['SPACK_ENV_PATH']="test"
os.environ['SPACK_DEBUG_LOG_DIR'] = "." os.environ['SPACK_DEBUG_LOG_DIR'] = "."
os.environ['SPACK_COMPILER_SPEC'] = "gcc@4.4.7" os.environ['SPACK_COMPILER_SPEC'] = "gcc@4.4.7"
os.environ['SPACK_SHORT_SPEC'] = "foo@1.2" os.environ['SPACK_SHORT_SPEC'] = "foo@1.2"
# Make some fake dependencies
self.tmp_deps = tempfile.mkdtemp()
self.dep1 = join_path(self.tmp_deps, 'dep1')
self.dep2 = join_path(self.tmp_deps, 'dep2')
self.dep3 = join_path(self.tmp_deps, 'dep3')
self.dep4 = join_path(self.tmp_deps, 'dep4')
mkdirp(join_path(self.dep1, 'include'))
mkdirp(join_path(self.dep1, 'lib'))
mkdirp(join_path(self.dep2, 'lib64'))
mkdirp(join_path(self.dep3, 'include'))
mkdirp(join_path(self.dep3, 'lib64'))
mkdirp(join_path(self.dep4, 'include'))
if 'SPACK_DEPENDENCIES' in os.environ:
del os.environ['SPACK_DEPENDENCIES']
def tearDown(self):
shutil.rmtree(self.tmp_deps, True)
def check_cc(self, command, args, expected): def check_cc(self, command, args, expected):
os.environ['SPACK_TEST_COMMAND'] = command os.environ['SPACK_TEST_COMMAND'] = command
@ -92,6 +121,10 @@ def test_cpp_mode(self):
self.check_cpp('dump-mode', [], "cpp") self.check_cpp('dump-mode', [], "cpp")
def test_as_mode(self):
self.check_cc('dump-mode', ['-S'], "as")
def test_ccld_mode(self): def test_ccld_mode(self):
self.check_cc('dump-mode', [], "ccld") self.check_cc('dump-mode', [], "ccld")
self.check_cc('dump-mode', ['foo.c', '-o', 'foo'], "ccld") self.check_cc('dump-mode', ['foo.c', '-o', 'foo'], "ccld")
@ -104,27 +137,85 @@ def test_ld_mode(self):
self.check_ld('dump-mode', ['foo.o', 'bar.o', 'baz.o', '-o', 'foo', '-Wl,-rpath,foo'], "ld") self.check_ld('dump-mode', ['foo.o', 'bar.o', 'baz.o', '-o', 'foo', '-Wl,-rpath,foo'], "ld")
def test_includes(self): def test_dep_rpath(self):
self.check_cc('dump-includes', test_command, """Ensure RPATHs for root package are added."""
"\n".join(["/test/include", "/other/include"])) self.check_cc('dump-args', test_command,
self.realcc + ' ' +
'-Wl,-rpath,' + self.prefix + '/lib ' +
'-Wl,-rpath,' + self.prefix + '/lib64 ' +
' '.join(test_command))
def test_libraries(self): def test_dep_include(self):
self.check_cc('dump-libraries', test_command, """Ensure a single dependency include directory is added."""
"\n".join(["/test/lib", "/other/lib"])) os.environ['SPACK_DEPENDENCIES'] = self.dep4
self.check_cc('dump-args', test_command,
self.realcc + ' ' +
'-Wl,-rpath,' + self.prefix + '/lib ' +
'-Wl,-rpath,' + self.prefix + '/lib64 ' +
'-I' + self.dep4 + '/include ' +
' '.join(test_command))
def test_libs(self): def test_dep_lib(self):
self.check_cc('dump-libs', test_command, """Ensure a single dependency RPATH is added."""
"\n".join(["lib1", "lib2", "lib3", "lib4"])) os.environ['SPACK_DEPENDENCIES'] = self.dep2
self.check_cc('dump-args', test_command,
self.realcc + ' ' +
'-Wl,-rpath,' + self.prefix + '/lib ' +
'-Wl,-rpath,' + self.prefix + '/lib64 ' +
'-L' + self.dep2 + '/lib64 ' +
'-Wl,-rpath,' + self.dep2 + '/lib64 ' +
' '.join(test_command))
def test_rpaths(self): def test_all_deps(self):
self.check_cc('dump-rpaths', test_command, """Ensure includes and RPATHs for all deps are added. """
"\n".join(["/first/rpath", "/second/rpath", "/third/rpath", "/fourth/rpath"])) os.environ['SPACK_DEPENDENCIES'] = ':'.join([
self.dep1, self.dep2, self.dep3, self.dep4])
# This is probably more constrained than it needs to be; it
# checks order within prepended args and doesn't strictly have
# to. We could loosen that if it becomes necessary
self.check_cc('dump-args', test_command,
self.realcc + ' ' +
'-Wl,-rpath,' + self.prefix + '/lib ' +
'-Wl,-rpath,' + self.prefix + '/lib64 ' +
'-I' + self.dep4 + '/include ' +
'-L' + self.dep3 + '/lib64 ' +
'-Wl,-rpath,' + self.dep3 + '/lib64 ' +
'-I' + self.dep3 + '/include ' +
'-L' + self.dep2 + '/lib64 ' +
'-Wl,-rpath,' + self.dep2 + '/lib64 ' +
'-L' + self.dep1 + '/lib ' +
'-Wl,-rpath,' + self.dep1 + '/lib ' +
'-I' + self.dep1 + '/include ' +
' '.join(test_command))
def test_other_args(self): def test_ld_deps(self):
self.check_cc('dump-other-args', test_command, """Ensure no (extra) -I args or -Wl, are passed in ld mode."""
"\n".join(["arg1", "-Wl,--start-group", "arg2", "arg3", "arg4", os.environ['SPACK_DEPENDENCIES'] = ':'.join([
"-Wl,--end-group", "arg5", "arg6"])) self.dep1, self.dep2, self.dep3, self.dep4])
self.check_ld('dump-args', test_command,
'ld ' +
'-rpath ' + self.prefix + '/lib ' +
'-rpath ' + self.prefix + '/lib64 ' +
'-L' + self.dep3 + '/lib64 ' +
'-rpath ' + self.dep3 + '/lib64 ' +
'-L' + self.dep2 + '/lib64 ' +
'-rpath ' + self.dep2 + '/lib64 ' +
'-L' + self.dep1 + '/lib ' +
'-rpath ' + self.dep1 + '/lib ' +
' '.join(test_command))

View file

@ -24,6 +24,7 @@
############################################################################## ##############################################################################
import spack import spack
from spack.spec import Spec, CompilerSpec from spack.spec import Spec, CompilerSpec
from spack.version import ver
from spack.concretize import find_spec from spack.concretize import find_spec
from spack.test.mock_packages_test import * from spack.test.mock_packages_test import *
@ -77,6 +78,14 @@ def test_concretize_variant(self):
self.check_concretize('mpich') self.check_concretize('mpich')
def test_concretize_preferred_version(self):
spec = self.check_concretize('python')
self.assertEqual(spec.versions, ver('2.7.11'))
spec = self.check_concretize('python@3.5.1')
self.assertEqual(spec.versions, ver('3.5.1'))
def test_concretize_with_virtual(self): def test_concretize_with_virtual(self):
self.check_concretize('mpileaks ^mpi') self.check_concretize('mpileaks ^mpi')
self.check_concretize('mpileaks ^mpi@:1.1') self.check_concretize('mpileaks ^mpi@:1.1')

View file

@ -0,0 +1,43 @@
##############################################################################
# Copyright (c) 2013-2015, 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://github.com/llnl/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
##############################################################################
from spack import *
class Python(Package):
"""Dummy Python package to demonstrate preferred versions."""
homepage = "http://www.python.org"
url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
extendable = True
version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True)
version('2.7.10', 'd7547558fd673bd9d38e2108c6b42521')
version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
def install(self, spec, prefix):
pass

View file

@ -0,0 +1,44 @@
##############################################################################
# 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://github.com/llnl/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
##############################################################################
from spack import *
class AprUtil(Package):
"""Apache Portable Runtime Utility"""
homepage = 'https://apr.apache.org/'
url = 'http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz'
version('1.5.4', '866825c04da827c6e5f53daff5569f42')
depends_on('apr')
def install(self, spec, prefix):
# configure, build, install:
options = ['--prefix=%s' % prefix]
options.append('--with-apr=%s' % spec['apr'].prefix)
configure(*options)
make()
make('install')

View file

@ -0,0 +1,38 @@
##############################################################################
# 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://github.com/llnl/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
##############################################################################
from spack import *
class Apr(Package):
"""Apache portable runtime."""
homepage = 'https://apr.apache.org/'
url = 'http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz'
version('1.5.2', '98492e965963f852ab29f9e61b2ad700')
def install(self, spec, prefix):
options = ['--prefix=%s' % prefix]
configure(*options)
make()
make('install')

View file

@ -35,6 +35,10 @@ class ArpackNg(Package):
variant('shared', default=True, description='Enables the build of shared libraries') variant('shared', default=True, description='Enables the build of shared libraries')
variant('mpi', default=False, description='Activates MPI support') variant('mpi', default=False, description='Activates MPI support')
# The function pdlamch10 does not set the return variable. This is fixed upstream
# see https://github.com/opencollab/arpack-ng/issues/34
patch('pdlamch10.patch', when='@3.3:')
depends_on('blas') depends_on('blas')
depends_on('lapack') depends_on('lapack')
depends_on('mpi', when='+mpi') depends_on('mpi', when='+mpi')
@ -46,7 +50,10 @@ def install(self, spec, prefix):
options = ['--prefix=%s' % prefix] options = ['--prefix=%s' % prefix]
if '+mpi' in spec: if '+mpi' in spec:
options.append('--enable-mpi') options.extend([
'--enable-mpi',
'F77=mpif77' #FIXME: avoid hardcoding MPI wrapper names
])
if '~shared' in spec: if '~shared' in spec:
options.append('--enable-shared=no') options.append('--enable-shared=no')

View file

@ -0,0 +1,15 @@
diff --git a/PARPACK/SRC/MPI/pdlamch10.f b/PARPACK/SRC/MPI/pdlamch10.f
index 6571da9..2882c2e 100644
--- a/PARPACK/SRC/MPI/pdlamch10.f
+++ b/PARPACK/SRC/MPI/pdlamch10.f
@@ -86,8 +86,8 @@
TEMP = TEMP1
END IF
*
- PDLAMCH = TEMP
+ PDLAMCH10 = TEMP
*
-* End of PDLAMCH
+* End of PDLAMCH10
*
END

View file

@ -0,0 +1,17 @@
from spack import *
import os
class Astyle(Package):
"""A Free, Fast, and Small Automatic Formatter for C, C++, C++/CLI, Objective-C, C#, and Java Source Code."""
homepage = "http://astyle.sourceforge.net/"
url = "http://downloads.sourceforge.net/project/astyle/astyle/astyle%202.04/astyle_2.04_linux.tar.gz"
version('2.04', '30b1193a758b0909d06e7ee8dd9627f6')
def install(self, spec, prefix):
with working_dir('src'):
make('-f',
join_path(self.stage.source_path,'build','clang','Makefile'),
parallel=False)
install(join_path(self.stage.source_path, 'src','bin','astyle'), self.prefix.bin)

View file

@ -1,31 +1,36 @@
from spack import * from spack import *
from spack.util.executable import Executable from spack.util.executable import Executable
import os import os.path
class Atlas(Package): class Atlas(Package):
""" """
Automatically Tuned Linear Algebra Software, generic shared Automatically Tuned Linear Algebra Software, generic shared ATLAS is an approach for the automatic generation and
ATLAS is an approach for the automatic generation and optimization of optimization of numerical software. Currently ATLAS supplies optimized versions for the complete set of linear
numerical software. Currently ATLAS supplies optimized versions for the algebra kernels known as the Basic Linear Algebra Subroutines (BLAS), and a subset of the linear algebra routines
complete set of linear algebra kernels known as the Basic Linear Algebra in the LAPACK library.
Subroutines (BLAS), and a subset of the linear algebra routines in the
LAPACK library.
""" """
homepage = "http://math-atlas.sourceforge.net/" homepage = "http://math-atlas.sourceforge.net/"
version('3.10.2', 'a4e21f343dec8f22e7415e339f09f6da',
url='http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.2/atlas3.10.2.tar.bz2', preferred=True)
resource(name='lapack',
url='http://www.netlib.org/lapack/lapack-3.5.0.tgz',
md5='b1d3e3e425b2e44a06760ff173104bdf',
destination='spack-resource-lapack',
when='@3:')
version('3.11.34', '0b6c5389c095c4c8785fd0f724ec6825', version('3.11.34', '0b6c5389c095c4c8785fd0f724ec6825',
url='http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2/download') url='http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2/download')
version('3.10.2', 'a4e21f343dec8f22e7415e339f09f6da',
url='http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.2/atlas3.10.2.tar.bz2')
# TODO: make this provide BLAS once it works better. Create a way variant('shared', default=True, description='Builds shared library')
# TODO: to mark "beta" packages and require explicit invocation.
# provides('blas') provides('blas')
provides('lapack')
parallel = False
def patch(self): def patch(self):
# Disable thraed check. LLNL's environment does not allow # Disable thread check. LLNL's environment does not allow
# disabling of CPU throttling in a way that ATLAS actually # disabling of CPU throttling in a way that ATLAS actually
# understands. # understands.
filter_file(r'^\s+if \(thrchk\) exit\(1\);', 'if (0) exit(1);', filter_file(r'^\s+if \(thrchk\) exit\(1\);', 'if (0) exit(1);',
@ -33,26 +38,21 @@ def patch(self):
# TODO: investigate a better way to add the check back in # TODO: investigate a better way to add the check back in
# TODO: using, say, MSRs. Or move this to a variant. # TODO: using, say, MSRs. Or move this to a variant.
@when('@:3.10')
def install(self, spec, prefix): def install(self, spec, prefix):
with working_dir('ATLAS-Build', create=True):
options = []
if '+shared' in spec:
options.append('--shared')
# Lapack resource
lapack_stage = self.stage[1]
lapack_tarfile = os.path.basename(lapack_stage.fetcher.url)
lapack_tarfile_path = join_path(lapack_stage.path, lapack_tarfile)
options.append('--with-netlib-lapack-tarfile=%s' % lapack_tarfile_path)
with working_dir('spack-build', create=True):
configure = Executable('../configure') configure = Executable('../configure')
configure('--prefix=%s' % prefix, '-C', 'ic', 'cc', '-C', 'if', 'f77', "--dylibs") configure('--prefix=%s' % prefix, *options)
make()
make('check')
make('ptcheck')
make('time')
make("install")
def install(self, spec, prefix):
with working_dir('ATLAS-Build', create=True):
configure = Executable('../configure')
configure('--incdir=%s' % prefix.include,
'--libdir=%s' % prefix.lib,
'--cc=cc',
"--shared")
make() make()
make('check') make('check')
make('ptcheck') make('ptcheck')

View file

@ -1,5 +1,9 @@
from spack import * from spack import *
import spack import spack
import sys
import os
import sys
class Boost(Package): class Boost(Package):
"""Boost provides free peer-reviewed portable C++ source """Boost provides free peer-reviewed portable C++ source
@ -45,34 +49,34 @@ class Boost(Package):
version('1.34.1', '2d938467e8a448a2c9763e0a9f8ca7e5') version('1.34.1', '2d938467e8a448a2c9763e0a9f8ca7e5')
version('1.34.0', 'ed5b9291ffad776f8757a916e1726ad0') version('1.34.0', 'ed5b9291ffad776f8757a916e1726ad0')
default_install_libs = set(['atomic', default_install_libs = set(['atomic',
'chrono', 'chrono',
'date_time', 'date_time',
'filesystem', 'filesystem',
'graph', 'graph',
'iostreams', 'iostreams',
'locale', 'locale',
'log', 'log',
'math', 'math',
'program_options', 'program_options',
'random', 'random',
'regex', 'regex',
'serialization', 'serialization',
'signals', 'signals',
'system', 'system',
'test', 'test',
'thread', 'thread',
'wave']) 'wave'])
# mpi/python are not installed by default because they pull in many # mpi/python are not installed by default because they pull in many
# dependencies and/or because there is a great deal of customization # dependencies and/or because there is a great deal of customization
# possible (and it would be difficult to choose sensible defaults) # possible (and it would be difficult to choose sensible defaults)
default_noinstall_libs = set(['mpi', 'python']) default_noinstall_libs = set(['mpi', 'python'])
all_libs = default_install_libs | default_noinstall_libs all_libs = default_install_libs | default_noinstall_libs
for lib in all_libs: for lib in all_libs:
variant(lib, default=(lib not in default_noinstall_libs), variant(lib, default=(lib not in default_noinstall_libs),
description="Compile with {0} library".format(lib)) description="Compile with {0} library".format(lib))
variant('debug', default=False, description='Switch to the debug version of Boost') variant('debug', default=False, description='Switch to the debug version of Boost')
@ -124,9 +128,9 @@ def determine_bootstrap_options(self, spec, withLibs, options):
with open('user-config.jam', 'w') as f: with open('user-config.jam', 'w') as f:
compiler_wrapper = join_path(spack.build_env_path, 'c++') compiler_wrapper = join_path(spack.build_env_path, 'c++')
f.write("using {0} : : {1} ;\n".format(boostToolsetId, f.write("using {0} : : {1} ;\n".format(boostToolsetId,
compiler_wrapper)) compiler_wrapper))
if '+mpi' in spec: if '+mpi' in spec:
f.write('using mpi : %s ;\n' % f.write('using mpi : %s ;\n' %
join_path(spec['mpi'].prefix.bin, 'mpicxx')) join_path(spec['mpi'].prefix.bin, 'mpicxx'))
@ -155,7 +159,7 @@ def determine_b2_options(self, spec, options):
linkTypes = ['static'] linkTypes = ['static']
if '+shared' in spec: if '+shared' in spec:
linkTypes.append('shared') linkTypes.append('shared')
threadingOpts = [] threadingOpts = []
if '+multithreaded' in spec: if '+multithreaded' in spec:
threadingOpts.append('multi') threadingOpts.append('multi')
@ -163,28 +167,38 @@ def determine_b2_options(self, spec, options):
threadingOpts.append('single') threadingOpts.append('single')
if not threadingOpts: if not threadingOpts:
raise RuntimeError("At least one of {singlethreaded, multithreaded} must be enabled") raise RuntimeError("At least one of {singlethreaded, multithreaded} must be enabled")
options.extend([ options.extend([
'toolset=%s' % self.determine_toolset(spec), 'toolset=%s' % self.determine_toolset(spec),
'link=%s' % ','.join(linkTypes), 'link=%s' % ','.join(linkTypes),
'--layout=tagged']) '--layout=tagged'])
return threadingOpts return threadingOpts
def install(self, spec, prefix): def install(self, spec, prefix):
# On Darwin, Boost expects the Darwin libtool. However, one of the
# dependencies may have pulled in Spack's GNU libtool, and these two are
# not compatible. We thus create a symlink to Darwin's libtool and add
# it at the beginning of PATH.
if sys.platform == 'darwin':
newdir = os.path.abspath('darwin-libtool')
mkdirp(newdir)
force_symlink('/usr/bin/libtool', join_path(newdir, 'libtool'))
env['PATH'] = newdir + ':' + env['PATH']
withLibs = list() withLibs = list()
for lib in Boost.all_libs: for lib in Boost.all_libs:
if "+{0}".format(lib) in spec: if "+{0}".format(lib) in spec:
withLibs.append(lib) withLibs.append(lib)
if not withLibs: if not withLibs:
# if no libraries are specified for compilation, then you dont have # if no libraries are specified for compilation, then you dont have
# to configure/build anything, just copy over to the prefix directory. # to configure/build anything, just copy over to the prefix directory.
src = join_path(self.stage.source_path, 'boost') src = join_path(self.stage.source_path, 'boost')
mkdirp(join_path(prefix, 'include')) mkdirp(join_path(prefix, 'include'))
dst = join_path(prefix, 'include', 'boost') dst = join_path(prefix, 'include', 'boost')
install_tree(src, dst) install_tree(src, dst)
return return
# to make Boost find the user-config.jam # to make Boost find the user-config.jam
env['BOOST_BUILD_PATH'] = './' env['BOOST_BUILD_PATH'] = './'
@ -207,4 +221,7 @@ def install(self, spec, prefix):
# Boost.MPI if the threading options are not separated. # Boost.MPI if the threading options are not separated.
for threadingOpt in threadingOpts: for threadingOpt in threadingOpts:
b2('install', 'threading=%s' % threadingOpt, *b2_options) b2('install', 'threading=%s' % threadingOpt, *b2_options)
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -30,6 +30,7 @@ class Cmake(Package):
homepage = 'https://www.cmake.org' homepage = 'https://www.cmake.org'
url = 'https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz' url = 'https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz'
version('3.5.1', 'ca051f4a66375c89d1a524e726da0296')
version('3.5.0', '33c5d09d4c33d4ffcc63578a6ba8777e') version('3.5.0', '33c5d09d4c33d4ffcc63578a6ba8777e')
version('3.4.3', '4cb3ff35b2472aae70f542116d616e63') version('3.4.3', '4cb3ff35b2472aae70f542116d616e63')
version('3.4.0', 'cd3034e0a44256a0917e254167217fc8') version('3.4.0', 'cd3034e0a44256a0917e254167217fc8')
@ -38,10 +39,12 @@ class Cmake(Package):
version('2.8.10.2', '097278785da7182ec0aea8769d06860c') version('2.8.10.2', '097278785da7182ec0aea8769d06860c')
variant('ncurses', default=True, description='Enables the build of the ncurses gui') variant('ncurses', default=True, description='Enables the build of the ncurses gui')
variant('openssl', default=True, description="Enables CMake's OpenSSL features")
variant('qt', default=False, description='Enables the build of cmake-gui') variant('qt', default=False, description='Enables the build of cmake-gui')
variant('doc', default=False, description='Enables the generation of html and man page documentation') variant('doc', default=False, description='Enables the generation of html and man page documentation')
depends_on('ncurses', when='+ncurses') depends_on('ncurses', when='+ncurses')
depends_on('openssl', when='+openssl')
depends_on('qt', when='+qt') depends_on('qt', when='+qt')
depends_on('python@2.7.11:', when='+doc') depends_on('python@2.7.11:', when='+doc')
depends_on('py-sphinx', when='+doc') depends_on('py-sphinx', when='+doc')
@ -77,8 +80,9 @@ def install(self, spec, prefix):
options.append('--sphinx-html') options.append('--sphinx-html')
options.append('--sphinx-man') options.append('--sphinx-man')
options.append('--') if '+openssl' in spec:
options.append('-DCMAKE_USE_OPENSSL=ON') options.append('--')
options.append('-DCMAKE_USE_OPENSSL=ON')
configure(*options) configure(*options)
make() make()

View file

@ -8,8 +8,8 @@ class Cryptopp(Package):
public-key encryption (RSA, DSA), and a few obsolete/historical encryption public-key encryption (RSA, DSA), and a few obsolete/historical encryption
algorithms (MD5, Panama).""" algorithms (MD5, Panama)."""
homepage = "http://www.cryptopp.com/" homepage = "http://www.cryptopp.com"
url = "http://www.cryptopp.com/cryptopp563.zip" base_url = "http://www.cryptopp.com"
version('5.6.3', '3c5b70e2ec98b7a24988734446242d07') version('5.6.3', '3c5b70e2ec98b7a24988734446242d07')
version('5.6.2', '7ed022585698df48e65ce9218f6c6a67') version('5.6.2', '7ed022585698df48e65ce9218f6c6a67')
@ -25,7 +25,5 @@ def install(self, spec, prefix):
install('libcryptopp.a', prefix.lib) install('libcryptopp.a', prefix.lib)
def url_for_version(self, version): def url_for_version(self, version):
version_tuple = tuple(v for v in iter(version)) version_string = str(version).replace('.', '')
version_string = reduce(lambda vs, nv: vs + str(nv), version_tuple, "") return '%s/cryptopp%s.zip' % (Cryptopp.base_url, version_string)
return "%scryptopp%s.zip" % (Cryptopp.homepage, version_string)

View file

@ -13,6 +13,7 @@ class Dbus(Package):
homepage = "http://dbus.freedesktop.org/" homepage = "http://dbus.freedesktop.org/"
url = "http://dbus.freedesktop.org/releases/dbus/dbus-1.8.8.tar.gz" url = "http://dbus.freedesktop.org/releases/dbus/dbus-1.8.8.tar.gz"
version('1.11.2', '957a07f066f3730d2bb3ea0932f0081b')
version('1.9.0', 'ec6895a4d5c0637b01f0d0e7689e2b36') version('1.9.0', 'ec6895a4d5c0637b01f0d0e7689e2b36')
version('1.8.8', 'b9f4a18ee3faa1e07c04aa1d83239c43') version('1.8.8', 'b9f4a18ee3faa1e07c04aa1d83239c43')
version('1.8.6', '6a08ba555d340e9dfe2d623b83c0eea8') version('1.8.6', '6a08ba555d340e9dfe2d623b83c0eea8')

View file

@ -48,7 +48,7 @@ class Eigen(Package):
depends_on('metis', when='+metis') depends_on('metis', when='+metis')
depends_on('scotch', when='+scotch') depends_on('scotch', when='+scotch')
depends_on('fftw', when='+fftw') depends_on('fftw', when='+fftw')
depends_on('SuiteSparse', when='+suitesparse') depends_on('suite-sparse', when='+suitesparse')
depends_on('mpfr@2.3.0:') # Eigen 3.2.7 requires at least 2.3.0 depends_on('mpfr@2.3.0:') # Eigen 3.2.7 requires at least 2.3.0
depends_on('gmp') depends_on('gmp')

View file

@ -32,6 +32,10 @@ def check_variants(self, spec):
if '+elpa' in spec and ('~mpi' in spec or '~scalapack' in spec): if '+elpa' in spec and ('~mpi' in spec or '~scalapack' in spec):
raise RuntimeError(error.format(variant='elpa')) raise RuntimeError(error.format(variant='elpa'))
def setup_environment(self, spack_env, run_env):
# Espresso copies every executable in prefix without creating sub-folders
run_env.prepend_path('PATH', self.prefix)
def install(self, spec, prefix): def install(self, spec, prefix):
self.check_variants(spec) self.check_variants(spec)

View file

@ -0,0 +1,42 @@
diff --git a/gcc/configure b/gcc/configure
index 9523773..52b0bf7 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -24884,7 +24884,7 @@ if test "${gcc_cv_as_ix86_filds+set}" = set; then :
else
gcc_cv_as_ix86_filds=no
if test x$gcc_cv_as != x; then
- $as_echo 'filds mem; fists mem' > conftest.s
+ $as_echo 'filds (%ebp); fists (%ebp)' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
@@ -24915,7 +24915,7 @@ if test "${gcc_cv_as_ix86_fildq+set}" = set; then :
else
gcc_cv_as_ix86_fildq=no
if test x$gcc_cv_as != x; then
- $as_echo 'fildq mem; fistpq mem' > conftest.s
+ $as_echo 'fildq (%ebp); fistpq (%ebp)' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 68b0ee8..bd53978 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3869,13 +3869,13 @@ foo: nop
gcc_GAS_CHECK_FEATURE([filds and fists mnemonics],
gcc_cv_as_ix86_filds,,,
- [filds mem; fists mem],,
+ [filds (%ebp); fists (%ebp)],,
[AC_DEFINE(HAVE_AS_IX86_FILDS, 1,
[Define if your assembler uses filds and fists mnemonics.])])
gcc_GAS_CHECK_FEATURE([fildq and fistpq mnemonics],
gcc_cv_as_ix86_fildq,,,
- [fildq mem; fistpq mem],,
+ [fildq (%ebp); fistpq (%ebp)],,
[AC_DEFINE(HAVE_AS_IX86_FILDQ, 1,
[Define if your assembler uses fildq and fistq mnemonics.])])

View file

@ -0,0 +1,28 @@
From 82f81877458ea372176eabb5de36329431dce99b Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@codesourcery.com>
Date: Sat, 21 Dec 2013 00:30:18 +0000
Subject: [PATCH] don't try to mark local symbols as no-dead-strip
---
gcc/config/darwin.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 40804b8..0080299 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1259,6 +1259,11 @@ darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
void
darwin_mark_decl_preserved (const char *name)
{
+ /* Actually we shouldn't mark any local symbol this way, but for now
+ this only happens with ObjC meta-data. */
+ if (darwin_label_is_anonymous_local_objc_name (name))
+ return;
+
fprintf (asm_out_file, "\t.no_dead_strip ");
assemble_name (asm_out_file, name);
fputc ('\n', asm_out_file);
--
2.2.1

View file

@ -26,6 +26,8 @@
from contextlib import closing from contextlib import closing
from glob import glob from glob import glob
import sys
import os
class Gcc(Package): class Gcc(Package):
"""The GNU Compiler Collection includes front ends for C, C++, """The GNU Compiler Collection includes front ends for C, C++,
@ -47,24 +49,33 @@ class Gcc(Package):
version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4') version('4.6.4', 'b407a3d1480c11667f293bfb1f17d1a4')
version('4.5.4', '27e459c2566b8209ab064570e1b378f7') version('4.5.4', '27e459c2566b8209ab064570e1b378f7')
variant('gold', default=True, description="Build the gold linker plugin for ld-based LTO") variant('binutils', default=sys.platform != 'darwin',
description="Build via binutils")
variant('gold', default=sys.platform != 'darwin',
description="Build the gold linker plugin for ld-based LTO")
depends_on("mpfr") depends_on("mpfr")
depends_on("gmp") depends_on("gmp")
depends_on("mpc", when='@4.5:') depends_on("mpc", when='@4.5:')
depends_on("isl", when='@5.0:') depends_on("isl", when='@5.0:')
depends_on("binutils~libiberty", when='~gold') depends_on("binutils~libiberty", when='+binutils ~gold')
depends_on("binutils~libiberty+gold", when='+gold') depends_on("binutils~libiberty+gold", when='+binutils +gold')
# TODO: integrate these libraries.
#depends_on("ppl") #depends_on("ppl")
#depends_on("cloog") #depends_on("cloog")
if sys.platform == 'darwin':
patch('darwin/gcc-4.9.patch1', when='@4.9.3')
patch('darwin/gcc-4.9.patch2', when='@4.9.3')
def install(self, spec, prefix): def install(self, spec, prefix):
# libjava/configure needs a minor fix to install into spack paths. # libjava/configure needs a minor fix to install into spack paths.
filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure', string=True) filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure',
string=True)
enabled_languages = set(('c', 'c++', 'fortran', 'java', 'objc')) enabled_languages = set(('c', 'c++', 'fortran', 'java', 'objc'))
if spec.satisfies("@4.7.1:"):
if spec.satisfies("@4.7.1:") and sys.platform != 'darwin':
enabled_languages.add('go') enabled_languages.add('go')
# Generic options to compile GCC # Generic options to compile GCC
@ -72,32 +83,40 @@ def install(self, spec, prefix):
"--libdir=%s/lib64" % prefix, "--libdir=%s/lib64" % prefix,
"--disable-multilib", "--disable-multilib",
"--enable-languages=" + ','.join(enabled_languages), "--enable-languages=" + ','.join(enabled_languages),
"--with-mpc=%s" % spec['mpc'].prefix, "--with-mpc=%s" % spec['mpc'].prefix,
"--with-mpfr=%s" % spec['mpfr'].prefix, "--with-mpfr=%s" % spec['mpfr'].prefix,
"--with-gmp=%s" % spec['gmp'].prefix, "--with-gmp=%s" % spec['gmp'].prefix,
"--enable-lto", "--enable-lto",
"--with-gnu-ld",
"--with-gnu-as",
"--with-quad"] "--with-quad"]
# Binutils # Binutils
static_bootstrap_flags = "-static-libstdc++ -static-libgcc" if spec.satisfies('+binutils'):
binutils_options = ["--with-sysroot=/", static_bootstrap_flags = "-static-libstdc++ -static-libgcc"
"--with-stage1-ldflags=%s %s" % (self.rpath_args, static_bootstrap_flags), binutils_options = ["--with-sysroot=/",
"--with-boot-ldflags=%s %s" % (self.rpath_args, static_bootstrap_flags), "--with-stage1-ldflags=%s %s" %
"--with-ld=%s/bin/ld" % spec['binutils'].prefix, (self.rpath_args, static_bootstrap_flags),
"--with-as=%s/bin/as" % spec['binutils'].prefix] "--with-boot-ldflags=%s %s" %
options.extend(binutils_options) (self.rpath_args, static_bootstrap_flags),
"--with-gnu-ld",
"--with-ld=%s/bin/ld" % spec['binutils'].prefix,
"--with-gnu-as",
"--with-as=%s/bin/as" % spec['binutils'].prefix]
options.extend(binutils_options)
# Isl # Isl
if 'isl' in spec: if 'isl' in spec:
isl_options = ["--with-isl=%s" % spec['isl'].prefix] isl_options = ["--with-isl=%s" % spec['isl'].prefix]
options.extend(isl_options) options.extend(isl_options)
if sys.platform == 'darwin' :
darwin_options = [ "--with-build-config=bootstrap-debug" ]
options.extend(darwin_options)
build_dir = join_path(self.stage.path, 'spack-build') build_dir = join_path(self.stage.path, 'spack-build')
configure = Executable( join_path(self.stage.source_path, 'configure') ) configure = Executable( join_path(self.stage.source_path, 'configure') )
with working_dir(build_dir, create=True): with working_dir(build_dir, create=True):
# Rest of install is straightforward. # Rest of install is straightforward.
configure(*options) configure(*options)
make() if sys.platform == 'darwin' : make("bootstrap")
else: make()
make("install") make("install")
self.write_rpath_specs() self.write_rpath_specs()
@ -114,7 +133,8 @@ def write_rpath_specs(self):
"""Generate a spec file so the linker adds a rpath to the libs """Generate a spec file so the linker adds a rpath to the libs
the compiler used to build the executable.""" the compiler used to build the executable."""
if not self.spec_dir: if not self.spec_dir:
tty.warn("Could not install specs for %s." % self.spec.format('$_$@')) tty.warn("Could not install specs for %s." %
self.spec.format('$_$@'))
return return
gcc = Executable(join_path(self.prefix.bin, 'gcc')) gcc = Executable(join_path(self.prefix.bin, 'gcc'))
@ -124,5 +144,6 @@ def write_rpath_specs(self):
for line in lines: for line in lines:
out.write(line + "\n") out.write(line + "\n")
if line.startswith("*link:"): if line.startswith("*link:"):
out.write("-rpath %s/lib:%s/lib64 \\\n"% (self.prefix, self.prefix)) out.write("-rpath %s/lib:%s/lib64 \\\n" %
(self.prefix, self.prefix))
set_install_permissions(specs_file) set_install_permissions(specs_file)

View file

@ -0,0 +1,69 @@
from spack import *
class Gdal(Package):
"""
GDAL is a translator library for raster and vector geospatial
data formats that is released under an X/MIT style Open Source
license by the Open Source Geospatial Foundation. As a library,
it presents a single raster abstract data model and vector
abstract data model to the calling application for all supported
formats. It also comes with a variety of useful command line
utilities for data translation and processing
"""
homepage = "http://www.gdal.org/"
url = "http://download.osgeo.org/gdal/2.0.2/gdal-2.0.2.tar.gz"
list_url = "http://download.osgeo.org/gdal/"
list_depth = 2
version('2.0.2', '573865f3f59ba7b4f8f4cddf223b52a5')
extends('python')
variant('hdf5', default=False, description='Enable HDF5 support')
variant('hdf', default=False, description='Enable HDF4 support')
variant('openjpeg', default=False, description='Enable JPEG2000 support')
variant('geos', default=False, description='Enable GEOS support')
variant('kea', default=False, description='Enable KEA support')
variant('netcdf', default=False, description='Enable netcdf support')
depends_on('swig')
depends_on("hdf5", when='+hdf5')
depends_on("hdf", when='+hdf')
depends_on("openjpeg", when='+openjpeg')
depends_on("geos", when='+geos')
depends_on("kealib", when='+kea')
depends_on("netcdf", when='+netcdf')
depends_on("libtiff")
depends_on("libpng")
depends_on("zlib")
depends_on("proj")
depends_on("py-numpy")
parallel = False
def install(self, spec, prefix):
args = []
args.append("--prefix=%s" % prefix)
args.append("--with-liblzma=yes")
args.append("--with-zlib=%s" % spec['zlib'].prefix)
args.append("--with-python=%s" % spec['python'].prefix.bin + "/python")
args.append("--without-libtool")
if '+geos' in spec:
args.append('--with-geos=yes')
if '+hdf' in spec:
args.append('--with-hdf4=%s' % spec['hdf'].prefix)
if '+hdf5' in spec:
args.append('--with-hdf5=%s' % spec['hdf5'].prefix)
if '+openjpeg' in spec:
args.append('--with-openjpeg=%s' % spec['openjpeg'].prefix)
if '+kea' in spec:
args.append('--with-kea=yes')
if '+netcdf' in spec:
args.append('--with-netcdf=%s' % spec['netcdf'].prefix)
configure(*args)
make()
make("install")

View file

@ -1,4 +1,5 @@
from spack import * from spack import *
import os
class Geos(Package): class Geos(Package):
"""GEOS (Geometry Engine - Open Source) is a C++ port of the Java """GEOS (Geometry Engine - Open Source) is a C++ port of the Java
@ -10,6 +11,10 @@ class Geos(Package):
homepage = "http://trac.osgeo.org/geos/" homepage = "http://trac.osgeo.org/geos/"
url = "http://download.osgeo.org/geos/geos-3.4.2.tar.bz2" url = "http://download.osgeo.org/geos/geos-3.4.2.tar.bz2"
# Verison 3.5.0 supports Autotools and CMake
version('3.5.0', '136842690be7f504fba46b3c539438dd')
# Versions through 3.4.2 have CMake, but only Autotools is supported
version('3.4.2', 'fc5df2d926eb7e67f988a43a92683bae') version('3.4.2', 'fc5df2d926eb7e67f988a43a92683bae')
version('3.4.1', '4c930dec44c45c49cd71f3e0931ded7e') version('3.4.1', '4c930dec44c45c49cd71f3e0931ded7e')
version('3.4.0', 'e41318fc76b5dc764a69d43ac6b18488') version('3.4.0', 'e41318fc76b5dc764a69d43ac6b18488')
@ -21,11 +26,22 @@ class Geos(Package):
version('3.3.4', '1bb9f14d57ef06ffa41cb1d67acb55a1') version('3.3.4', '1bb9f14d57ef06ffa41cb1d67acb55a1')
version('3.3.3', '8454e653d7ecca475153cc88fd1daa26') version('3.3.3', '8454e653d7ecca475153cc88fd1daa26')
extends('python') # # Python3 is not supported.
depends_on('swig') # variant('python', default=False, description='Enable Python support')
# extends('python', when='+python')
# depends_on('python', when='+python')
# depends_on('swig', when='+python')
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=%s" % prefix, args = ["--prefix=%s" % prefix]
"--enable-python") # if '+python' in spec:
# os.environ['PYTHON'] = join_path(spec['python'].prefix, 'bin',
# 'python' if spec['python'].version[:1][0] <= 2 else 'python3')
# os.environ['SWIG'] = join_path(spec['swig'].prefix, 'bin', 'swig')
#
# args.append("--enable-python")
configure(*args)
make() make()
make("install") make("install")

View file

@ -0,0 +1,30 @@
from spack import *
class Gettext(Package):
"""GNU internationalization (i18n) and localization (l10n) library."""
homepage = "https://www.gnu.org/software/gettext/"
url = "http://ftpmirror.gnu.org/gettext/gettext-0.19.7.tar.xz"
version('0.19.7', 'f81e50556da41b44c1d59ac93474dca5')
def install(self, spec, prefix):
options = ['--disable-dependency-tracking',
'--disable-silent-rules',
'--disable-debug',
'--prefix=%s' % prefix,
'--with-included-gettext',
'--with-included-glib',
'--with-included-libcroco',
'--with-included-libunistring',
'--with-emacs',
'--with-lispdir=%s/emacs/site-lisp/gettext' % prefix.share,
'--disable-java',
'--disable-csharp',
'--without-git', # Don't use VCS systems to create these archives
'--without-cvs',
'--without-xz']
configure(*options)
make()
make("install")

View file

@ -0,0 +1,24 @@
from spack import *
class Googletest(Package):
"""Google test framework for C++. Also called gtest."""
homepage = "https://github.com/google/googletest"
url = "https://github.com/google/googletest/tarball/release-1.7.0"
version('1.7.0', '5eaf03ed925a47b37c8e1d559eb19bc4')
depends_on("cmake")
def install(self, spec, prefix):
which('cmake')('.', *std_cmake_args)
make()
# Google Test doesn't have a make install
# We have to do our own install here.
install_tree('include', prefix.include)
mkdirp(prefix.lib)
install('./libgtest.a', '%s' % prefix.lib)
install('./libgtest_main.a', '%s' % prefix.lib)

View file

@ -1,5 +1,5 @@
from spack import * from spack import *
import os import os, sys
class Hypre(Package): class Hypre(Package):
"""Hypre is a library of high performance preconditioners that """Hypre is a library of high performance preconditioners that
@ -12,7 +12,10 @@ class Hypre(Package):
version('2.10.1', 'dc048c4cabb3cd549af72591474ad674') version('2.10.1', 'dc048c4cabb3cd549af72591474ad674')
version('2.10.0b', '768be38793a35bb5d055905b271f5b8e') version('2.10.0b', '768be38793a35bb5d055905b271f5b8e')
variant('shared', default=True, description="Build shared library version (disables static library)") # hypre does not know how to build shared libraries on Darwin
variant('shared', default=sys.platform!='darwin', description="Build shared library version (disables static library)")
# SuperluDist have conflicting headers with those in Hypre
variant('internal-superlu', default=True, description="Use internal Superlu routines")
depends_on("mpi") depends_on("mpi")
depends_on("blas") depends_on("blas")
@ -37,6 +40,12 @@ def install(self, spec, prefix):
if '+shared' in self.spec: if '+shared' in self.spec:
configure_args.append("--enable-shared") configure_args.append("--enable-shared")
if '~internal-superlu' in self.spec:
configure_args.append("--without-superlu")
# MLI and FEI do not build without superlu on Linux
configure_args.append("--without-mli")
configure_args.append("--without-fei")
# Hypre's source is staged under ./src so we'll have to manually # Hypre's source is staged under ./src so we'll have to manually
# cd into it. # cd into it.
with working_dir("src"): with working_dir("src"):

View file

@ -0,0 +1,35 @@
from spack import *
class Kealib(Package):
"""An HDF5 Based Raster File Format
KEALib provides an implementation of the GDAL data model.
The format supports raster attribute tables, image pyramids,
meta-data and in-built statistics while also handling very
large files and compression throughout.
Based on the HDF5 standard, it also provides a base from which
other formats can be derived and is a good choice for long
term data archiving. An independent software library (libkea)
provides complete access to the KEA image format and a GDAL
driver allowing KEA images to be used from any GDAL supported software.
Development work on this project has been funded by Landcare Research.
"""
homepage = "http://kealib.org/"
url = "https://bitbucket.org/chchrsc/kealib/get/kealib-1.4.5.tar.gz"
version('1.4.5', '112e9c42d980b2d2987a3c15d0833a5d')
depends_on("hdf5")
def install(self, spec, prefix):
with working_dir('trunk', create=False):
cmake_args = []
cmake_args.append("-DCMAKE_INSTALL_PREFIX=%s" % prefix)
cmake_args.append("-DHDF5_INCLUDE_DIR=%s" % spec['hdf5'].prefix.include)
cmake_args.append("-DHDF5_LIB_PATH=%s" % spec['hdf5'].prefix.lib)
cmake('.', *cmake_args)
make()
make("install")

View file

@ -38,8 +38,6 @@ class Libelf(Package):
provides('elf') provides('elf')
sanity_check_is_file = 'include/libelf.h'
def install(self, spec, prefix): def install(self, spec, prefix):
configure("--prefix=" + prefix, configure("--prefix=" + prefix,
"--enable-shared", "--enable-shared",

View file

@ -52,7 +52,7 @@ class Llvm(Package):
depends_on('cmake @2.8.12.2:') depends_on('cmake @2.8.12.2:')
# Universal dependency # Universal dependency
depends_on('python@2.7:') depends_on('python@2.7:2.8') # Seems not to support python 3.X.Y
# lldb dependencies # lldb dependencies
depends_on('ncurses', when='+lldb') depends_on('ncurses', when='+lldb')
@ -132,6 +132,21 @@ class Llvm(Package):
'llvm-libunwind' : 'http://llvm.org/svn/llvm-project/libunwind/trunk', 'llvm-libunwind' : 'http://llvm.org/svn/llvm-project/libunwind/trunk',
} }
}, },
{
'version' : '3.8.0',
'md5':'07a7a74f3c6bd65de4702bf941b511a0',
'resources' : {
'compiler-rt' : 'd6fcbe14352ffb708e4d1ac2e48bb025',
'openmp' : '8fd7cc35d48051613cf1e750e9f22e40',
'polly' : '1b3b20f52d34a4024e21a4ea7112caa7',
'libcxx' : 'd6e0bdbbee39f7907ad74fd56d03b88a',
'libcxxabi' : 'bbe6b4d72c7c5978550d370af529bcf7',
'clang' : 'cc99e7019bb74e6459e80863606250c5',
'clang-tools-extra' : 'c2344f50e0eea0b402f0092a80ddc036',
'lldb' : 'a5da35ed9cc8c8817ee854e3dbfba00e',
'llvm-libunwind' : '162ade468607f153cca12be90b5194fa',
}
},
{ {
'version' : '3.7.1', 'version' : '3.7.1',
'md5':'bf8b3a2c79e61212c5409041dfdbd319', 'md5':'bf8b3a2c79e61212c5409041dfdbd319',

View file

@ -0,0 +1,22 @@
# HG changeset patch
# User Sean Farley <sean@mcs.anl.gov>
# Date 1332269671 18000
# Tue Mar 20 13:54:31 2012 -0500
# Node ID b95c0c2e1d8bf8e3273f7d45e856f0c0127d998e
# Parent 88049269953c67c3fdcc4309bf901508a875f0dc
cmake: add gklib headers to install into include
diff -r 88049269953c -r b95c0c2e1d8b libmetis/CMakeLists.txt
Index: libmetis/CMakeLists.txt
===================================================================
--- a/libmetis/CMakeLists.txt Tue Mar 20 13:54:29 2012 -0500
+++ b/libmetis/CMakeLists.txt Tue Mar 20 13:54:31 2012 -0500
@@ -12,6 +12,8 @@ endif()
if(METIS_INSTALL)
install(TARGETS metis
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib
ARCHIVE DESTINATION lib)
+ install(FILES gklib_defs.h DESTINATION include)
+ install(FILES gklib_rename.h DESTINATION include)
endif()

View file

@ -24,7 +24,7 @@
############################################################################## ##############################################################################
from spack import * from spack import *
import glob,sys
class Metis(Package): class Metis(Package):
""" """
@ -49,6 +49,8 @@ class Metis(Package):
depends_on('gdb', when='+gdb') depends_on('gdb', when='+gdb')
patch('install_gklib_defs_rename.patch')
def install(self, spec, prefix): def install(self, spec, prefix):
options = [] options = []
@ -80,4 +82,15 @@ def install(self, spec, prefix):
with working_dir(build_directory, create=True): with working_dir(build_directory, create=True):
cmake(source_directory, *options) cmake(source_directory, *options)
make() make()
make("install") make("install")
# install GKlib headers, which will be needed for ParMETIS
GKlib_dist = join_path(prefix.include,'GKlib')
mkdirp(GKlib_dist)
fs = glob.glob(join_path(source_directory,'GKlib',"*.h"))
for f in fs:
install(f, GKlib_dist)
# The shared library is not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -54,7 +54,7 @@ def setup_dependent_environment(self, env, dependent_spec):
env.set('MPICH_F90', spack_f90) env.set('MPICH_F90', spack_f90)
env.set('MPICH_FC', spack_fc) env.set('MPICH_FC', spack_fc)
def setup_dependent_python_module(self, module, spec, dep_spec): def setup_dependent_package(self, module, dep_spec):
"""For dependencies, make mpicc's use spack wrapper.""" """For dependencies, make mpicc's use spack wrapper."""
# FIXME : is this necessary ? Shouldn't this be part of a contract with MPI providers? # FIXME : is this necessary ? Shouldn't this be part of a contract with MPI providers?
module.mpicc = join_path(self.prefix.bin, 'mpicc') module.mpicc = join_path(self.prefix.bin, 'mpicc')

View file

@ -8,12 +8,9 @@ IORDERINGSF = $(ISCOTCH)
IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH) IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH)
PLAT = PLAT =
LIBEXT = .a OUTC = -o
OUTC = -o
OUTF = -o OUTF = -o
RM = /bin/rm -f RM = /bin/rm -f
AR = ar vr
RANLIB = ranlib
INCSEQ = -I$(topdir)/libseq INCSEQ = -I$(topdir)/libseq
LIBSEQ = -L$(topdir)/libseq -lmpiseq LIBSEQ = -L$(topdir)/libseq -lmpiseq

View file

@ -1,6 +1,5 @@
from spack import * from spack import *
import os import os, sys
class Mumps(Package): class Mumps(Package):
"""MUMPS: a MUltifrontal Massively Parallel sparse direct Solver""" """MUMPS: a MUltifrontal Massively Parallel sparse direct Solver"""
@ -19,11 +18,12 @@ class Mumps(Package):
variant('float', default=True, description='Activate the compilation of smumps') variant('float', default=True, description='Activate the compilation of smumps')
variant('complex', default=True, description='Activate the compilation of cmumps and/or zmumps') variant('complex', default=True, description='Activate the compilation of cmumps and/or zmumps')
variant('idx64', default=False, description='Use int64_t/integer*8 as default index type') variant('idx64', default=False, description='Use int64_t/integer*8 as default index type')
variant('shared', default=True, description='Build shared libraries')
depends_on('scotch + esmumps', when='~ptscotch+scotch') depends_on('scotch + esmumps', when='~ptscotch+scotch')
depends_on('scotch + esmumps + mpi', when='+ptscotch') depends_on('scotch + esmumps + mpi', when='+ptscotch')
depends_on('metis', when='~parmetis+metis') depends_on('metis', when='+metis')
depends_on('parmetis', when="+parmetis") depends_on('parmetis', when="+parmetis")
depends_on('blas') depends_on('blas')
depends_on('lapack') depends_on('lapack')
@ -38,11 +38,11 @@ class Mumps(Package):
def write_makefile_inc(self): def write_makefile_inc(self):
if ('+parmetis' in self.spec or '+ptscotch' in self.spec) and '+mpi' not in self.spec: if ('+parmetis' in self.spec or '+ptscotch' in self.spec) and '+mpi' not in self.spec:
raise RuntimeError('You cannot use the variants parmetis or ptscotch without mpi') raise RuntimeError('You cannot use the variants parmetis or ptscotch without mpi')
makefile_conf = ["LIBBLAS = -L%s -lblas" % self.spec['blas'].prefix.lib] makefile_conf = ["LIBBLAS = -L%s -lblas" % self.spec['blas'].prefix.lib]
orderings = ['-Dpord'] orderings = ['-Dpord']
if '+ptscotch' in self.spec or '+scotch' in self.spec: if '+ptscotch' in self.spec or '+scotch' in self.spec:
join_lib = ' -l%s' % ('pt' if '+ptscotch' in self.spec else '') join_lib = ' -l%s' % ('pt' if '+ptscotch' in self.spec else '')
makefile_conf.extend( makefile_conf.extend(
@ -54,18 +54,25 @@ def write_makefile_inc(self):
if '+ptscotch' in self.spec: if '+ptscotch' in self.spec:
orderings.append('-Dptscotch') orderings.append('-Dptscotch')
if '+parmetis' in self.spec or '+metis' in self.spec: if '+parmetis' in self.spec and '+metis' in self.spec:
libname = 'parmetis' if '+parmetis' in self.spec else 'metis' libname = 'parmetis' if '+parmetis' in self.spec else 'metis'
makefile_conf.extend( makefile_conf.extend(
["IMETIS = -I%s" % self.spec[libname].prefix.include, ["IMETIS = -I%s" % self.spec['parmetis'].prefix.include,
"LMETIS = -L%s -l%s" % (self.spec[libname].prefix.lib, libname)]) "LMETIS = -L%s -l%s -L%s -l%s" % (self.spec['parmetis'].prefix.lib, 'parmetis',self.spec['metis'].prefix.lib, 'metis')])
orderings.append('-Dparmetis')
elif '+metis' in self.spec:
makefile_conf.extend(
["IMETIS = -I%s" % self.spec['metis'].prefix.include,
"LMETIS = -L%s -l%s" % (self.spec['metis'].prefix.lib, 'metis')])
orderings.append('-Dmetis') orderings.append('-Dmetis')
if '+parmetis' in self.spec:
orderings.append('-Dparmetis')
makefile_conf.append("ORDERINGSF = %s" % (' '.join(orderings))) makefile_conf.append("ORDERINGSF = %s" % (' '.join(orderings)))
# when building shared libs need -fPIC, otherwise
# /usr/bin/ld: graph.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
fpic = '-fPIC' if '+shared' in self.spec else ''
# TODO: test this part, it needs a full blas, scalapack and # TODO: test this part, it needs a full blas, scalapack and
# partitionning environment with 64bit integers # partitionning environment with 64bit integers
if '+idx64' in self.spec: if '+idx64' in self.spec:
@ -73,14 +80,14 @@ def write_makefile_inc(self):
# the fortran compilation flags most probably are # the fortran compilation flags most probably are
# working only for intel and gnu compilers this is # working only for intel and gnu compilers this is
# perhaps something the compiler should provide # perhaps something the compiler should provide
['OPTF = -O -DALLOW_NON_INIT %s' % '-fdefault-integer-8' if self.compiler.name == "gcc" else '-i8', ['OPTF = %s -O -DALLOW_NON_INIT %s' % (fpic,'-fdefault-integer-8' if self.compiler.name == "gcc" else '-i8'),
'OPTL = -O ', 'OPTL = %s -O ' % fpic,
'OPTC = -O -DINTSIZE64']) 'OPTC = %s -O -DINTSIZE64' % fpic])
else: else:
makefile_conf.extend( makefile_conf.extend(
['OPTF = -O -DALLOW_NON_INIT', ['OPTF = %s -O -DALLOW_NON_INIT' % fpic,
'OPTL = -O ', 'OPTL = %s -O ' % fpic,
'OPTC = -O ']) 'OPTC = %s -O ' % fpic])
if '+mpi' in self.spec: if '+mpi' in self.spec:
@ -101,12 +108,33 @@ def write_makefile_inc(self):
# compiler possible values are -DAdd_, -DAdd__ and/or -DUPPER # compiler possible values are -DAdd_, -DAdd__ and/or -DUPPER
makefile_conf.append("CDEFS = -DAdd_") makefile_conf.append("CDEFS = -DAdd_")
if '+shared' in self.spec:
if sys.platform == 'darwin':
# Building dylibs with mpif90 causes segfaults on 10.8 and 10.10. Use gfortran. (Homebrew)
makefile_conf.extend([
'LIBEXT=.dylib',
'AR=%s -dynamiclib -Wl,-install_name -Wl,%s/$(notdir $@) -undefined dynamic_lookup -o ' % (os.environ['FC'],prefix.lib),
'RANLIB=echo'
])
else:
makefile_conf.extend([
'LIBEXT=.so',
'AR=$(FL) -shared -Wl,-soname -Wl,%s/$(notdir $@) -o' % prefix.lib,
'RANLIB=echo'
])
else:
makefile_conf.extend([
'LIBEXT = .a',
'AR = ar vr',
'RANLIB = ranlib'
])
makefile_inc_template = join_path(os.path.dirname(self.module.__file__), makefile_inc_template = join_path(os.path.dirname(self.module.__file__),
'Makefile.inc') 'Makefile.inc')
with open(makefile_inc_template, "r") as fh: with open(makefile_inc_template, "r") as fh:
makefile_conf.extend(fh.read().split('\n')) makefile_conf.extend(fh.read().split('\n'))
with working_dir('.'): with working_dir('.'):
with open("Makefile.inc", "w") as fh: with open("Makefile.inc", "w") as fh:
makefile_inc = '\n'.join(makefile_conf) makefile_inc = '\n'.join(makefile_conf)
@ -117,7 +145,7 @@ def write_makefile_inc(self):
def install(self, spec, prefix): def install(self, spec, prefix):
make_libs = [] make_libs = []
# the coice to compile ?examples is to have kind of a sanity # the choice to compile ?examples is to have kind of a sanity
# check on the libraries generated. # check on the libraries generated.
if '+float' in spec: if '+float' in spec:
make_libs.append('sexamples') make_libs.append('sexamples')
@ -130,10 +158,25 @@ def install(self, spec, prefix):
make_libs.append('zexamples') make_libs.append('zexamples')
self.write_makefile_inc() self.write_makefile_inc()
make(*make_libs) # Build fails in parallel
make(*make_libs, parallel=False)
install_tree('lib', prefix.lib) install_tree('lib', prefix.lib)
install_tree('include', prefix.include) install_tree('include', prefix.include)
if '~mpi' in spec: if '~mpi' in spec:
install('libseq/libmpiseq.a', prefix.lib) lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
install('libseq/libmpiseq%s' % lib_suffix, prefix.lib)
# FIXME: extend the tests to mpirun -np 2 (or alike) when build with MPI
# FIXME: use something like numdiff to compare blessed output with the current
with working_dir('examples'):
if '+float' in spec:
os.system('./ssimpletest < input_simpletest_real')
if '+complex' in spec:
os.system('./csimpletest < input_simpletest_real')
if '+double' in spec:
os.system('./dsimpletest < input_simpletest_real')
if '+complex' in spec:
os.system('./zsimpletest < input_simpletest_cmplx')

View file

@ -0,0 +1,18 @@
from spack import *
class Muparser(Package):
"""C++ math expression parser library."""
homepage = "http://muparser.beltoforion.de/"
url = "https://github.com/beltoforion/muparser/archive/v2.2.5.tar.gz"
version('2.2.5', '02dae671aa5ad955fdcbcd3fee313fb7')
def install(self, spec, prefix):
options = ['--disable-debug',
'--disable-dependency-tracking',
'--prefix=%s' % prefix]
configure(*options)
make(parallel=False)
make("install")

View file

@ -0,0 +1,15 @@
from spack import *
class NetcdfCxx(Package):
"""C++ compatibility bindings for NetCDF"""
homepage = "http://www.unidata.ucar.edu/software/netcdf"
url = "http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-cxx-4.2.tar.gz"
version('4.2', 'd32b20c00f144ae6565d9e98d9f6204c')
depends_on('netcdf')
def install(self, spec, prefix):
configure('--prefix=%s' % prefix)
make()
make("install")

View file

@ -43,6 +43,13 @@ def install(self, spec, prefix):
"--enable-dap" "--enable-dap"
] ]
# Make sure Netcdf links against Spack's curl
# Otherwise it may pick up system's curl, which could lead to link errors:
# /usr/lib/x86_64-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_use_certificate_chain_file@OPENSSL_1.0.0'
LIBS.append("-lcurl")
CPPFLAGS.append("-I%s" % spec['curl'].prefix.include)
LDFLAGS.append ("-L%s" % spec['curl'].prefix.lib)
if '+mpi' in spec: if '+mpi' in spec:
config_args.append('--enable-parallel4') config_args.append('--enable-parallel4')

View file

@ -1,46 +0,0 @@
from spack import *
import os
class NetlibBlas(Package):
"""Netlib reference BLAS"""
homepage = "http://www.netlib.org/lapack/"
url = "http://www.netlib.org/lapack/lapack-3.5.0.tgz"
version('3.5.0', 'b1d3e3e425b2e44a06760ff173104bdf')
variant('fpic', default=False, description="Build with -fpic compiler option")
# virtual dependency
provides('blas')
# Doesn't always build correctly in parallel
parallel = False
def patch(self):
os.symlink('make.inc.example', 'make.inc')
mf = FileFilter('make.inc')
mf.filter('^FORTRAN.*', 'FORTRAN = f90')
mf.filter('^LOADER.*', 'LOADER = f90')
mf.filter('^CC =.*', 'CC = cc')
if '+fpic' in self.spec:
mf.filter('^OPTS.*=.*', 'OPTS = -O2 -frecursive -fpic')
mf.filter('^CFLAGS =.*', 'CFLAGS = -O3 -fpic')
def install(self, spec, prefix):
make('blaslib')
# Tests that blas builds correctly
make('blas_testing')
# No install provided
mkdirp(prefix.lib)
install('librefblas.a', prefix.lib)
# Blas virtual package should provide blas.a and libblas.a
with working_dir(prefix.lib):
symlink('librefblas.a', 'blas.a')
symlink('librefblas.a', 'libblas.a')

View file

@ -1,16 +1,15 @@
from spack import * from spack import *
class NetlibLapack(Package): class NetlibLapack(Package):
""" """
LAPACK version 3.X is a comprehensive FORTRAN library that does LAPACK version 3.X is a comprehensive FORTRAN library that does linear algebra operations including matrix
linear algebra operations including matrix inversions, least inversions, least squared solutions to linear sets of equations, eigenvector analysis, singular value
squared solutions to linear sets of equations, eigenvector decomposition, etc. It is a very comprehensive and reputable package that has found extensive use in the
analysis, singular value decomposition, etc. It is a very scientific community.
comprehensive and reputable package that has found extensive
use in the scientific community.
""" """
homepage = "http://www.netlib.org/lapack/" homepage = "http://www.netlib.org/lapack/"
url = "http://www.netlib.org/lapack/lapack-3.5.0.tgz" url = "http://www.netlib.org/lapack/lapack-3.5.0.tgz"
version('3.6.0', 'f2f6c67134e851fe189bb3ca1fbb5101') version('3.6.0', 'f2f6c67134e851fe189bb3ca1fbb5101')
version('3.5.0', 'b1d3e3e425b2e44a06760ff173104bdf') version('3.5.0', 'b1d3e3e425b2e44a06760ff173104bdf')
@ -19,42 +18,34 @@ class NetlibLapack(Package):
version('3.4.0', '02d5706ec03ba885fc246e5fa10d8c70') version('3.4.0', '02d5706ec03ba885fc246e5fa10d8c70')
version('3.3.1', 'd0d533ec9a5b74933c2a1e84eedc58b4') version('3.3.1', 'd0d533ec9a5b74933c2a1e84eedc58b4')
variant('shared', default=False, description="Build shared library version") variant('debug', default=False, description='Activates the Debug build type')
variant('shared', default=True, description="Build shared library version")
variant('external-blas', default=False, description='Build lapack with an external blas')
variant('lapacke', default=True, description='Activates the build of the LAPACKE C interface')
# virtual dependency # virtual dependency
provides('blas', when='~external-blas')
provides('lapack') provides('lapack')
# blas is a virtual dependency.
depends_on('blas')
depends_on('cmake') depends_on('cmake')
depends_on('blas', when='+external-blas')
# Doesn't always build correctly in parallel
parallel = False
@when('^netlib-blas')
def get_blas_libs(self):
blas = self.spec['netlib-blas']
return [join_path(blas.prefix.lib, 'blas.a')]
@when('^atlas')
def get_blas_libs(self):
blas = self.spec['atlas']
return [join_path(blas.prefix.lib, l)
for l in ('libf77blas.a', 'libatlas.a')]
def install(self, spec, prefix): def install(self, spec, prefix):
blas_libs = ";".join(self.get_blas_libs()) cmake_args = ['-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'),
cmake_args = [".", '-DBLAS_LIBRARIES=' + blas_libs] '-DCMAKE_BUILD_TYPE:STRING=%s' % ('Debug' if '+debug' in spec else 'Release'),
'-DLAPACKE:BOOL=%s' % ('ON' if '+lapacke' in spec else 'OFF')]
if '+external-blas' in spec:
# TODO : the mechanism to specify the library should be more general,
# TODO : but this allows to have an hook to an external blas
cmake_args.extend([
'-DUSE_OPTIMIZED_BLAS:BOOL=ON',
'-DBLAS_LIBRARIES:PATH=%s' % join_path(spec['blas'].prefix.lib, 'libblas.a')
])
if '+shared' in spec: cmake_args.extend(std_cmake_args)
cmake_args.append('-DBUILD_SHARED_LIBS=ON')
cmake_args += std_cmake_args
cmake(*cmake_args)
make()
make("install")
with working_dir('spack-build', create=True):
cmake('..', *cmake_args)
make()
make("install")

View file

@ -1,4 +1,5 @@
from spack import * from spack import *
import sys
class NetlibScalapack(Package): class NetlibScalapack(Package):
"""ScaLAPACK is a library of high-performance linear algebra routines for parallel distributed memory machines""" """ScaLAPACK is a library of high-performance linear algebra routines for parallel distributed memory machines"""
@ -11,16 +12,16 @@ class NetlibScalapack(Package):
version('2.0.0', '9e76ae7b291be27faaad47cfc256cbfe') version('2.0.0', '9e76ae7b291be27faaad47cfc256cbfe')
# versions before 2.0.0 are not using cmake and requires blacs as # versions before 2.0.0 are not using cmake and requires blacs as
# a separated package # a separated package
variant('shared', default=True, description='Build the shared library version') variant('shared', default=True, description='Build the shared library version')
variant('fpic', default=False, description="Build with -fpic compiler option") variant('fpic', default=False, description="Build with -fpic compiler option")
provides('scalapack') provides('scalapack')
depends_on('mpi') depends_on('mpi')
depends_on('lapack') depends_on('lapack')
def install(self, spec, prefix): def install(self, spec, prefix):
options = [ options = [
"-DBUILD_SHARED_LIBS:BOOL=%s" % ('ON' if '+shared' in spec else 'OFF'), "-DBUILD_SHARED_LIBS:BOOL=%s" % ('ON' if '+shared' in spec else 'OFF'),
"-DBUILD_STATIC_LIBS:BOOL=%s" % ('OFF' if '+shared' in spec else 'ON'), "-DBUILD_STATIC_LIBS:BOOL=%s" % ('OFF' if '+shared' in spec else 'ON'),
@ -40,10 +41,16 @@ def install(self, spec, prefix):
make() make()
make("install") make("install")
def setup_dependent_python_module(self, module, spec, dependent_spec): # The shared libraries are not installed correctly on Darwin; correct this
lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so' if (sys.platform == 'darwin') and ('+shared' in spec):
lib_suffix = lib_dsuffix if '+shared' in spec['scalapack'] else '.a' fix_darwin_install_name(prefix.lib)
spec['scalapack'].fc_link = '-L%s -lscalapack' % spec['scalapack'].prefix.lib
spec['scalapack'].cc_link = spec['scalapack'].fc_link def setup_dependent_package(self, module, dependent_spec):
spec['scalapack'].libraries = [join_path(spec['scalapack'].prefix.lib, 'libscalapack%s' % lib_suffix)] spec = self.spec
lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
spec.fc_link = '-L%s -lscalapack' % spec.prefix.lib
spec.cc_link = spec.fc_link
spec.libraries = [join_path(spec.prefix.lib, 'libscalapack%s' % lib_suffix)]

View file

@ -0,0 +1,51 @@
from spack import *
import platform, sys
class Oce(Package):
"""
Open CASCADE Community Edition:
patches/improvements/experiments contributed by users over the official Open CASCADE library.
"""
homepage = "https://github.com/tpaviot/oce"
url = "https://github.com/tpaviot/oce/archive/OCE-0.17.tar.gz"
version('0.17.1', '36c67b87093c675698b483454258af91')
version('0.17' , 'f1a89395c4b0d199bea3db62b85f818d')
version('0.16.1', '4d591b240c9293e879f50d86a0cb2bb3')
version('0.16' , '7a4b4df5a104d75a537e25e7dd387eca')
version('0.15' , '7ec541a1c350ca8a684f74980e48801c')
depends_on('cmake@2.8:')
def install(self, spec, prefix):
options = []
options.extend(std_cmake_args)
options.extend([
'-DOCE_INSTALL_PREFIX=%s' % prefix,
'-DOCE_BUILD_SHARED_LIB:BOOL=ON',
'-DOCE_BUILD_TYPE:STRING=Release',
'-DOCE_DATAEXCHANGE:BOOL=ON',
'-DOCE_DISABLE_X11:BOOL=ON',
'-DOCE_DRAW:BOOL=OFF',
'-DOCE_MODEL:BOOL=ON',
'-DOCE_MULTITHREAD_LIBRARY:STRING=NONE', # FIXME: add tbb
'-DOCE_OCAF:BOOL=ON',
'-DOCE_USE_TCL_TEST_FRAMEWORK:BOOL=OFF',
'-DOCE_VISUALISATION:BOOL=OFF',
'-DOCE_WITH_FREEIMAGE:BOOL=OFF',
'-DOCE_WITH_GL2PS:BOOL=OFF',
'-DOCE_WITH_OPENCL:BOOL=OFF'
])
if platform.system() == 'Darwin':
options.extend([
'-DOCE_OSX_USE_COCOA:BOOL=ON',
])
cmake('.', *options)
make("install/strip")
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin'):
fix_darwin_install_name(prefix.lib)

View file

@ -62,7 +62,7 @@ class Octave(Package):
depends_on('qrupdate', when='+qrupdate') depends_on('qrupdate', when='+qrupdate')
#depends_on('qscintilla', when='+qscintilla) # TODO: add package #depends_on('qscintilla', when='+qscintilla) # TODO: add package
depends_on('qt', when='+qt') depends_on('qt', when='+qt')
depends_on('SuiteSparse', when='+suitesparse') depends_on('suite-sparse',when='+suitesparse')
depends_on('zlib', when='+zlib') depends_on('zlib', when='+zlib')

View file

@ -6,6 +6,7 @@ class Openblas(Package):
homepage = "http://www.openblas.net" homepage = "http://www.openblas.net"
url = "http://github.com/xianyi/OpenBLAS/archive/v0.2.15.tar.gz" url = "http://github.com/xianyi/OpenBLAS/archive/v0.2.15.tar.gz"
version('0.2.17', '664a12807f2a2a7cda4781e3ab2ae0e1')
version('0.2.16', 'fef46ab92463bdbb1479dcec594ef6dc') version('0.2.16', 'fef46ab92463bdbb1479dcec594ef6dc')
version('0.2.15', 'b1190f3d3471685f17cfd1ec1d252ac9') version('0.2.15', 'b1190f3d3471685f17cfd1ec1d252ac9')
@ -14,7 +15,14 @@ class Openblas(Package):
provides('lapack') provides('lapack')
def install(self, spec, prefix): def install(self, spec, prefix):
make('libs', 'netlib', 'shared', 'CC=cc', 'FC=f77') extra=[]
if spec.satisfies('@0.2.16'):
extra.extend([
'BUILD_LAPACK_DEPRECATED=1' # fix missing _dggsvd_ and _sggsvd_
])
make('libs', 'netlib', 'shared', 'CC=cc', 'FC=f77',*extra)
make("tests")
make('install', "PREFIX='%s'" % prefix) make('install', "PREFIX='%s'" % prefix)
lib_dsuffix = 'dylib' if sys.platform == 'darwin' else 'so' lib_dsuffix = 'dylib' if sys.platform == 'darwin' else 'so'

View file

@ -0,0 +1,26 @@
from spack import *
class Openjpeg(Package):
"""
OpenJPEG is an open-source JPEG 2000 codec written in C language.
It has been developed in order to promote the use of JPEG 2000, a
still-image compression standard from the Joint Photographic
Experts Group (JPEG).
Since April 2015, it is officially recognized by ISO/IEC and
ITU-T as a JPEG 2000 Reference Software.
"""
homepage = "https://github.com/uclouvain/openjpeg"
url = "https://github.com/uclouvain/openjpeg/archive/version.2.1.tar.gz"
version('2.1' , '3e1c451c087f8462955426da38aa3b3d')
version('2.0.1', '105876ed43ff7dbb2f90b41b5a43cfa5')
version('2.0' , 'cdf266530fee8af87454f15feb619609')
version('1.5.2', '545f98923430369a6b046ef3632ef95c')
version('1.5.1', 'd774e4b5a0db5f0f171c4fc0aabfa14e')
def install(self, spec, prefix):
cmake('.', *std_cmake_args)
make()
make("install")

View file

@ -0,0 +1,34 @@
from spack import *
class P4est(Package):
"""Dynamic management of a collection (a forest) of adaptive octrees in parallel"""
homepage = "http://www.p4est.org"
url = "http://p4est.github.io/release/p4est-1.1.tar.gz"
version('1.1', '37ba7f4410958cfb38a2140339dbf64f')
# disable by default to make it work on frontend of clusters
variant('tests', default=False, description='Run small tests')
depends_on('mpi')
def install(self, spec, prefix):
options = ['--enable-mpi',
'--enable-shared',
'--disable-vtk-binary',
'--without-blas',
'CPPFLAGS=-DSC_LOG_PRIORITY=SC_LP_ESSENTIAL',
'CFLAGS=-O2',
'CC=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpicc'), # TODO: use ENV variables or MPI class wrappers
'CXX=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpic++'),
'FC=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif90'),
'F77=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif77'),
]
configure('--prefix=%s' % prefix, *options)
make()
if '+tests' in self.spec:
make("check")
make("install")

View file

@ -0,0 +1,71 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca945dd..aff8b5f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,7 +23,7 @@ else()
set(ParMETIS_LIBRARY_TYPE STATIC)
endif()
-include(${GKLIB_PATH}/GKlibSystem.cmake)
+include_directories(${GKLIB_PATH})
# List of paths that the compiler will search for header files.
# i.e., the -I equivalent
@@ -33,7 +33,7 @@ include_directories(${GKLIB_PATH})
include_directories(${METIS_PATH}/include)
# List of directories that cmake will look for CMakeLists.txt
-add_subdirectory(${METIS_PATH}/libmetis ${CMAKE_BINARY_DIR}/libmetis)
+find_library(METIS_LIBRARY metis PATHS ${METIS_PATH}/lib)
add_subdirectory(include)
add_subdirectory(libparmetis)
add_subdirectory(programs)
diff --git a/libparmetis/CMakeLists.txt b/libparmetis/CMakeLists.txt
index 9cfc8a7..e0c4de7 100644
--- a/libparmetis/CMakeLists.txt
+++ b/libparmetis/CMakeLists.txt
@@ -5,7 +5,10 @@ file(GLOB parmetis_sources *.c)
# Create libparmetis
add_library(parmetis ${ParMETIS_LIBRARY_TYPE} ${parmetis_sources})
# Link with metis and MPI libraries.
-target_link_libraries(parmetis metis ${MPI_LIBRARIES})
+target_link_libraries(parmetis ${METIS_LIBRARY} ${MPI_LIBRARIES})
+if(UNIX)
+ target_link_libraries(parmetis m)
+endif()
set_target_properties(parmetis PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}")
install(TARGETS parmetis
diff --git a/libparmetis/parmetislib.h b/libparmetis/parmetislib.h
index c1daeeb..07511f6 100644
--- a/libparmetis/parmetislib.h
+++ b/libparmetis/parmetislib.h
@@ -20,13 +20,12 @@
#include <parmetis.h>
-#include "../metis/libmetis/gklib_defs.h"
+#include <gklib_defs.h>
-#include <mpi.h>
+#include <mpi.h>
#include <rename.h>
#include <defs.h>
#include <struct.h>
#include <macros.h>
#include <proto.h>
-
diff --git a/programs/parmetisbin.h b/programs/parmetisbin.h
index e26cd2d..d156480 100644
--- a/programs/parmetisbin.h
+++ b/programs/parmetisbin.h
@@ -19,7 +19,7 @@
#include <GKlib.h>
#include <parmetis.h>
-#include "../metis/libmetis/gklib_defs.h"
+#include <gklib_defs.h>
#include "../libparmetis/rename.h"
#include "../libparmetis/defs.h"
#include "../libparmetis/struct.h"

View file

@ -24,10 +24,7 @@
############################################################################## ##############################################################################
from spack import * from spack import *
import sys
# FIXME : lot of code is duplicated from packages/metis/package.py . Inheriting from there may reduce
# FIXME : the installation rules to just a few lines
class Parmetis(Package): class Parmetis(Package):
""" """
@ -43,13 +40,17 @@ class Parmetis(Package):
variant('debug', default=False, description='Builds the library in debug mode') variant('debug', default=False, description='Builds the library in debug mode')
variant('gdb', default=False, description='Enables gdb support') variant('gdb', default=False, description='Enables gdb support')
variant('idx64', default=False, description='Use int64_t as default index type')
variant('double', default=False, description='Use double precision floating point types')
depends_on('cmake @2.8:') # build dependency depends_on('cmake @2.8:') # build dependency
depends_on('mpi') depends_on('mpi')
# FIXME : this should conflict with metis as it builds its own version internally patch('enable_external_metis.patch')
depends_on('metis')
# bug fixes from PETSc developers
# https://bitbucket.org/petsc/pkg-parmetis/commits/1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b/raw/
patch('pkg-parmetis-1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b.patch')
# https://bitbucket.org/petsc/pkg-parmetis/commits/82409d68aa1d6cbc70740d0f35024aae17f7d5cb/raw/
patch('pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch')
depends_on('gdb', when='+gdb') depends_on('gdb', when='+gdb')
@ -63,8 +64,8 @@ def install(self, spec, prefix):
# FIXME : Once a contract is defined, MPI compilers should be retrieved indirectly via spec['mpi'] in case # FIXME : Once a contract is defined, MPI compilers should be retrieved indirectly via spec['mpi'] in case
# FIXME : they use a non-standard name # FIXME : they use a non-standard name
options.extend(['-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=metis_source), options.extend(['-DGKLIB_PATH:PATH={metis_source}/GKlib'.format(metis_source=spec['metis'].prefix.include),
'-DMETIS_PATH:PATH={metis_source}'.format(metis_source=metis_source), '-DMETIS_PATH:PATH={metis_source}'.format(metis_source=spec['metis'].prefix),
'-DCMAKE_C_COMPILER:STRING=mpicc', '-DCMAKE_C_COMPILER:STRING=mpicc',
'-DCMAKE_CXX_COMPILER:STRING=mpicxx']) '-DCMAKE_CXX_COMPILER:STRING=mpicxx'])
@ -78,18 +79,11 @@ def install(self, spec, prefix):
if '+gdb' in spec: if '+gdb' in spec:
options.append('-DGDB:BOOL=ON') options.append('-DGDB:BOOL=ON')
metis_header = join_path(metis_source, 'include', 'metis.h')
if '+idx64' in spec:
filter_file('IDXTYPEWIDTH 32', 'IDXTYPEWIDTH 64', metis_header)
if '+double' in spec:
filter_file('REALTYPEWIDTH 32', 'REALTYPEWIDTH 64', metis_header)
with working_dir(build_directory, create=True): with working_dir(build_directory, create=True):
cmake(source_directory, *options) cmake(source_directory, *options)
make() make()
make("install") make("install")
# Parmetis build system doesn't allow for an external metis to be used, but doesn't copy the required
# metis header either # The shared library is not installed correctly on Darwin; correct this
install(metis_header, self.prefix.include) if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -0,0 +1,77 @@
From 1c1a9fd0f408dc4d42c57f5c3ee6ace411eb222b Mon Sep 17 00:00:00 2001
From: Jed Brown <jed@59A2.org>
Date: Fri, 12 Oct 2012 15:45:10 -0500
Subject: [PATCH] ParMetis bug fixes reported by John Fettig [petsc-maint
#133631]
'''
I have also reported to to Karypis but have received zero
response and he hasn't released any updates to the original release
either. At least he approved my forum posting so that other people
can see the bug and the fix.
http://glaros.dtc.umn.edu/gkhome/node/837
'''
Hg-commit: 1c2b9fe39201d404b493885093b5992028b9b8d4
---
libparmetis/xyzpart.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/libparmetis/xyzpart.c b/libparmetis/xyzpart.c
index 3a2c289..63abfcb 100644
--- a/libparmetis/xyzpart.c
+++ b/libparmetis/xyzpart.c
@@ -104,7 +104,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
for (i=0; i<nbins; i++)
emarkers[i] = gmin + (gmax-gmin)*i/nbins;
- emarkers[nbins] = gmax*(1.0+2.0*REAL_EPSILON);
+ emarkers[nbins] = gmax*(1.0+copysign(1.0,gmax)*2.0*REAL_EPSILON);
/* get into a iterative backet boundary refinement */
for (l=0; l<5; l++) {
@@ -152,7 +152,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
}
}
nemarkers[0] = gmin;
- nemarkers[nbins] = gmax*(1.0+2.0*REAL_EPSILON);
+ nemarkers[nbins] = gmax*(1.0+copysign(1.0,gmax)*2.0*REAL_EPSILON);
rcopy(nbins+1, nemarkers, emarkers);
}
@@ -218,7 +218,7 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
emarkers[0] = gmin;
emarkers[1] = gsum/gnvtxs;
- emarkers[2] = gmax*(1.0+2.0*REAL_EPSILON);
+ emarkers[2] = gmax*(1.0+(gmax < 0 ? -1. : 1.)*2.0*REAL_EPSILON);
cnbins = 2;
/* get into a iterative backet boundary refinement */
@@ -227,7 +227,7 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
iset(cnbins, 0, lcounts);
rset(cnbins, 0, lsums);
for (j=0, i=0; i<nvtxs;) {
- if (cand[i].key < emarkers[j+1]) {
+ if (cand[i].key <= emarkers[j+1]) {
lcounts[j]++;
lsums[j] += cand[i].key;
i++;
@@ -272,12 +272,12 @@ void RBBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
rsorti(cnbins, nemarkers);
rcopy(cnbins, nemarkers, emarkers);
- emarkers[cnbins] = gmax*(1.0+2.0*REAL_EPSILON);
+ emarkers[cnbins] = gmax*(1.0+(gmax < 0 ? -1. : 1.)*2.0*REAL_EPSILON);
}
/* assign the coordinate to the appropriate bin */
for (j=0, i=0; i<nvtxs;) {
- if (cand[i].key < emarkers[j+1]) {
+ if (cand[i].key <= emarkers[j+1]) {
bxyz[cand[i].val*ndims+k] = j;
i++;
}
--
2.1.1.1.g1fb337f

View file

@ -0,0 +1,35 @@
From 82409d68aa1d6cbc70740d0f35024aae17f7d5cb Mon Sep 17 00:00:00 2001
From: Sean Farley <sean@mcs.anl.gov>
Date: Tue, 20 Mar 2012 11:59:44 -0500
Subject: [PATCH] parmetis: fix bug reported by jfettig; '<' to '<=' in xyzpart
Hg-commit: 2dd2eae596acaabbc80e0ef875182616f868dbc2
---
libparmetis/xyzpart.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libparmetis/xyzpart.c b/libparmetis/xyzpart.c
index 307aed9..3a2c289 100644
--- a/libparmetis/xyzpart.c
+++ b/libparmetis/xyzpart.c
@@ -111,7 +111,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
/* determine bucket counts */
iset(nbins, 0, lcounts);
for (j=0, i=0; i<nvtxs;) {
- if (cand[i].key < emarkers[j+1]) {
+ if (cand[i].key <= emarkers[j+1]) {
lcounts[j]++;
i++;
}
@@ -158,7 +158,7 @@ void IRBinCoordinates(ctrl_t *ctrl, graph_t *graph, idx_t ndims, real_t *xyz,
/* assign the coordinate to the appropriate bin */
for (j=0, i=0; i<nvtxs;) {
- if (cand[i].key < emarkers[j+1]) {
+ if (cand[i].key <= emarkers[j+1]) {
bxyz[cand[i].val*ndims+k] = j;
i++;
}
--
2.1.1.1.g1fb337f

View file

@ -17,14 +17,18 @@ class Petsc(Package):
version('3.5.1', 'a557e029711ebf425544e117ffa44d8f') version('3.5.1', 'a557e029711ebf425544e117ffa44d8f')
version('3.4.4', '7edbc68aa6d8d6a3295dd5f6c2f6979d') version('3.4.4', '7edbc68aa6d8d6a3295dd5f6c2f6979d')
variant('shared', default=True, description='Enables the build of shared libraries') variant('shared', default=True, description='Enables the build of shared libraries')
variant('mpi', default=True, description='Activates MPI support') variant('mpi', default=True, description='Activates MPI support')
variant('double', default=True, description='Switches between single and double precision') variant('double', default=True, description='Switches between single and double precision')
variant('complex', default=False, description='Build with complex numbers')
variant('debug', default=False, description='Compile in debug mode')
variant('metis', default=True, description='Activates support for metis and parmetis') variant('metis', default=True, description='Activates support for metis and parmetis')
variant('hdf5', default=True, description='Activates support for HDF5 (only parallel)') variant('hdf5', default=True, description='Activates support for HDF5 (only parallel)')
variant('boost', default=True, description='Activates support for Boost') variant('boost', default=True, description='Activates support for Boost')
variant('hypre', default=True, description='Activates support for Hypre') variant('hypre', default=True, description='Activates support for Hypre (only parallel)')
variant('mumps', default=True, description='Activates support for MUMPS (only parallel)')
variant('superlu-dist', default=True, description='Activates support for SuperluDist (only parallel)')
# Virtual dependencies # Virtual dependencies
depends_on('blas') depends_on('blas')
@ -40,7 +44,13 @@ class Petsc(Package):
depends_on('hdf5+mpi', when='+hdf5+mpi') depends_on('hdf5+mpi', when='+hdf5+mpi')
depends_on('parmetis', when='+metis+mpi') depends_on('parmetis', when='+metis+mpi')
depends_on('hypre', when='+hypre+mpi') # Hypre does not support complex numbers.
# Also PETSc prefer to build it without internal superlu, likely due to conflict in headers
# see https://bitbucket.org/petsc/petsc/src/90564b43f6b05485163c147b464b5d6d28cde3ef/config/BuildSystem/config/packages/hypre.py
depends_on('hypre~internal-superlu', when='+hypre+mpi~complex')
depends_on('superlu-dist', when='+superlu-dist+mpi')
depends_on('mumps+mpi', when='+mumps+mpi')
depends_on('scalapack', when='+mumps+mpi')
def mpi_dependent_options(self): def mpi_dependent_options(self):
if '~mpi' in self.spec: if '~mpi' in self.spec:
@ -55,7 +65,7 @@ def mpi_dependent_options(self):
# If mpi is disabled (~mpi), it's an error to have any of these enabled. # If mpi is disabled (~mpi), it's an error to have any of these enabled.
# This generates a list of any such errors. # This generates a list of any such errors.
errors = [error_message_fmt.format(library=x) errors = [error_message_fmt.format(library=x)
for x in ('hdf5', 'hypre', 'parmetis') for x in ('hdf5', 'hypre', 'parmetis','mumps','superlu-dist')
if ('+'+x) in self.spec] if ('+'+x) in self.spec]
if errors: if errors:
errors = ['incompatible variants given'] + errors errors = ['incompatible variants given'] + errors
@ -68,15 +78,17 @@ def mpi_dependent_options(self):
return compiler_opts return compiler_opts
def install(self, spec, prefix): def install(self, spec, prefix):
options = [] options = ['--with-ssl=0']
options.extend(self.mpi_dependent_options()) options.extend(self.mpi_dependent_options())
options.extend([ options.extend([
'--with-precision=%s' % ('double' if '+double' in spec else 'single'), '--with-precision=%s' % ('double' if '+double' in spec else 'single'),
'--with-scalar-type=%s' % ('complex' if '+complex' in spec else 'real'),
'--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'), '--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'),
'--with-debugging=%s' % ('1' if '+debug' in spec else '0'),
'--with-blas-lapack-dir=%s' % spec['lapack'].prefix '--with-blas-lapack-dir=%s' % spec['lapack'].prefix
]) ])
# Activates library support if needed # Activates library support if needed
for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis'): for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis','mumps','scalapack'):
options.append( options.append(
'--with-{library}={value}'.format(library=library, value=('1' if library in spec else '0')) '--with-{library}={value}'.format(library=library, value=('1' if library in spec else '0'))
) )
@ -84,9 +96,24 @@ def install(self, spec, prefix):
options.append( options.append(
'--with-{library}-dir={path}'.format(library=library, path=spec[library].prefix) '--with-{library}-dir={path}'.format(library=library, path=spec[library].prefix)
) )
# PETSc does not pick up SuperluDist from the dir as they look for superlu_dist_4.1.a
if 'superlu-dist' in spec:
options.extend([
'--with-superlu_dist-include=%s' % spec['superlu-dist'].prefix.include,
'--with-superlu_dist-lib=%s' % join_path(spec['superlu-dist'].prefix.lib, 'libsuperlu_dist.a'),
'--with-superlu_dist=1'
])
else:
options.append(
'--with-superlu_dist=0'
)
configure('--prefix=%s' % prefix, *options) configure('--prefix=%s' % prefix, *options)
# PETSc has its own way of doing parallel make. # PETSc has its own way of doing parallel make.
make('MAKE_NP=%s' % make_jobs, parallel=False) make('MAKE_NP=%s' % make_jobs, parallel=False)
make("install") make("install")
def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
# set up PETSC_DIR for everyone using PETSc package
spack_env.set('PETSC_DIR', self.prefix)

View file

@ -0,0 +1,14 @@
from spack import *
class PyBottleneck(Package):
"""Bottleneck is a collection of fast NumPy array functions written in Cython."""
homepage = "https://pypi.python.org/pypi/Bottleneck/1.0.0"
url = "https://pypi.python.org/packages/source/B/Bottleneck/Bottleneck-1.0.0.tar.gz"
version('1.0.0', '380fa6f275bd24f27e7cf0e0d752f5d2')
extends('python', ignore=r'bin/f2py$')
depends_on('py-numpy')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -3,10 +3,14 @@
class PyCython(Package): class PyCython(Package):
"""The Cython compiler for writing C extensions for the Python language.""" """The Cython compiler for writing C extensions for the Python language."""
homepage = "https://pypi.python.org/pypi/cython" homepage = "https://pypi.python.org/pypi/cython"
url = "https://pypi.python.org/packages/source/C/Cython/cython-0.22.tar.gz" url = "https://pypi.python.org/packages/source/C/Cython/Cython-0.22.tar.gz"
version('0.21.2', 'd21adb870c75680dc857cd05d41046a4') version('0.23.5', '66b62989a67c55af016c916da36e7514')
version('0.23.4', '157df1f69bcec6b56fd97e0f2e057f6e')
# These versions contain illegal Python3 code...
version('0.22', '1ae25add4ef7b63ee9b4af697300d6b6') version('0.22', '1ae25add4ef7b63ee9b4af697300d6b6')
version('0.21.2', 'd21adb870c75680dc857cd05d41046a4')
extends('python') extends('python')

View file

@ -7,6 +7,7 @@ class PyDateutil(Package):
version('2.4.0', '75714163bb96bedd07685cdb2071b8bc') version('2.4.0', '75714163bb96bedd07685cdb2071b8bc')
version('2.4.2', '4ef68e1c485b09e9f034e10473e5add2') version('2.4.2', '4ef68e1c485b09e9f034e10473e5add2')
version('2.5.2', 'eafe168e8f404bf384514f5116eedbb6')
extends('python') extends('python')
depends_on('py-setuptools') depends_on('py-setuptools')

View file

@ -1,15 +0,0 @@
from spack import *
class PyLibxml2(Package):
"""A Python wrapper around libxml2."""
homepage = "https://xmlsoft.org/python.html"
url = "ftp://xmlsoft.org/libxml2/python/libxml2-python-2.6.21.tar.gz"
version('2.6.21', '229dd2b3d110a77defeeaa73af83f7f3')
extends('python')
depends_on('libxml2')
depends_on('libxslt')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -12,7 +12,7 @@ class PyMatplotlib(Package):
variant('gui', default=False, description='Enable GUI') variant('gui', default=False, description='Enable GUI')
variant('ipython', default=False, description='Enable ipython support') variant('ipython', default=False, description='Enable ipython support')
extends('python', ignore=r'bin/nosetests.*$|bin/pbr$') extends('python', ignore=r'bin/nosetests.*$|bin/pbr$|bin/f2py$')
depends_on('py-pyside', when='+gui') depends_on('py-pyside', when='+gui')
depends_on('py-ipython', when='+ipython') depends_on('py-ipython', when='+ipython')

View file

@ -0,0 +1,16 @@
from spack import *
class PyNetcdf(Package):
"""Python interface to the netCDF Library."""
homepage = "http://unidata.github.io/netcdf4-python"
url = "https://github.com/Unidata/netcdf4-python/tarball/v1.2.3.1rel"
version('1.2.3.1', '4fc4320d4f2a77b894ebf8da1c9895af')
extends('python')
depends_on('py-numpy')
depends_on('py-cython')
depends_on('netcdf')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -10,6 +10,7 @@ class PyNose(Package):
version('1.3.4', '6ed7169887580ddc9a8e16048d38274d') version('1.3.4', '6ed7169887580ddc9a8e16048d38274d')
version('1.3.6', '0ca546d81ca8309080fc80cb389e7a16') version('1.3.6', '0ca546d81ca8309080fc80cb389e7a16')
version('1.3.7', '4d3ad0ff07b61373d2cefc89c5d0b20b')
extends('python', ignore=r'bin/nosetests.*$') extends('python', ignore=r'bin/nosetests.*$')
depends_on('py-setuptools') depends_on('py-setuptools')

View file

@ -7,8 +7,9 @@ class PyNumexpr(Package):
url = "https://pypi.python.org/packages/source/n/numexpr/numexpr-2.4.6.tar.gz" url = "https://pypi.python.org/packages/source/n/numexpr/numexpr-2.4.6.tar.gz"
version('2.4.6', '17ac6fafc9ea1ce3eb970b9abccb4fbd') version('2.4.6', '17ac6fafc9ea1ce3eb970b9abccb4fbd')
version('2.5', '84f66cced45ba3e30dcf77a937763aaa')
extends('python') extends('python', ignore=r'bin/f2py$')
depends_on('py-numpy') depends_on('py-numpy')
def install(self, spec, prefix): def install(self, spec, prefix):

View file

@ -1,24 +1,44 @@
from spack import * from spack import *
class PyNumpy(Package): class PyNumpy(Package):
"""array processing for numbers, strings, records, and objects.""" """NumPy is the fundamental package for scientific computing with Python.
homepage = "https://pypi.python.org/pypi/numpy" It contains among other things: a powerful N-dimensional array object,
sophisticated (broadcasting) functions, tools for integrating C/C++ and
Fortran code, and useful linear algebra, Fourier transform, and random
number capabilities"""
homepage = "http://www.numpy.org/"
url = "https://pypi.python.org/packages/source/n/numpy/numpy-1.9.1.tar.gz" url = "https://pypi.python.org/packages/source/n/numpy/numpy-1.9.1.tar.gz"
version('1.9.1', '78842b73560ec378142665e712ae4ad9') version('1.11.0', 'bc56fb9fc2895aa4961802ffbdb31d0b')
version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645') version('1.10.4', 'aed294de0aa1ac7bd3f9745f4f1968ad')
version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645')
version('1.9.1', '78842b73560ec378142665e712ae4ad9')
variant('blas', default=True)
variant('blas', default=True)
variant('lapack', default=True)
extends('python') extends('python')
depends_on('py-nose') depends_on('py-nose')
depends_on('netlib-blas+fpic', when='+blas') depends_on('blas', when='+blas')
depends_on('netlib-lapack+shared', when='+blas') depends_on('lapack', when='+lapack')
def install(self, spec, prefix): def install(self, spec, prefix):
libraries = []
library_dirs = []
if '+blas' in spec: if '+blas' in spec:
libraries.append('blas')
library_dirs.append(spec['blas'].prefix.lib)
if '+lapack' in spec:
libraries.append('lapack')
library_dirs.append(spec['lapack'].prefix.lib)
if '+blas' in spec or '+lapack' in spec:
with open('site.cfg', 'w') as f: with open('site.cfg', 'w') as f:
f.write('[DEFAULT]\n') f.write('[DEFAULT]\n')
f.write('libraries=lapack,blas\n') f.write('libraries=%s\n' % ','.join(libraries))
f.write('library_dirs=%s/lib:%s/lib\n' % (spec['blas'].prefix, spec['lapack'].prefix)) f.write('library_dirs=%s\n' % ':'.join(library_dirs))
python('setup.py', 'install', '--prefix=%s' % prefix) python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -8,18 +8,15 @@ class PyPandas(Package):
version('0.16.0', 'bfe311f05dc0c351f8955fbd1e296e73') version('0.16.0', 'bfe311f05dc0c351f8955fbd1e296e73')
version('0.16.1', 'fac4f25748f9610a3e00e765474bdea8') version('0.16.1', 'fac4f25748f9610a3e00e765474bdea8')
version('0.18.0', 'f143762cd7a59815e348adf4308d2cf6')
extends('python') extends('python', ignore=r'bin/f2py$')
depends_on('py-dateutil') depends_on('py-dateutil')
depends_on('py-numpy') depends_on('py-numpy')
depends_on('py-matplotlib')
depends_on('py-scipy')
depends_on('py-setuptools') depends_on('py-setuptools')
depends_on('py-pytz') depends_on('py-pytz')
depends_on('libdrm') depends_on('py-numexpr')
depends_on('libpciaccess') depends_on('py-bottleneck')
depends_on('llvm')
depends_on('mesa')
def install(self, spec, prefix): def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix) python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -7,6 +7,7 @@ class PyPytz(Package):
version('2014.10', 'eb1cb941a20c5b751352c52486aa1dd7') version('2014.10', 'eb1cb941a20c5b751352c52486aa1dd7')
version('2015.4', '417a47b1c432d90333e42084a605d3d8') version('2015.4', '417a47b1c432d90333e42084a605d3d8')
version('2016.3', 'abae92c3301b27bd8a9f56b14f52cb29')
extends('python') extends('python')

View file

@ -2,11 +2,12 @@
class PyScipy(Package): class PyScipy(Package):
"""Scientific Library for Python.""" """Scientific Library for Python."""
homepage = "https://pypi.python.org/pypi/scipy" homepage = "http://www.scipy.org/"
url = "https://pypi.python.org/packages/source/s/scipy/scipy-0.15.0.tar.gz" url = "https://pypi.python.org/packages/source/s/scipy/scipy-0.15.0.tar.gz"
version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a') version('0.17.0', '5ff2971e1ce90e762c59d2cd84837224')
version('0.15.1', 'be56cd8e60591d6332aac792a5880110') version('0.15.1', 'be56cd8e60591d6332aac792a5880110')
version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a')
extends('python') extends('python')
depends_on('py-nose') depends_on('py-nose')

View file

@ -9,6 +9,7 @@ class PySetuptools(Package):
version('16.0', '0ace0b96233516fc5f7c857d086aa3ad') version('16.0', '0ace0b96233516fc5f7c857d086aa3ad')
version('18.1', 'f72e87f34fbf07f299f6cb46256a0b06') version('18.1', 'f72e87f34fbf07f299f6cb46256a0b06')
version('19.2', '78353b1f80375ca5e088f4b4627ffe03') version('19.2', '78353b1f80375ca5e088f4b4627ffe03')
version('20.5', 'fadc1e1123ddbe31006e5e43e927362b')
extends('python') extends('python')

View file

@ -6,6 +6,7 @@ class PySix(Package):
url = "https://pypi.python.org/packages/source/s/six/six-1.9.0.tar.gz" url = "https://pypi.python.org/packages/source/s/six/six-1.9.0.tar.gz"
version('1.9.0', '476881ef4012262dfc8adc645ee786c4') version('1.9.0', '476881ef4012262dfc8adc645ee786c4')
version('1.10.0', '34eed507548117b2ab523ab14b2f8b55')
extends('python') extends('python')
depends_on('py-setuptools') depends_on('py-setuptools')

View file

@ -0,0 +1,19 @@
from spack import *
class PyTuiview(Package):
"""
TuiView is a lightweight raster GIS with powerful raster attribute
table manipulation abilities.
"""
homepage = "https://bitbucket.org/chchrsc/tuiview"
url = "https://bitbucket.org/chchrsc/tuiview/get/tuiview-1.1.7.tar.gz"
version('1.1.7', '4b3b38a820cc239c8ab4a181ac5d4c30')
extends("python")
depends_on("py-pyqt")
depends_on("py-numpy")
depends_on("gdal")
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -8,6 +8,7 @@ class PyVirtualenv(Package):
version('1.11.6', 'f61cdd983d2c4e6aeabb70b1060d6f49') version('1.11.6', 'f61cdd983d2c4e6aeabb70b1060d6f49')
version('13.0.1', '1ffc011bde6667f0e37ecd976f4934db') version('13.0.1', '1ffc011bde6667f0e37ecd976f4934db')
version('15.0.1', '28d76a0d9cbd5dc42046dd14e76a6ecc')
extends('python') extends('python')
depends_on('py-setuptools') depends_on('py-setuptools')

View file

@ -105,10 +105,13 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
pythonpath = ':'.join(python_paths) pythonpath = ':'.join(python_paths)
spack_env.set('PYTHONPATH', pythonpath) spack_env.set('PYTHONPATH', pythonpath)
run_env.set('PYTHONPATH', pythonpath)
# For run time environment set only the path for extension_spec and prepend it to PYTHONPATH
if extension_spec.package.extends(self.spec):
run_env.prepend_path('PYTHONPATH', os.path.join(extension_spec.prefix, self.site_packages_dir))
def modify_module(self, module, spec, ext_spec): def setup_dependent_package(self, module, ext_spec):
""" """
Called before python modules' install() methods. Called before python modules' install() methods.
@ -118,17 +121,18 @@ def modify_module(self, module, spec, ext_spec):
""" """
# Python extension builds can have a global python executable function # Python extension builds can have a global python executable function
if self.version >= Version("3.0.0") and self.version < Version("4.0.0"): if self.version >= Version("3.0.0") and self.version < Version("4.0.0"):
module.python = Executable(join_path(spec.prefix.bin, 'python3')) module.python = Executable(join_path(self.spec.prefix.bin, 'python3'))
else: else:
module.python = Executable(join_path(spec.prefix.bin, 'python')) module.python = Executable(join_path(self.spec.prefix.bin, 'python'))
# Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs. # Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
module.python_lib_dir = os.path.join(ext_spec.prefix, self.python_lib_dir) module.python_lib_dir = os.path.join(ext_spec.prefix, self.python_lib_dir)
module.python_include_dir = os.path.join(ext_spec.prefix, self.python_include_dir) module.python_include_dir = os.path.join(ext_spec.prefix, self.python_include_dir)
module.site_packages_dir = os.path.join(ext_spec.prefix, self.site_packages_dir) module.site_packages_dir = os.path.join(ext_spec.prefix, self.site_packages_dir)
# Make the site packages directory if it does not exist already. # Make the site packages directory for extensions, if it does not exist already.
mkdirp(module.site_packages_dir) if ext_spec.package.is_extension:
mkdirp(module.site_packages_dir)
# ======================================================================== # ========================================================================
# Handle specifics of activating and deactivating python modules. # Handle specifics of activating and deactivating python modules.

View file

@ -30,7 +30,7 @@ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
# The actual installation path for this gem # The actual installation path for this gem
spack_env.set('GEM_HOME', extension_spec.prefix) spack_env.set('GEM_HOME', extension_spec.prefix)
def modify_module(self, module, spec, ext_spec): def setup_dependent_package(self, module, ext_spec):
"""Called before ruby modules' install() methods. Sets GEM_HOME """Called before ruby modules' install() methods. Sets GEM_HOME
and GEM_PATH to values appropriate for the package being built. and GEM_PATH to values appropriate for the package being built.
@ -39,5 +39,5 @@ def modify_module(self, module, spec, ext_spec):
gem('install', '<gem-name>.gem') gem('install', '<gem-name>.gem')
""" """
# Ruby extension builds have global ruby and gem functions # Ruby extension builds have global ruby and gem functions
module.ruby = Executable(join_path(spec.prefix.bin, 'ruby')) module.ruby = Executable(join_path(self.spec.prefix.bin, 'ruby'))
module.gem = Executable(join_path(spec.prefix.bin, 'gem')) module.gem = Executable(join_path(self.spec.prefix.bin, 'gem'))

View file

@ -5,24 +5,35 @@ class Silo(Package):
data to binary, disk files.""" data to binary, disk files."""
homepage = "http://wci.llnl.gov/simulation/computer-codes/silo" homepage = "http://wci.llnl.gov/simulation/computer-codes/silo"
url = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo/silo-4.8/silo-4.8.tar.gz" base_url = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo"
version('4.10.2', '9ceac777a2f2469ac8cef40f4fab49c8')
version('4.9', 'a83eda4f06761a86726e918fc55e782a')
version('4.8', 'b1cbc0e7ec435eb656dc4b53a23663c9') version('4.8', 'b1cbc0e7ec435eb656dc4b53a23663c9')
variant('fortran', default=True, description='Enable Fortran support') variant('fortran', default=True, description='Enable Fortran support')
variant('silex', default=False, description='Builds Silex, a GUI for viewing Silo files')
depends_on("hdf5") depends_on('hdf5')
depends_on('qt', when='+silex')
def install(self, spec, prefix): def install(self, spec, prefix):
config_args = [ config_args = [
'--enable-fortran' if '+fortran' in spec else '--disable-fortran', '--enable-fortran' if '+fortran' in spec else '--disable-fortran',
'--enable-silex' if '+silex' in spec else '--disable-silex',
] ]
if '+silex' in spec:
config_args.append('--with-Qt-dir=%s' % spec['qt'].prefix)
configure( configure(
"--prefix=%s" % prefix, '--prefix=%s' % prefix,
"--with-hdf5=%s,%s" % (spec['hdf5'].prefix.include, spec['hdf5'].prefix.lib), '--with-hdf5=%s,%s' % (spec['hdf5'].prefix.include, spec['hdf5'].prefix.lib),
"--with-zlib=%s,%s" % (spec['zlib'].prefix.include, spec['zlib'].prefix.lib), '--with-zlib=%s,%s' % (spec['zlib'].prefix.include, spec['zlib'].prefix.lib),
*config_args) *config_args)
make() make()
make("install") make('install')
def url_for_version(self, version):
return '%s/silo-%s/silo-%s.tar.gz' % (Silo.base_url, version, version)

View file

@ -0,0 +1,49 @@
import os
from spack import *
class Slepc(Package):
"""
Scalable Library for Eigenvalue Computations.
"""
homepage = "http://www.grycap.upv.es/slepc"
url = "http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz"
version('3.6.2', '2ab4311bed26ccf7771818665991b2ea3a9b15f97e29fd13911ab1293e8e65df')
variant('arpack', default=False, description='Enables Arpack wrappers')
depends_on('petsc')
depends_on('arpack-ng~mpi',when='+arpack^petsc~mpi')
depends_on('arpack-ng+mpi',when='+arpack^petsc+mpi')
def install(self, spec, prefix):
# set SLEPC_DIR for installation
os.environ['SLEPC_DIR'] = self.stage.source_path
options = []
if '+arpack' in spec:
options.extend([
'--with-arpack-dir=%s' % spec['arpack-ng'].prefix.lib,
])
if 'arpack-ng~mpi' in spec:
options.extend([
'--with-arpack-flags=-larpack'
])
else:
options.extend([
'--with-arpack-flags=-lparpack,-larpack'
])
configure('--prefix=%s' % prefix, *options)
make('MAKE_NP=%s' % make_jobs, parallel=False)
#FIXME:
# make('test')
make('install')
def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
# set up SLEPC_DIR for everyone using SLEPc package
spack_env.set('SLEPC_DIR', self.prefix)

View file

@ -0,0 +1,77 @@
##############################################################################
# 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://github.com/llnl/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
##############################################################################
from spack import *
#import os
class Subversion(Package):
"""Apache Subversion - an open source version control system."""
homepage = 'https://subversion.apache.org/'
url = 'http://archive.apache.org/dist/subversion/subversion-1.8.13.tar.gz'
version('1.8.13', '8065b3698d799507fb72dd7926ed32b6')
version('1.9.3', 'a92bcfaec4e5038f82c74a7b5bbd2f46')
depends_on('apr')
depends_on('apr-util')
depends_on('zlib')
depends_on('sqlite')
# Optional: We need swig if we want the Perl, Python or Ruby
# bindings.
#depends_on('swig')
#depends_on('python')
#depends_on('perl')
#depends_on('ruby')
def install(self, spec, prefix):
# configure, build, install:
# Ref: http://www.linuxfromscratch.org/blfs/view/svn/general/subversion.html
options = ['--prefix=%s' % prefix]
options.append('--with-apr=%s' % spec['apr'].prefix)
options.append('--with-apr-util=%s' % spec['apr-util'].prefix)
options.append('--with-zlib=%s' % spec['zlib'].prefix)
options.append('--with-sqlite=%s' % spec['sqlite'].prefix)
#options.append('--with-swig=%s' % spec['swig'].prefix)
configure(*options)
make()
make('install')
# python bindings
#make('swig-py',
# 'swig-pydir=/usr/lib/python2.7/site-packages/libsvn',
# 'swig_pydir_extra=/usr/lib/python2.7/site-packages/svn')
#make('install-swig-py',
# 'swig-pydir=/usr/lib/python2.7/site-packages/libsvn',
# 'swig_pydir_extra=/usr/lib/python2.7/site-packages/svn')
# perl bindings
#make('swig-pl')
#make('install-swig-pl')
# ruby bindings
#make('swig-rb')
#make('isntall-swig-rb')

View file

@ -1,7 +1,7 @@
from spack import * from spack import *
class Suitesparse(Package): class SuiteSparse(Package):
""" """
SuiteSparse is a suite of sparse matrix algorithms SuiteSparse is a suite of sparse matrix algorithms
""" """
@ -23,5 +23,14 @@ def install(self, spec, prefix):
# FIXME : this actually uses the current workaround # FIXME : this actually uses the current workaround
# FIXME : (blas / lapack always provide libblas and liblapack as aliases) # FIXME : (blas / lapack always provide libblas and liblapack as aliases)
make('install', 'INSTALL=%s' % prefix, 'BLAS=-lblas', 'LAPACK=-llapack') make('install', 'INSTALL=%s' % prefix,
# inject Spack compiler wrappers
'AUTOCC=no',
'CC=cc',
'CXX=c++',
'F77=f77',
# BLAS arguments require path to libraries
'BLAS=-lblas',
'LAPACK=-llapack')

View file

@ -1,4 +1,5 @@
from spack import * from spack import *
import glob
class SuperluDist(Package): class SuperluDist(Package):
"""A general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations on high performance machines.""" """A general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations on high performance machines."""
@ -52,12 +53,13 @@ def install(self, spec, prefix):
# system "make" # system "make"
# need to install by hand # need to install by hand
headers_location = join_path(self.prefix.include,'superlu_dist') headers_location = self.prefix.include
mkdirp(headers_location) mkdirp(headers_location)
# FIXME: fetch all headers in the folder automatically mkdirp(prefix.lib)
for header in ['Cnames.h','cublas_utils.h','dcomplex.h','html_mainpage.h','machines.h','old_colamd.h','psymbfact.h','superlu_ddefs.h','superlu_defs.h','superlu_enum_consts.h','superlu_zdefs.h','supermatrix.h','util_dist.h']:
superludist_header = join_path(self.stage.source_path, 'SRC/',header) headers = glob.glob(join_path(self.stage.source_path, 'SRC','*.h'))
install(superludist_header, headers_location) for h in headers:
install(h,headers_location)
superludist_lib = join_path(self.stage.source_path, 'lib/libsuperlu_dist.a') superludist_lib = join_path(self.stage.source_path, 'lib/libsuperlu_dist.a')
install(superludist_lib,self.prefix.lib) install(superludist_lib,self.prefix.lib)

View file

@ -0,0 +1,79 @@
from spack import *
import os
import glob
class Tbb(Package):
"""Widely used C++ template library for task parallelism.
Intel Threading Building Blocks (Intel TBB) lets you easily write parallel
C++ programs that take full advantage of multicore performance, that are
portable and composable, and that have future-proof scalability.
"""
homepage = "http://www.threadingbuildingblocks.org/"
# Only version-specific URL's work for TBB
version('4.4.3', '80707e277f69d9b20eeebdd7a5f5331137868ce1', url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160128oss_src_0.tgz')
def coerce_to_spack(self,tbb_build_subdir):
for compiler in ["icc","gcc","clang"]:
fs = glob.glob(join_path(tbb_build_subdir,"*.%s.inc" % compiler ))
for f in fs:
lines = open(f).readlines()
of = open(f,"w")
for l in lines:
if l.strip().startswith("CPLUS ="):
of.write("# coerced to spack\n")
of.write("CPLUS = $(CXX)\n")
elif l.strip().startswith("CPLUS ="):
of.write("# coerced to spack\n")
of.write("CONLY = $(CC)\n")
else:
of.write(l);
def install(self, spec, prefix):
#
# we need to follow TBB's compiler selection logic to get the proper build + link flags
# but we still need to use spack's compiler wrappers
# to accomplish this, we do two things:
#
# * Look at the spack spec to determine which compiler we should pass to tbb's Makefile
#
# * patch tbb's build system to use the compiler wrappers (CC, CXX) for
# icc, gcc, clang
# (see coerce_to_spack())
#
self.coerce_to_spack("build")
if spec.satisfies('%clang'):
tbb_compiler = "clang"
elif spec.satisfies('%intel'):
tbb_compiler = "icc"
else:
tbb_compiler = "gcc"
mkdirp(prefix)
mkdirp(prefix.lib)
#
# tbb does not have a configure script or make install target
# we simply call make, and try to put the pieces together
#
make("compiler=%s" %(tbb_compiler))
# install headers to {prefix}/include
install_tree('include',prefix.include)
# install libs to {prefix}/lib
tbb_lib_names = ["libtbb",
"libtbbmalloc",
"libtbbmalloc_proxy"]
for lib_name in tbb_lib_names:
# install release libs
fs = glob.glob(join_path("build","*release",lib_name + ".*"))
for f in fs:
install(f, prefix.lib)
# install debug libs if they exist
fs = glob.glob(join_path("build","*debug",lib_name + "_debug.*"))
for f in fs:
install(f, prefix.lib)

View file

@ -1,15 +1,22 @@
from spack import * from spack import *
import os, sys, glob
# Trilinos is complicated to build, as an inspiration a couple of links to other repositories which build it:
# https://github.com/hpcugent/easybuild-easyblocks/blob/master/easybuild/easyblocks/t/trilinos.py#L111
# https://github.com/koecher/candi/blob/master/deal.II-toolchain/packages/trilinos.package
# https://gitlab.com/configurations/cluster-config/blob/master/trilinos.sh
# https://github.com/Homebrew/homebrew-science/blob/master/trilinos.rb
# and some relevant documentation/examples:
# https://github.com/trilinos/Trilinos/issues/175
class Trilinos(Package): class Trilinos(Package):
""" """The Trilinos Project is an effort to develop algorithms and enabling technologies within an object-oriented
The Trilinos Project is an effort to develop algorithms and enabling technologies within an object-oriented
software framework for the solution of large-scale, complex multi-physics engineering and scientific problems. software framework for the solution of large-scale, complex multi-physics engineering and scientific problems.
A unique design feature of Trilinos is its focus on packages. A unique design feature of Trilinos is its focus on packages.
""" """
homepage = "https://trilinos.org/" homepage = "https://trilinos.org/"
url = "http://trilinos.csbsju.edu/download/files/trilinos-12.2.1-Source.tar.gz" url = "http://trilinos.csbsju.edu/download/files/trilinos-12.2.1-Source.tar.gz"
version('12.6.1', 'adcf2d3aab74cdda98f88fee19cd1442604199b0515ee3da4d80cbe8f37d00e4')
version('12.4.2', '7c830f7f0f68b8ad324690603baf404e') version('12.4.2', '7c830f7f0f68b8ad324690603baf404e')
version('12.2.1', '6161926ea247863c690e927687f83be9') version('12.2.1', '6161926ea247863c690e927687f83be9')
version('12.0.1', 'bd99741d047471e127b8296b2ec08017') version('12.0.1', 'bd99741d047471e127b8296b2ec08017')
@ -17,8 +24,16 @@ class Trilinos(Package):
version('11.14.2', 'a43590cf896c677890d75bfe75bc6254') version('11.14.2', 'a43590cf896c677890d75bfe75bc6254')
version('11.14.1', '40febc57f76668be8b6a77b7607bb67f') version('11.14.1', '40febc57f76668be8b6a77b7607bb67f')
variant('shared', default=True, description='Enables the build of shared libraries') variant('metis', default=True, description='Compile with METIS and ParMETIS')
variant('debug', default=False, description='Builds a debug version of the libraries') variant('mumps', default=True, description='Compile with support for MUMPS solvers')
variant('superlu-dist', default=True, description='Compile with SuperluDist solvers')
variant('hypre', default=True, description='Compile with Hypre preconditioner')
variant('hdf5', default=True, description='Compile with HDF5')
variant('suite-sparse', default=True, description='Compile with SuiteSparse solvers')
# not everyone has py-numpy activated, keep it disabled by default to avoid configure errors
variant('python', default=False, description='Build python wrappers')
variant('shared', default=True, description='Enables the build of shared libraries')
variant('debug', default=False, description='Builds a debug version of the libraries')
# Everything should be compiled with -fpic # Everything should be compiled with -fpic
depends_on('blas') depends_on('blas')
@ -27,28 +42,205 @@ class Trilinos(Package):
depends_on('matio') depends_on('matio')
depends_on('glm') depends_on('glm')
depends_on('swig') depends_on('swig')
depends_on('metis',when='+metis')
depends_on('suite-sparse',when='+suite-sparse')
# MPI related dependencies # MPI related dependencies
depends_on('mpi') depends_on('mpi')
depends_on('netcdf+mpi') depends_on('netcdf+mpi')
depends_on('parmetis',when='+metis')
# Trilinos' Tribits config system is limited which makes it
# very tricky to link Amesos with static MUMPS, see
# https://trilinos.org/docs/dev/packages/amesos2/doc/html/classAmesos2_1_1MUMPS.html
# One could work it out by getting linking flags from mpif90 --showme:link (or alike)
# and adding results to -DTrilinos_EXTRA_LINK_FLAGS
# together with Blas and Lapack and ScaLAPACK and Blacs and -lgfortran and
# it may work at the end. But let's avoid all this by simply using shared libs
depends_on('mumps@5.0:+mpi+shared',when='+mumps')
depends_on('scalapack',when='+mumps')
depends_on('superlu-dist',when='+superlu-dist')
depends_on('hypre~internal-superlu',when='+hypre')
depends_on('hdf5+mpi',when='+hdf5')
depends_on('python') # Needs py-numpy activated depends_on('python',when='+python')
patch('umfpack_from_suitesparse.patch')
# check that the combination of variants makes sense
def variants_check(self):
if '+superlu-dist' in self.spec and self.spec.satisfies('@:11.4.3'):
# For Trilinos v11 we need to force SuperLUDist=OFF,
# since only the deprecated SuperLUDist v3.3 together with an Amesos patch
# is working.
raise RuntimeError('The superlu-dist variant can only be used with Trilinos @12.0.1:')
def install(self, spec, prefix): def install(self, spec, prefix):
self.variants_check()
cxx_flags = []
options = [] options = []
options.extend(std_cmake_args) options.extend(std_cmake_args)
mpi_bin = spec['mpi'].prefix.bin
options.extend(['-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON', options.extend(['-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON',
'-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON',
'-DTrilinos_VERBOSE_CONFIGURE:BOOL=OFF',
'-DTrilinos_ENABLE_TESTS:BOOL=OFF', '-DTrilinos_ENABLE_TESTS:BOOL=OFF',
'-DTrilinos_ENABLE_EXAMPLES:BOOL=OFF', '-DTrilinos_ENABLE_EXAMPLES:BOOL=OFF',
'-DCMAKE_BUILD_TYPE:STRING=%s' % ('Debug' if '+debug' in spec else 'Release'), '-DCMAKE_BUILD_TYPE:STRING=%s' % ('DEBUG' if '+debug' in spec else 'RELEASE'),
'-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'), '-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'),
'-DTPL_ENABLE_MPI:STRING=ON', '-DTPL_ENABLE_MPI:BOOL=ON',
'-DBLAS_LIBRARY_DIRS:PATH=%s' % spec['blas'].prefix, '-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix,
'-DLAPACK_LIBRARY_DIRS:PATH=%s' % spec['lapack'].prefix '-DTPL_ENABLE_BLAS=ON',
'-DBLAS_LIBRARY_NAMES=blas', # FIXME: don't hardcode names
'-DBLAS_LIBRARY_DIRS=%s' % spec['blas'].prefix.lib,
'-DTPL_ENABLE_LAPACK=ON',
'-DLAPACK_LIBRARY_NAMES=lapack',
'-DLAPACK_LIBRARY_DIRS=%s' % spec['lapack'].prefix,
'-DTPL_ENABLE_Boost:BOOL=ON',
'-DBoost_INCLUDE_DIRS:PATH=%s' % spec['boost'].prefix.include,
'-DBoost_LIBRARY_DIRS:PATH=%s' % spec['boost'].prefix.lib,
'-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON',
'-DTrilinos_ENABLE_CXX11:BOOL=ON',
'-DTPL_ENABLE_Netcdf:BOOL=ON',
'-DTPL_ENABLE_HYPRE:BOOL=%s' % ('ON' if '+hypre' in spec else 'OFF'),
'-DTPL_ENABLE_HDF5:BOOL=%s' % ('ON' if '+hdf5' in spec else 'OFF'),
]) ])
# Fortran lib
libgfortran = os.path.dirname (os.popen('%s --print-file-name libgfortran.a' % join_path(mpi_bin,'mpif90') ).read())
options.extend([
'-DTrilinos_EXTRA_LINK_FLAGS:STRING=-L%s/ -lgfortran' % libgfortran,
'-DTrilinos_ENABLE_Fortran=ON'
])
# for build-debug only:
#options.extend([
# '-DCMAKE_VERBOSE_MAKEFILE:BOOL=TRUE'
#])
# suite-sparse related
if '+suite-sparse' in spec:
options.extend([
'-DTPL_ENABLE_Cholmod:BOOL=OFF', # FIXME: Trilinos seems to be looking for static libs only, patch CMake TPL file?
#'-DTPL_ENABLE_Cholmod:BOOL=ON',
#'-DCholmod_LIBRARY_DIRS:PATH=%s' % spec['suite-sparse'].prefix.lib,
#'-DCholmod_INCLUDE_DIRS:PATH=%s' % spec['suite-sparse'].prefix.include,
'-DTPL_ENABLE_UMFPACK:BOOL=ON',
'-DUMFPACK_LIBRARY_DIRS:PATH=%s' % spec['suite-sparse'].prefix.lib,
'-DUMFPACK_INCLUDE_DIRS:PATH=%s' % spec['suite-sparse'].prefix.include,
'-DUMFPACK_LIBRARY_NAMES=umfpack;amd;colamd;cholmod;suitesparseconfig'
])
else:
options.extend([
'-DTPL_ENABLE_Cholmod:BOOL=OFF',
'-DTPL_ENABLE_UMFPACK:BOOL=OFF',
])
# metis / parmetis
if '+metis' in spec:
options.extend([
'-DTPL_ENABLE_METIS:BOOL=ON',
'-DMETIS_LIBRARY_DIRS=%s' % spec['metis'].prefix.lib,
'-DMETIS_LIBRARY_NAMES=metis',
'-DTPL_METIS_INCLUDE_DIRS=%s' % spec['metis'].prefix.include,
'-DTPL_ENABLE_ParMETIS:BOOL=ON',
'-DParMETIS_LIBRARY_DIRS=%s;%s' % (spec['parmetis'].prefix.lib,spec['metis'].prefix.lib),
'-DParMETIS_LIBRARY_NAMES=parmetis;metis',
'-DTPL_ParMETIS_INCLUDE_DIRS=%s' % spec['parmetis'].prefix.include
])
else:
options.extend([
'-DTPL_ENABLE_METIS:BOOL=OFF',
'-DTPL_ENABLE_ParMETIS:BOOL=OFF',
])
# mumps / scalapack
if '+mumps' in spec:
options.extend([
'-DTPL_ENABLE_MUMPS:BOOL=ON',
'-DMUMPS_LIBRARY_DIRS=%s' % spec['mumps'].prefix.lib,
'-DMUMPS_LIBRARY_NAMES=dmumps;mumps_common;pord', # order is important!
'-DTPL_ENABLE_SCALAPACK:BOOL=ON',
'-DSCALAPACK_LIBRARY_NAMES=scalapack' # FIXME: for MKL it's mkl_scalapack_lp64;mkl_blacs_mpich_lp64
])
# see https://github.com/trilinos/Trilinos/blob/master/packages/amesos/README-MUMPS
cxx_flags.extend([
'-DMUMPS_5_0'
])
else:
options.extend([
'-DTPL_ENABLE_MUMPS:BOOL=OFF',
'-DTPL_ENABLE_SCALAPACK:BOOL=OFF',
])
# superlu-dist:
if '+superlu-dist' in spec:
# Amesos, conflicting types of double and complex SLU_D
# see https://trilinos.org/pipermail/trilinos-users/2015-March/004731.html
# and https://trilinos.org/pipermail/trilinos-users/2015-March/004802.html
options.extend([
'-DTeuchos_ENABLE_COMPLEX:BOOL=OFF',
'-DKokkosTSQR_ENABLE_Complex:BOOL=OFF'
])
options.extend([
'-DTPL_ENABLE_SuperLUDist:BOOL=ON',
'-DSuperLUDist_LIBRARY_DIRS=%s' % spec['superlu-dist'].prefix.lib,
'-DSuperLUDist_INCLUDE_DIRS=%s' % spec['superlu-dist'].prefix.include
])
if spec.satisfies('^superlu-dist@4.0:'):
options.extend([
'-DHAVE_SUPERLUDIST_LUSTRUCTINIT_2ARG:BOOL=ON'
])
else:
options.extend([
'-DTPL_ENABLE_SuperLUDist:BOOL=OFF',
])
# python
if '+python' in spec:
options.extend([
'-DTrilinos_ENABLE_PyTrilinos:BOOL=ON'
])
else:
options.extend([
'-DTrilinos_ENABLE_PyTrilinos:BOOL=OFF'
])
# collect CXX flags:
options.extend([
'-DCMAKE_CXX_FLAGS:STRING=%s' % (' '.join(cxx_flags)),
])
# disable due to compiler / config errors:
options.extend([
'-DTrilinos_ENABLE_SEACAS=OFF',
'-DTrilinos_ENABLE_Pike=OFF',
'-DTrilinos_ENABLE_STK=OFF'
])
if sys.platform == 'darwin':
options.extend([
'-DTrilinos_ENABLE_FEI=OFF'
])
with working_dir('spack-build', create=True): with working_dir('spack-build', create=True):
cmake('..', *options) cmake('..', *options)
make() make()
make('install') make('install')
# When trilinos is built with Python, libpytrilinos is included through
# cmake configure files. Namely, Trilinos_LIBRARIES in TrilinosConfig.cmake
# contains pytrilinos. This leads to a run-time error:
# Symbol not found: _PyBool_Type
# and prevents Trilinos to be used in any C++ code, which links executable
# against the libraries listed in Trilinos_LIBRARIES.
# See https://github.com/Homebrew/homebrew-science/issues/2148#issuecomment-103614509
# A workaround it to remove PyTrilinos from the COMPONENTS_LIST :
if '+python' in self.spec:
filter_file(r'(SET\(COMPONENTS_LIST.*)(PyTrilinos;)(.*)', (r'\1\3'), '%s/cmake/Trilinos/TrilinosConfig.cmake' % prefix.lib)
# The shared libraries are not installed correctly on Darwin; correct this
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)

View file

@ -0,0 +1,12 @@
diff --git a/cmake/TPLs/FindTPLUMFPACK.cmake b/cmake/TPLs/FindTPLUMFPACK.cmake
index 963eb71..998cd02 100644
--- a/cmake/TPLs/FindTPLUMFPACK.cmake
+++ b/cmake/TPLs/FindTPLUMFPACK.cmake
@@ -55,6 +55,6 @@
TRIBITS_TPL_FIND_INCLUDE_DIRS_AND_LIBRARIES( UMFPACK
- REQUIRED_HEADERS umfpack.h amd.h UFconfig.h
+ REQUIRED_HEADERS umfpack.h amd.h SuiteSparse_config.h
REQUIRED_LIBS_NAMES umfpack amd
)