summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPeter Scheibel <scheibel1@llnl.gov>2015-10-12 19:09:11 -0700
committerPeter Scheibel <scheibel1@llnl.gov>2015-10-12 19:18:31 -0700
commitb7249d66b3b47f710ddbb1719f433b507322b5a3 (patch)
tree74f997d0f21e4b623e60316926c98280eee36e82 /lib
parent58c53738900db52615062387165e1e8ba9801362 (diff)
downloadspack-b7249d66b3b47f710ddbb1719f433b507322b5a3.tar.gz
spack-b7249d66b3b47f710ddbb1719f433b507322b5a3.tar.bz2
spack-b7249d66b3b47f710ddbb1719f433b507322b5a3.tar.xz
spack-b7249d66b3b47f710ddbb1719f433b507322b5a3.zip
Adding command testinstall. See "spack testinstall -h" for documentation.
Still need to add output formatting (in a commonly parse-able format like Junit or TAP). May want to adjust how the build log is accessed in case of a build failure.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/cmd/testinstall.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/lib/spack/spack/cmd/testinstall.py b/lib/spack/spack/cmd/testinstall.py
new file mode 100644
index 0000000000..d3a2cae3c2
--- /dev/null
+++ b/lib/spack/spack/cmd/testinstall.py
@@ -0,0 +1,129 @@
+##############################################################################
+# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://scalability-llnl.github.io/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License (as published by
+# the Free Software Foundation) version 2.1 dated February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from external import argparse
+import xml.etree.ElementTree as ET
+
+import llnl.util.tty as tty
+from llnl.util.filesystem import *
+
+import spack
+import spack.cmd
+
+description = "Build and install packages"
+
+def setup_parser(subparser):
+ #subparser.add_argument(
+ # '-i', '--ignore-dependencies', action='store_true', dest='ignore_deps',
+ # help="Do not try to install dependencies of requested packages.")
+
+ subparser.add_argument(
+ '-j', '--jobs', action='store', type=int,
+ help="Explicitly set number of make jobs. Default is #cpus.")
+
+ #always false for test
+ #subparser.add_argument(
+ # '--keep-prefix', action='store_true', dest='keep_prefix',
+ # help="Don't remove the install prefix if installation fails.")
+
+ #always true for test
+ #subparser.add_argument(
+ # '--keep-stage', action='store_true', dest='keep_stage',
+ # help="Don't remove the build stage if installation succeeds.")
+
+ subparser.add_argument(
+ '-n', '--no-checksum', action='store_true', dest='no_checksum',
+ help="Do not check packages against checksum")
+ subparser.add_argument(
+ '-v', '--verbose', action='store_true', dest='verbose',
+ help="Display verbose build output while installing.")
+
+ #subparser.add_argument(
+ # '--fake', action='store_true', dest='fake',
+ # help="Fake install. Just remove the prefix and touch a fake file in it.")
+
+ subparser.add_argument(
+ 'outputdir', help="test output goes in this directory, 1 file per package")
+
+ subparser.add_argument(
+ 'packages', nargs=argparse.REMAINDER, help="specs of packages to install")
+
+
+class JunitTestResult(object):
+ def __init__(self):
+ self.root = Element('testsuite')
+ self.tests = []
+
+ def addTest(self, identifier, passed=True, output=None):
+ self.tests.append((identifier, passed, output))
+
+ def output(self):
+ self.root.set('tests', '{0}'.format(len(self.tests)))
+
+
+def testinstall(parser, args):
+ if not args.packages:
+ tty.die("install requires at least one package argument")
+
+ if args.jobs is not None:
+ if args.jobs <= 0:
+ tty.die("The -j option must be a positive integer!")
+
+ if args.no_checksum:
+ spack.do_checksum = False # TODO: remove this global.
+
+ print "Output to:", args.outputdir
+
+ specs = spack.cmd.parse_specs(args.packages, concretize=True)
+ try:
+ for spec in specs:
+ #import pdb; pdb.set_trace()
+ package = spack.db.get(spec)
+ package.do_install(
+ keep_prefix=False,
+ keep_stage=False,
+ ignore_deps=False,
+ make_jobs=args.jobs,
+ verbose=args.verbose,
+ fake=False)
+ finally:
+ for spec in specs:
+ package = spack.db.get(spec)
+ #import pdb; pdb.set_trace()
+
+ print spec.name
+ print spec.version
+ print spec.dag_hash()
+
+ if package.installed:
+ installLog = spack.install_layout.build_log_path(spec)
+ else:
+ #TODO: search recursively under stage.path instead of only within
+ # stage.source_path
+ installLog = join_path(package.stage.source_path, 'spack-build.out')
+
+ with open(installLog, 'rb') as F:
+ for line in F.readlines()[:10]:
+ print "\t{0}".format(line.strip())
+