spack setup : work as in documentation for openjpeg

This commit is contained in:
alalazo 2016-07-20 22:27:01 +02:00
parent 40cb314638
commit b92deda41b
2 changed files with 82 additions and 120 deletions

View file

@ -22,19 +22,22 @@
# along with this program; if not, write to the Free Software Foundation, # along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
import sys
import os
import argparse import argparse
import os
import string
import sys
import llnl.util.tty as tty import llnl.util.tty as tty
import spack import spack
import spack.cmd import spack.cmd
from spack import which
from spack.cmd.edit import edit_package from spack.cmd.edit import edit_package
from spack.stage import DIYStage from spack.stage import DIYStage
from llnl.util.filesystem import set_executable
description = "Create a configuration script and module, but don't build." description = "Create a configuration script and module, but don't build."
def setup_parser(subparser): def setup_parser(subparser):
subparser.add_argument( subparser.add_argument(
'-i', '--ignore-dependencies', action='store_true', dest='ignore_deps', '-i', '--ignore-dependencies', action='store_true', dest='ignore_deps',
@ -47,6 +50,75 @@ def setup_parser(subparser):
help="specs to use for install. Must contain package AND version.") help="specs to use for install. Must contain package AND version.")
def spack_transitive_include_path():
return ';'.join(
os.path.join(dep, 'include')
for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep)
)
def write_spconfig(package):
spec = package.spec
prefix = spec.prefix
# Set-up the environment
spack.build_environment.setup_package(package)
cmd = [str(which('cmake'))] + package.std_cmake_args + package.cmake_args()
env = dict()
paths = os.environ['PATH'].split(':')
paths = [item for item in paths if 'spack/env' not in item]
env['PATH'] = ':'.join(paths)
env['SPACK_TRANSITIVE_INCLUDE_PATH'] = spack_transitive_include_path()
env['CMAKE_PREFIX_PATH'] = os.environ['CMAKE_PREFIX_PATH']
env['CC'] = os.environ['SPACK_CC']
env['CXX'] = os.environ['SPACK_CXX']
env['FC'] = os.environ['SPACK_FC']
setup_fname = 'spconfig.py'
with open(setup_fname, 'w') as fout:
fout.write(
r"""#!%s
#
import sys
import os
import subprocess
def cmdlist(str):
return list(x.strip().replace("'",'') for x in str.split('\n') if x)
env = dict(os.environ)
""" % sys.executable)
env_vars = sorted(list(env.keys()))
for name in env_vars:
val = env[name]
if string.find(name, 'PATH') < 0:
fout.write('env[%s] = %s\n' % (repr(name), repr(val)))
else:
if name == 'SPACK_TRANSITIVE_INCLUDE_PATH':
sep = ';'
else:
sep = ':'
fout.write(
'env[%s] = "%s".join(cmdlist("""\n' % (repr(name), sep))
for part in string.split(val, sep):
fout.write(' %s\n' % part)
fout.write('"""))\n')
fout.write(
"env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n")
fout.write('\ncmd = cmdlist("""\n')
fout.write('%s\n' % cmd[0])
for arg in cmd[1:]:
fout.write(' %s\n' % arg)
fout.write('""") + sys.argv[1:]\n')
fout.write('\nproc = subprocess.Popen(cmd, env=env)\nproc.wait()\n')
set_executable(setup_fname)
def setup(self, args): def setup(self, args):
if not args.spec: if not args.spec:
tty.die("spack setup requires a package spec argument.") tty.die("spack setup requires a package spec argument.")
@ -70,7 +142,8 @@ def setup(self, args):
return return
if not spec.versions.concrete: if not spec.versions.concrete:
tty.die("spack setup spec must have a single, concrete version. Did you forget a package version number?") tty.die(
"spack setup spec must have a single, concrete version. Did you forget a package version number?")
spec.concretize() spec.concretize()
package = spack.repo.get(spec) package = spack.repo.get(spec)
@ -83,9 +156,8 @@ def setup(self, args):
# TODO: make this an argument, not a global. # TODO: make this an argument, not a global.
spack.do_checksum = False spack.do_checksum = False
package.do_install( if not isinstance(package, spack.CMakePackage):
keep_prefix=True, # Don't remove install directory, even if you think you should raise RuntimeError(
ignore_deps=args.ignore_deps, 'Support for {0} not yet implemented'.format(type(package)))
verbose=args.verbose,
keep_stage=True, # don't remove source dir for SETUP. write_spconfig(package)
install_phases = set(['setup', 'provenance']))

View file

@ -1822,116 +1822,6 @@ def _hms(seconds):
parts.append("%.2fs" % s) parts.append("%.2fs" % s)
return ' '.join(parts) return ' '.join(parts)
# FIXME : remove this after checking that set_executable works the same way
# stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python
#def make_executable(path):
# mode = os.stat(path).st_mode
# mode |= (mode & 0o444) >> 2 # copy R bits to X
# os.chmod(path, mode)
# class CMakePackage(PackageBase):
# phases = ['configure', 'build', 'install', 'provenance']
#
# def make_make(self):
# import multiprocessing
# # number of jobs spack will to build with.
# jobs = multiprocessing.cpu_count()
# if not self.parallel:
# jobs = 1
# elif self.make_jobs:
# jobs = self.make_jobs
#
# make = spack.build_environment.MakeExecutable('make', jobs)
# return make
#
# def configure_args(self):
# """Returns package-specific arguments to be provided to the configure command."""
# return list()
#
# def configure_env(self):
# """Returns package-specific environment under which the configure command should be run."""
# # FIXME : Why not EnvironmentModules and the hooks that PackageBase already provides ?
# return dict()
#
# def spack_transitive_include_path(self):
# return ';'.join(
# os.path.join(dep, 'include')
# for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep)
# )
#
# def setup(self, spec, prefix):
# cmd = [str(which('cmake'))] + \
# spack.build_environment.get_std_cmake_args(self) + \
# ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'],
# '-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'],
# '-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'],
# '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']] + \
# self.configure_args()
#
# env = dict()
# env['PATH'] = os.environ['PATH']
# env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path()
# env['CMAKE_PREFIX_PATH'] = os.environ['CMAKE_PREFIX_PATH']
#
# setup_fname = 'spconfig.py'
# with open(setup_fname, 'w') as fout:
# fout.write(\
# r"""#!%s
# #
#
# import sys
# import os
# import subprocess
#
# def cmdlist(str):
# return list(x.strip().replace("'",'') for x in str.split('\n') if x)
# env = dict(os.environ)
# """ % sys.executable)
#
# env_vars = sorted(list(env.keys()))
# for name in env_vars:
# val = env[name]
# if string.find(name, 'PATH') < 0:
# fout.write('env[%s] = %s\n' % (repr(name),repr(val)))
# else:
# if name == 'SPACK_TRANSITIVE_INCLUDE_PATH':
# sep = ';'
# else:
# sep = ':'
#
# fout.write('env[%s] = "%s".join(cmdlist("""\n' % (repr(name),sep))
# for part in string.split(val, sep):
# fout.write(' %s\n' % part)
# fout.write('"""))\n')
#
# fout.write("env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n")
# fout.write('\ncmd = cmdlist("""\n')
# fout.write('%s\n' % cmd[0])
# for arg in cmd[1:]:
# fout.write(' %s\n' % arg)
# fout.write('""") + sys.argv[1:]\n')
# fout.write('\nproc = subprocess.Popen(cmd, env=env)\nproc.wait()\n')
# set_executable(setup_fname)
#
# def configure(self, spec, prefix):
# cmake = which('cmake')
# with working_dir(self.build_directory, create=True):
# os.environ.update(self.configure_env())
# os.environ['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path()
# options = self.configure_args() + spack.build_environment.get_std_cmake_args(self)
# cmake(self.source_directory, *options)
#
# def build(self, spec, prefix):
# make = self.make_make()
# with working_dir(self.build_directory, create=False):
# make()
#
# def install(self, spec, prefix):
# make = self.make_make()
# with working_dir(self.build_directory, create=False):
# make('install')
class FetchError(spack.error.SpackError): class FetchError(spack.error.SpackError):
"""Raised when something goes wrong during fetch.""" """Raised when something goes wrong during fetch."""